井字棋人机对弈的实现
以3*3的二维数组存放棋盘,输入两个数字表示要下的位置,然后人机对弈;
1.划分模块
(1). 输出模块
输出棋盘:不断的清屏、打印、清屏、打印以实现动画式的效果( 一般都会把清除光标带上的 )。
输出结果:谁输谁赢。
(2).判断模块
此处分为两个模块
其一用来判断所选位置是否可以下(即是否已经存在棋子),
其二是判断当前棋面是否有输赢,或平局。
(3).电脑下棋模块
此模块最为重要,要考虑到各种情况的应对措施,思路下面具体说;
(4).主函数
把问题分小了,划分为各个模块,用子函数实现,主函数相对来说就简单了。
2.简单思路介绍
输出棋盘的操作都带着清屏 打印 (cls、print);
判断就返回两个值表示是否即可,这些都不是重点;
重点是这里,人机博弈:首先有个优先度,
第一: 要赢;
第二:在实在不能赢的情况下,不能输,最多为平局;
第三:如果以上都没有,就随机下;
3.代码实现及详细思路
就按源代码中的顺序写了,思路自己对应一下吧。
1.去光标
1 // 去光标
2 void qgb ( )
3 {
4 HANDLE handle = GetStdHandle ( STD_OUTPUT_HANDLE );
5 CONSOLE_CURSOR_INFO CursorInfo;
6 GetConsoleCursorInfo ( handle, &CursorInfo );
7 CursorInfo.bVisible = false;
8 SetConsoleCursorInfo ( handle, &CursorInfo );
9 }
2.判断所选位置是否可以下子
1 // 判断所选位置是否可下 不可下返回-1 可以下返回0
2 int IsNULL ( int array[3][3], int x, int y )
3 {
4 if ( array[x][y] == 0 ) return 0;
5 return -1;
6 }
3.打印棋盘
不断的清屏 打印 清屏 打印;
1 // 打印棋盘
2 void Print ( int array[3][3] )
3 {
4 system( "cls" );
5 int i, j;
6 printf ( "\n\n\t井 字 棋\n" );
7 for ( i = 0; i < 3; i ++ )
8 {
9 printf ( "\n\t+-+-+-+\n\t|" );
10 for ( j = 0; j < 3; j ++ )
11 {
12 if ( array[i][j] == 0 ) printf( " " );
13 if ( array[i][j] == 1 ) printf( "X" );
14 if ( array[i][j] == -1 ) printf( "O" );
15 printf( "|" );
16 }
17 }
18 printf ( "\n\t+-+-+-+\n\n" );
19 }
4.电脑下棋部分
其一考虑赢,即有一线有两个自己的棋子,则优先放在第三个的位置。
其二考虑不输,即不然对方赢,一条线上有两个对方棋子,则下在第三个位置堵住。
其三随机下。
重点:一定要按该思路的顺序 先考虑赢,再考虑不输,最后考虑随机,即使你分 横竖撇捺的位置来实现的,最后也得等赢的情况全部考虑完在考虑其他情况,我刚开始就傻逼了。
代码:
1 // 电脑下子
2 int GO ( int array[3][3] )
3 {
4 int i, t;
5 int k;
6 for ( i = 0; i < 3; i ++ )
7 {
8 t = array[i][0] + array[i][1] + array[i][2];
9 if ( t == -2 )
10 {
11 for ( k = 0; k < 3; k ++ )
12 {
13 if ( array[i][k] == 0 )
14 {
15 array[i][k] = -1;
16 return 0;
17 }
18
19 }
20 }
21 }
22 for ( i = 0; i < 3; i ++ )
23 {
24 t = array[0][i] + array[1][i] + array[2][i];
25 if ( t == -2 )
26 {
27 for ( k = 0; k < 3; k ++ )
28 {
29 if ( array[k][i] == 0 )
30 {
31 array[k][i] = -1;
32 return 0;
33 }
34 }
35 }
36 }
37 int j = 0; t = 0;
38 for ( i = 0; i < 3; i ++ )
39 {
40 j += array[i][i];
41 t += array[i][2-i];
42 }
43 if ( t == -2 )
44 {
45 for ( k = 0; k < 3; k ++ )
46 {
47 if ( array[k][2-k] == 0 )
48 {
49 array[k][2-k] = -1;
50 return 0;
51 }
52 }
53 }
54 if ( j == -2 )
55 {
56 for ( k = 0; k < 3; k ++ )
57 {
58 if ( array[k][k] == 0 )
59 {
60 array[k][k] = -1;
61 return 0;
62 }
63 }
64 }
65
66
67
68 for ( i = 0; i < 3; i ++ )
69 {
70 t = array[i][0] + array[i][1] + array[i][2];
71 if ( t == 2 )
72 {
73 for ( k = 0; k < 3; k ++ )
74 {
75 if ( array[i][k] == 0 )
76 {
77 array[i][k] = -1;
78 return 0;
79 }
80
81 }
82 }
83 }
84 for ( i = 0; i < 3; i ++ )
85 {
86 t = array[0][i] + array[1][i] + array[2][i];
87 if ( t == 2 )
88 {
89 for ( k = 0; k < 3; k ++ )
90 {
91 if ( array[k][i] == 0 )
92 {
93 array[k][i] = -1;
94 return 0;
95 }
96 }
97 }
98 }
99 j = 0; t = 0;
100 for ( i = 0; i < 3; i ++ )
101 {
102 j += array[i][i];
103 t += array[i][2-i];
104 }
105 if ( t == 2 )
106 {
107 for ( k = 0; k < 3; k ++ )
108 {
109 if ( array[k][2-k] == 0 )
110 {
111 array[k][2-k] = -1;
112 return 0;
113 }
114 }
115 }
116 if ( j == 2 )
117 {
118 for ( k = 0; k < 3; k ++ )
119 {
120 if ( array[k][k] == 0 )
121 {
122 array[k][k] = -1;
123 return 0;
124 }
125 }
126 }
127
128
129 while ( 1 )
130 {
131 srand ( time ( 0 ) );
132 i = rand ( ) % 3;
133 j = rand ( ) % 3;
134 if ( IsNULL ( array, i, j ) == 0 )
135 {
136 array[i][j] = -1;
137 break;
138 }
139 }
140 return 0;
141 }
5.检查胜负情况
代码:
1 // 平局返回0;正方胜返回1;负反胜利返回-1;否则返回6;
2 int Check ( int array[3][3] )
3 {
4 int i, t;
5 for ( i = 0; i < 3; i ++ )
6 {
7 t = array[i][0] + array[i][1] + array[i][2];
8 if ( t == -3 ) return -1;
9 if ( t == 3 ) return 1;
10 }
11 for ( i = 0; i < 3; i ++ )
12 {
13 t = array[0][i] + array[1][i] + array[2][i];
14 if ( t == -3 ) return -1;
15 if ( t == 3 ) return 1;
16 }
17 int j = 0; t = 0;
18 for ( i = 0; i < 3; i ++ )
19 {
20 j += array[i][i];
21 t += array[i][2-i];
22 }
23 if ( t == -3 || j == -3 ) return -1;
24 if ( t == 3 || j == 3 ) return 1;
25 for ( i = 0; i < 3; i ++ )
26 {
27 for ( j = 0; j < 3; j ++ )
28 {
29 if ( array[i][j] == 0 ) return 6;
30 }
31 }
32 return 0;
33 }
6.我另外加的一个 集Check 和Print 一起的函数,用来输出结果;
代码:
1 int CP ( int array[3][3] )
2 {
3 int t = Check ( array );
4 Print ( array );
5 if ( t == 0 )
6 {
7 printf ( "\t 平局!");
8 system ( "pause" );
9 return 0;
10 }
11 if ( t == 1 )
12 {
13 printf ( "\t 恭喜你 赢了! ");
14 system ( "pause" );
15 return 0;
16 }
17 if ( t == -1 )
18 {
19 printf ( "\t 很抱歉 输了! ");
20 system ( "pause" );
21 return 0;
22 }
23 return -1;
24 }
7.主函数
代码:
1 int main ( )
2 {
3 system ( "title 井字棋小游戏--BY:nanshao_zz" );
4 qgb ( );
5 int array[3][3];
6 memset ( array, 0, sizeof ( array ) );
7 Print ( array );
8 int x, y, t;
9 while ( 1 )
10 {
11 scanf ( "%d %d", &x, &y );
12 x --;
13 y --;
14 if ( x > 2 || y > 2 || x < 0 || y < 0 )
15 {
16 printf( "\t输入范围: 1-3! " );
17 continue;
18 }
19 if ( IsNULL ( array, x, y ) == -1 )
20 {
21 printf ( "所选位置已存在! " );
22 continue;
23 }
24 array[x][y] = 1;
25 t = CP ( array );
26 if ( t == 0 ) return 0;
27 GO ( array );
28 t = CP ( array );
29 if ( t == 0 ) return 0;
30 }
31 return 0;
32 }
全部代码:
1 #include "algorithm"
2 #include "windows.h"
3 #include "iostream"
4 #include "stdlib.h"
5 #include "string.h"
6 #include "stdio.h"
7 #include "vector"
8 #include "math.h"
9 #include "time.h"
10 #include "string"
11 #include "map"
12
13 using namespace std;
14
15 // 去光标
16 void qgb ( )
17 {
18 HANDLE handle = GetStdHandle ( STD_OUTPUT_HANDLE );
19 CONSOLE_CURSOR_INFO CursorInfo;
20 GetConsoleCursorInfo ( handle, &CursorInfo );
21 CursorInfo.bVisible = false;
22 SetConsoleCursorInfo ( handle, &CursorInfo );
23 }
24
25 // 判断所选位置是否可下 不可下返回-1 可以下返回0
26 int IsNULL ( int array[3][3], int x, int y )
27 {
28 if ( array[x][y] == 0 ) return 0;
29 return -1;
30 }
31
32 // 打印棋盘
33 void Print ( int array[3][3] )
34 {
35 system( "cls" );
36 int i, j;
37 printf ( "\n\n\t井 字 棋\n" );
38 for ( i = 0; i < 3; i ++ )
39 {
40 printf ( "\n\t+-+-+-+\n\t|" );
41 for ( j = 0; j < 3; j ++ )
42 {
43 if ( array[i][j] == 0 ) printf( " " );
44 if ( array[i][j] == 1 ) printf( "X" );
45 if ( array[i][j] == -1 ) printf( "O" );
46 printf( "|" );
47 }
48 }
49 printf ( "\n\t+-+-+-+\n\n" );
50 }
51
52 // 电脑下子
53 int GO ( int array[3][3] )
54 {
55 int i, t;
56 int k;
57 for ( i = 0; i < 3; i ++ )
58 {
59 t = array[i][0] + array[i][1] + array[i][2];
60 if ( t == -2 )
61 {
62 for ( k = 0; k < 3; k ++ )
63 {
64 if ( array[i][k] == 0 )
65 {
66 array[i][k] = -1;
67 return 0;
68 }
69
70 }
71 }
72 }
73 for ( i = 0; i < 3; i ++ )
74 {
75 t = array[0][i] + array[1][i] + array[2][i];
76 if ( t == -2 )
77 {
78 for ( k = 0; k < 3; k ++ )
79 {
80 if ( array[k][i] == 0 )
81 {
82 array[k][i] = -1;
83 return 0;
84 }
85 }
86 }
87 }
88 int j = 0; t = 0;
89 for ( i = 0; i < 3; i ++ )
90 {
91 j += array[i][i];
92 t += array[i][2-i];
93 }
94 if ( t == -2 )
95 {
96 for ( k = 0; k < 3; k ++ )
97 {
98 if ( array[k][2-k] == 0 )
99 {
100 array[k][2-k] = -1;
101 return 0;
102 }
103 }
104 }
105 if ( j == -2 )
106 {
107 for ( k = 0; k < 3; k ++ )
108 {
109 if ( array[k][k] == 0 )
110 {
111 array[k][k] = -1;
112 return 0;
113 }
114 }
115 }
116
117
118
119 for ( i = 0; i < 3; i ++ )
120 {
121 t = array[i][0] + array[i][1] + array[i][2];
122 if ( t == 2 )
123 {
124 for ( k = 0; k < 3; k ++ )
125 {
126 if ( array[i][k] == 0 )
127 {
128 array[i][k] = -1;
129 return 0;
130 }
131
132 }
133 }
134 }
135 for ( i = 0; i < 3; i ++ )
136 {
137 t = array[0][i] + array[1][i] + array[2][i];
138 if ( t == 2 )
139 {
140 for ( k = 0; k < 3; k ++ )
141 {
142 if ( array[k][i] == 0 )
143 {
144 array[k][i] = -1;
145 return 0;
146 }
147 }
148 }
149 }
150 j = 0; t = 0;
151 for ( i = 0; i < 3; i ++ )
152 {
153 j += array[i][i];
154 t += array[i][2-i];
155 }
156 if ( t == 2 )
157 {
158 for ( k = 0; k < 3; k ++ )
159 {
160 if ( array[k][2-k] == 0 )
161 {
162 array[k][2-k] = -1;
163 return 0;
164 }
165 }
166 }
167 if ( j == 2 )
168 {
169 for ( k = 0; k < 3; k ++ )
170 {
171 if ( array[k][k] == 0 )
172 {
173 array[k][k] = -1;
174 return 0;
175 }
176 }
177 }
178
179
180 while ( 1 )
181 {
182 srand ( time ( 0 ) );
183 i = rand ( ) % 3;
184 j = rand ( ) % 3;
185 if ( IsNULL ( array, i, j ) == 0 )
186 {
187 array[i][j] = -1;
188 break;
189 }
190 }
191 return 0;
192 }
193
194 // 平局返回0;正方胜返回1;负反胜利返回-1;否则返回6;
195 int Check ( int array[3][3] )
196 {
197 int i, t;
198 for ( i = 0; i < 3; i ++ )
199 {
200 t = array[i][0] + array[i][1] + array[i][2];
201 if ( t == -3 ) return -1;
202 if ( t == 3 ) return 1;
203 }
204 for ( i = 0; i < 3; i ++ )
205 {
206 t = array[0][i] + array[1][i] + array[2][i];
207 if ( t == -3 ) return -1;
208 if ( t == 3 ) return 1;
209 }
210 int j = 0; t = 0;
211 for ( i = 0; i < 3; i ++ )
212 {
213 j += array[i][i];
214 t += array[i][2-i];
215 }
216 if ( t == -3 || j == -3 ) return -1;
217 if ( t == 3 || j == 3 ) return 1;
218 for ( i = 0; i < 3; i ++ )
219 {
220 for ( j = 0; j < 3; j ++ )
221 {
222 if ( array[i][j] == 0 ) return 6;
223 }
224 }
225 return 0;
226 }
227
228
229 int CP ( int array[3][3] )
230 {
231 int t = Check ( array );
232 Print ( array );
233 if ( t == 0 )
234 {
235 printf ( "\t 平局!");
236 system ( "pause" );
237 return 0;
238 }
239 if ( t == 1 )
240 {
241 printf ( "\t 恭喜你 赢了! ");
242 system ( "pause" );
243 return 0;
244 }
245 if ( t == -1 )
246 {
247 printf ( "\t 很抱歉 输了! ");
248 system ( "pause" );
249 return 0;
250 }
251 return -1;
252 }
253
254 int main ( )
255 {
256 system ( "title 井字棋小游戏--BY:nanshao_zz" );
257 qgb ( );
258 int array[3][3];
259 memset ( array, 0, sizeof ( array ) );
260 Print ( array );
261 int x, y, t;
262 while ( 1 )
263 {
264 scanf ( "%d %d", &x, &y );
265 x --;
266 y --;
267 if ( x > 2 || y > 2 || x < 0 || y < 0 )
268 {
269 printf( "\t输入范围: 1-3! " );
270 continue;
271 }
272 if ( IsNULL ( array, x, y ) == -1 )
273 {
274 printf ( "所选位置已存在! " );
275 continue;
276 }
277 array[x][y] = 1;
278 t = CP ( array );
279 if ( t == 0 ) return 0;
280 GO ( array );
281 t = CP ( array );
282 if ( t == 0 ) return 0;
283 }
284 return 0;
285 }
View Code
希望可以帮到正在学这个的你,欢迎批评指正!