1 #include
2 #include
3
4 const int ROW = 3;5 const int COL = 3;6 intchessboard[ROW][COL];7 intscore[ROW][COL];8
9 voidInitmap();10 void Showmap(); //打印棋局
11 bool isWin(); //判断是否有一方获胜
12 bool isFull(); //判断棋盘是否为满
13 void PcPlay(); //电脑下棋
14 void HumanPlay(); //人下棋
15
16 intmain()17 {18 Initmap();19 Showmap();20 while ((!isFull()) && (!isWin()))21 {22 HumanPlay();23 system("cls");24 Showmap();25 if(isWin())26 break;27
28 Sleep(500); //模拟实际过程,让电脑慢点,hh
29 PcPlay();30 system("cls");31 Showmap();32 }33
34 if(isFull())35 printf("\n\n平局\n");36
37 system("pause");38 return 0;39 }40
41 voidInitmap()42 {43 for (int i = 0; i < ROW; i++)44 for (int j = 0; j < COL; j++)45 chessboard[i][j] = 1;46 }47
48 voidShowmap()49 {50 for (int i = 0; i < ROW; i++)51 {52 for (int j = 0; j < COL; j++)53 {54 if (chessboard[i][j] == 1) //"1"代表空
55 printf("□");56 if (chessboard[i][j] == 2) //"2"代表人
57 printf("■");58 if (chessboard[i][j] == 5) //"5"代表电脑
59 printf("●");60 }61 printf("\n");62 }63 }64
65 boolisWin()66 {67 int sum = 0;68 for (int i = 0; i < ROW; i++) //对每行判断是否获胜
69 {70 for (int j = 0; j < COL; j++)71 sum +=chessboard[i][j];72
73 if (sum == 6)74 {75 printf("人获胜!\n");76 return true;77 }78 if (sum == 15)79 {80 printf("电脑获胜!\n");81 return true;82 }83 sum = 0;84 }85
86 for (int j = 0; j < ROW; j++) //对每列判断是否获胜
87 {88 for (int i = 0; i < COL; i++)89 sum +=chessboard[i][j];90
91 if (sum == 6)92 {93 printf("人获胜!\n");94 return true;95 }96 if (sum == 15)97 {98 printf("电脑获胜!\n");99 return true;100 }101 sum = 0;102 }103
104 for (int i = 0; i < ROW; i++) //对对角线判断是否获胜
105 sum +=chessboard[i][i];106 if (sum == 6)107 {108 printf("人获胜!\n");109 return true;110 }111 if (sum == 15)112 {113 printf("电脑获胜!\n");114 return true;115 }116
117 sum = 0;118 for (int i = 0; i < ROW; i++) //对反对角线判断是否获胜
119 sum += chessboard[i][2 -i];120 if (sum == 6)121 {122 printf("人获胜!\n");123 return true;124 }125 if (sum == 15)126 {127 printf("电脑获胜!\n");128 return true;129 }130
131 return false;132 }133
134 boolisFull()135 {136 for (int i = 0; i < ROW; i++)137 for (int j = 0; j < COL; j++)138 if (chessboard[i][j] == 1)139 return false;140 return true;141 }142
143 voidHumanPlay()144 {145 intx, y;146 printf("请输入棋子的横坐标X:");147 scanf_s("%d", &x);148 printf("请输入棋子的纵坐标Y:");149 scanf_s("%d", &y);150
151 while (x < 1 || x>3 || y < 1 || y>3)152 {153 printf("\n请正确输入!\n");154 printf("x,y均属于1~3\n\n");155
156 printf("请输入棋子的横坐标X:");157 scanf_s("%d", &x);158 printf("请输入棋子的纵坐标Y:");159 scanf_s("%d", &y);160 }161
162 while (chessboard[3 - y][x - 1] != 1)163 {164 printf("\n\n该位置已被占用!\n");165 printf("请选择正确的位置\n\n");166 Sleep(1000);167
168 printf("\n请输入棋子的横坐标X:");169 scanf_s("%d", &x);170 printf("请输入棋子的纵坐标Y:");171 scanf_s("%d", &y);172 }173
174 chessboard[3 - y][x - 1] = 2;175 }176
177 voidPcPlay()178 {179 int sum = 0;180 for (int i = 0; i < ROW; i++)181 for (int j = 0; j < COL; j++)182 score[i][j] = 0;183
184 //对每行进行分数统计
185 for (int i = 0; i < ROW; i++)186 {187 for (int j = 0; j < COL; j++)188 sum +=chessboard[i][j];189
190 switch(sum)191 {192 case 3: //1+1+1;重要性:最低;权重:1
193 for (int k = 0; k < COL; k++)194 {195 if (chessboard[i][k] == 1)196 score[i][k] += 1;197 }198 break;199 case 4: //1+1+2;重要性:次低;权重:10
200 for (int k = 0; k < COL; k++)201 {202 if (chessboard[i][k] == 1)203 score[i][k] += 10;204 }205 break;206 case 8: //1+2+5;重要性:较低,权值50
207 for (int k = 0; k < COL; k++)208 {209 if (chessboard[i][k] == 1)210 score[i][k] += 50;211 }212 break;213 case 7: //1+1+5;重要性:较高;权重:200
214 for (int k = 0; k < COL; k++)215 {216 if (chessboard[i][k] == 1)217 score[i][k] += 200; //把行列的重要性比对角线高
218 }219 break;220 case 5: //1+2+2;重要性:次高;权重:500
221 for (int k = 0; k < COL; k++)222 {223 if (chessboard[i][k] == 1)224 score[i][k] += 500;225 }226 break;227 case 11: //1+5+5;重要性:最高;权重:1000
228 for (int k = 0; k < COL; k++)229 {230 if (chessboard[i][k] == 1)231 score[i][k] += 1000;232 }233 break;234 }235 sum = 0;236 }237
238 //对每列进行分数统计
239 for (int j = 0; j < COL; j++)240 {241 for (int i = 0; i < ROW; i++)242 sum +=chessboard[i][j];243
244 switch(sum)245 {246 case 3:247 for (int k = 0; k < COL; k++)248 {249 if (chessboard[k][j] == 1)250 score[k][j] += 1;251 }252 break;253 case 4:254 for (int k = 0; k < COL; k++)255 {256 if (chessboard[k][j] == 1)257 score[k][j] += 10;258 }259 break;260 case 8:261 for (int k = 0; k <
262 COL; k++)263 {264 if (chessboard[k][j] == 1)265 score[k][j] += 50;266 }267 break;268 case 7:269 for (int k = 0; k < COL; k++)270 {271 if (chessboard[k][j] == 1) //1+1+5;重要性:较高;权重:200
272 score[k][j] += 200;273 }274 break;275 case 5:276 for (int k = 0; k < COL; k++)277 {278 if (chessboard[k][j] == 1)279 score[k][j] += 500;280 }281 break;282 case 11:283 for (int k = 0; k < COL; k++)284 {285 if (chessboard[k][j] == 1)286 score[k][j] += 1000;287 }288 break;289 }290 sum = 0;291 }292
293 //对对角线进行分数统计
294 for (int i = 0; i < ROW; i++)295 sum +=chessboard[i][i];296 switch(sum)297 {298 case 3:299 for (int i = 0; i < COL; i++)300 {301 if (chessboard[i][i] == 1)302 score[i][i] += 1;303 }304 break;305 case 4:306 for (int i = 0; i < COL; i++)307 {308 if (chessboard[i][i] == 1)309 score[i][i] += 10;310 }311 break;312 case 8:313 for (int i = 0; i < COL; i++)314 {315 if (chessboard[i][i] == 1)316 score[i][i] += 50;317 }318 break;319 case 7: //1+1+5;权重:100
320 for (int i = 0; i < COL; i++)321 {322 if (chessboard[i][i] == 1)323 score[i][i] += 100;324 }325 break;326 case 5:327 for (int i = 0; i < COL; i++)328 {329 if (chessboard[i][i] == 1)330 score[i][i] += 500;331 }332 break;333 case 11:334 for (int i = 0; i < COL; i++)335 {336 if (chessboard[i][i] == 1)337 score[i][i] += 1000;338 }339 break;340 }341
342 //对反对角线进行分数统计
343 sum = 0;344 for (int i = 0; i < ROW; i++)345 sum += chessboard[i][2 -i];346 switch(sum)347 {348 case 3:349 for (int i = 0; i < COL; i++)350 {351 if (chessboard[i][2 - i] == 1)352 score[i][2 - i] += 1;353 }354 break;355 case 4:356 for (int i = 0; i < COL; i++)357 {358 if (chessboard[i][2 - i] == 1)359 score[i][2 - i] += 10;360 }361 break;362 case 8:363 for (int i = 0; i < COL; i++)364 {365 if (chessboard[i][2 - i] == 1)366 score[i][2 - i] += 50;367 }368 break;369 case 7:370 for (int i = 0; i < COL; i++)371 {372 if (chessboard[i][2 - i] == 1) //1+1+5;权重:100
373 score[i][2 - i] += 100;374 }375 break;376 case 5:377 for (int i = 0; i < COL; i++)378 {379 if (chessboard[i][2 - i] == 1)380 score[i][2 - i] += 500;381 }382 break;383 case 11:384 for (int i = 0; i < COL; i++)385 {386 if (chessboard[i][2 - i] == 1)387 score[i][2 - i] += 1000;388 }389 break;390 }391
392 int maxRow = 0, maxCol = 0;393 for (int i = 0; i < ROW; i++)394 for (int j = 0; j < COL; j++)395 {396 if (score[i][j] >score[maxRow][maxCol])397 {398 maxRow =i;399 maxCol =j;400 }401 }402 chessboard[maxRow][maxCol] = 5;403 }