1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <windows.h> 4 5 #define N 19 6 int pieces[N][N]= {0}; //五子棋盘19*19 7 int flag=1; //状态,0-无子;1-A子;2-B子 8 9 void DrawPanel()//棋盘模块 10 { 11 int count=1; 12 int i,j; 13 system("CLS"); 14 for(i=0; i<=N; i++) //列坐标 15 { 16 if(i==0) 17 { 18 printf(" "); 19 } 20 else 21 { 22 printf("%4d",count); 23 count++; 24 } 25 } 26 printf(" "); 27 count=1; 28 for(i=0; i<N; i++) 29 { 30 for(j=-1; j<N; j++) 31 { 32 if(j==-1)//若是第一列,则输出字符 33 { 34 printf("%2d",count); 35 count++; 36 } 37 else 38 { 39 if(pieces[i][j]==0) 40 { 41 printf(" ."); 42 } 43 else if(pieces[i][j]==1) 44 { 45 printf(" ●"); 46 } 47 else if(pieces[i][j]==2) 48 { 49 printf(" ○"); 50 } 51 } 52 } 53 printf(" "); 54 } 55 56 } 57 58 int ZouQiHang() //下棋模块1 59 { 60 int x; 61 if(flag==1) 62 { 63 printf(" 玩家A●"); 64 } 65 else 66 { 67 printf(" 玩家B○"); 68 } 69 printf(" 请输入要走棋子的行数! "); 70 printf(" x="); 71 scanf("%d",&x); 72 while(x>N-1||x<1) 73 { 74 printf(" error! "); 75 if(flag==1) 76 { 77 printf(" 玩家A●"); 78 } 79 else 80 { 81 printf(" 玩家B○"); 82 } 83 printf(" 请输入要走棋子的行数! "); 84 printf(" x="); 85 scanf("%d",&x); 86 } 87 return x; 88 } 89 90 int ZouQiLie()//下棋模块2 91 { 92 int y; 93 if(flag==1) 94 { 95 printf(" 玩家A●"); 96 } 97 else 98 { 99 printf(" 玩家B○"); 100 } 101 printf(" 请输入要走棋子的列数! "); 102 printf(" y="); 103 scanf("%d",&y); 104 while(y>N-1||y<1) 105 { 106 printf(" error! "); 107 if(flag==1) 108 { 109 printf(" 玩家A●"); 110 } 111 else 112 { 113 printf(" 玩家B○"); 114 } 115 printf(" 请输入要走棋子的列数! "); 116 printf(" y="); 117 scanf("%d",&y); 118 } 119 return y; 120 } 121 122 int Check(int x,int y)//判断输赢模块 123 { 124 //行检查 125 int count=1; 126 int i=x,j=y; 127 j++; 128 while(j<N&&count<5)//自此向右 129 { 130 if(pieces[i][j]==pieces[x][y]) 131 { 132 count++; 133 } 134 else 135 { 136 break; 137 } 138 j++; 139 } 140 j=y; 141 j--; 142 while(j>=0&&count<5)//自此向左 143 { 144 if(pieces[i][j]==pieces[x][y]) 145 { 146 count++; 147 } 148 else 149 { 150 break; 151 } 152 j--; 153 } 154 if(count==5)//存在5子连成连续一条线 155 { 156 return pieces[x][y]; 157 } 158 159 //列检查 160 i=x; 161 j=y; 162 count=1; 163 i=i+1; 164 while(i<N&&count<5)//自此向下 165 { 166 if(pieces[i][j]==pieces[x][y]) 167 { 168 count++; 169 } 170 else 171 { 172 break; 173 } 174 i++; 175 } 176 i=x-1; 177 while(i>=0&&count<5)//自此向上 178 { 179 if(pieces[i][j]==pieces[x][y]) 180 { 181 count++; 182 } 183 else 184 { 185 break; 186 } 187 i--; 188 } 189 if(count==5) 190 { 191 return pieces[x][y]; 192 } 193 194 //左斜行 195 i=x; 196 j=y; 197 count=1; 198 199 i=i-1; 200 j=j-1; 201 while(i>=0&&j>=0&&count<5)//自此左斜向上 202 { 203 if(pieces[i][j]==pieces[x][y]) 204 { 205 count++; 206 } 207 else 208 { 209 break; 210 } 211 i--; 212 j--; 213 } 214 215 i=x+1; 216 j=y+1; 217 while(i<N&&j<N&&count<5)//自此左斜向下 218 { 219 if(pieces[i][j]==pieces[x][y]) 220 { 221 count++; 222 } 223 else 224 { 225 break; 226 } 227 i++; 228 j++; 229 } 230 if(count==5) 231 { 232 return pieces[x][y]; 233 } 234 235 //右斜行 236 i=x; 237 j=y; 238 count=1; 239 i=i-1; 240 j=j+1; 241 while(i>=0&&j<N&&count<5)//自此右斜向上 242 { 243 if(pieces[i][j]==pieces[x][y]) 244 { 245 count++; 246 } 247 else 248 { 249 break; 250 } 251 i--; 252 j++; 253 } 254 255 i=x+1; 256 j=y-1; 257 while(i<N&&j>=0&&count<5)////自此右斜向下 258 { 259 if(pieces[i][j]==pieces[x][y]) 260 { 261 count++; 262 } 263 else 264 { 265 break; 266 } 267 i++; 268 j--; 269 } 270 if(count==5) 271 { 272 return pieces[x][y]; 273 } 274 return 0; 275 } 276 277 void HeQi()//信息模块1 278 { 279 Sleep(5000); 280 system("CLS"); 281 printf(" ********************************************************** "); 282 printf(" * * "); 283 printf(" * * "); 284 printf(" * * "); 285 printf(" * 和棋! * "); 286 printf(" * * "); 287 printf(" * * "); 288 printf(" * * "); 289 printf(" * * "); 290 printf(" ********************************************************** "); 291 } 292 293 void Over() //信息模块2 294 { 295 Sleep(5000); 296 //system("CLS"); 297 printf(" ********************************************************** "); 298 printf(" * * "); 299 printf(" * * "); 300 printf(" * * "); 301 printf(" * 游戏结束! * "); 302 printf(" * * "); 303 printf(" * * "); 304 printf(" * * "); 305 printf(" * * "); 306 printf(" ********************************************************** "); 307 } 308 309 void Welcome() 310 { 311 system("CLS"); 312 printf(" ********************************************************** "); 313 printf(" * * "); 314 printf(" * * "); 315 printf(" * * "); 316 printf(" * 欢迎! * "); 317 printf(" * * "); 318 printf(" * * "); 319 printf(" * * "); 320 printf(" * * "); 321 printf(" ********************************************************** "); 322 printf(" press any key to start! "); 323 getchar(); 324 } 325 326 int main() 327 { 328 int x,y; //行列坐标 329 char ch='y'; 330 int winner; //赢家 331 int countpieces=0;//落子总数 332 Welcome(); 333 DrawPanel(); 334 335 while(countpieces<N*N) 336 { 337 x=ZouQiHang(); 338 y=ZouQiLie(); 339 x=x-1; 340 y=y-1; 341 if(pieces[x][y]==0)//是否可以落子 342 { 343 pieces[x][y]=flag; 344 countpieces++; 345 //改变状态 346 if(flag==1) 347 { 348 flag=2; 349 } 350 else 351 { 352 flag=1; 353 } 354 //判断输赢,继续? 355 winner=Check(x,y); 356 if(winner==1) 357 { 358 DrawPanel(); 359 printf(" 恭喜A●赢了! "); 360 break; 361 } 362 else if(winner==2) 363 { 364 DrawPanel(); 365 printf(" 恭喜B○赢了! "); 366 break; 367 } 368 } 369 else 370 { 371 printf("ERROR! "); 372 printf("落子行列错误,请随意按键重新输入! "); 373 getchar(); 374 getchar(); 375 } 376 DrawPanel(); 377 }//while 378 379 if(countpieces==N*N) 380 { 381 HeQi();//和棋 382 } 383 else 384 { 385 Over();//结束 386 } 387 return 0; 388 389 }