前言:html
唔,進了大學好久沒有更新博客了...感受本身的語言能力和代碼理解能力也隨着不寫博客有必定的降低...算法
最近看到室友們的計概大做業,同化棋AI。以爲挺有意思,因而也想着試一試,同時開一篇博客來記錄本身思考的過程。數組
STEP1app
首先咱們須要對同化棋有必定的瞭解dom
1 void init(){ 2 map[1][7]=map[7][1]=1; 3 map[1][1]=map[7][7]=2; 4 int tmp=0; 5 for(int i=-2;i<=2;i++) 6 for(int j=-2;j<=2;j++) 7 if(!(i==0 && j==0)) tmp++,mvx[tmp]=i,mvy[tmp]=j; //mvx和mvy分別表示棋子移動時x方向上和y方向上的移動 8 tmp=0; 9 for(int i=-1;i<=1;i++) 10 for(int j=-1;j<=1;j++) 11 if(!(i==0 && j==0)) tmp++,arx[tmp]=i,ary[tmp]=j; //arx和ary分別表示染色時在x和y上的移動 12 }
void print2(int map[][9]){ sum(map); printf(" YOU: %2d ┃COM: %2d\n",cnt[1],cnt[2]); printf(" ━━━━━━━━━━━━━━━━ \n"); printf(" 1 2 3 4 5 6 7 \n"); printf(" ┏━┳━┳━┳━┳━┳━┳━┓\n"); printf(" 1 ┃"); for(int i=1;i<=7;i++) if(map[1][i]==1) printf("●┃"); else if(map[1][i]==2) printf("○┃"); else printf(" ┃"); putchar('\n'); for(int i=2;i<=7;i++){ printf(" ┣━╋━╋━╋━╋━╋━╋━┫\n"); printf(" %d ┃",i); for(int j=1;j<=7;j++) if(map[i][j]==1) printf("●┃"); else if(map[i][j]==2) printf("○┃"); else printf(" ┃"); putchar('\n'); } printf(" ┗━┻━┻━┻━┻━┻━┻━┛\n"); }
上面即是寫的代碼,能夠先畫出來再寫成for循環的棋盤模式ide
#include<cstdio> #include<cstring> #include<ctime> #include<cstdlib> #include<algorithm> using namespace std; int ans; int map[9][9],rec[9][9]; int mvx[25],mvy[25]; int move_list[25],top; //初始化函數 void init(){ int tmp=0; for(int i=-2;i<=2;i++) for(int j=-2;j<=2;j++) if(!(i==0 && j==0)) tmp++,mvx[tmp]=i,mvy[tmp]=j; //mvx和mvy分別表示棋子移動時x方向上和y方向上的移動 } int can_move(int x,int y){ top=0; int nx,ny; for(int i=1;i<=24;i++){ nx=x+mvx[i],ny=y+mvy[i]; if(nx>=1 && nx<=7 && ny>=1 && ny<=7 && !map[nx][ny]) move_list[++top]=i; } return top; } int count(){ int cnt=0,t=0; for(int i=1;i<=7;i++) for(int j=1;j<=7;j++) if(map[i][j]==2) cnt+=can_move(i,j); else if(map[i][j]==1) t=1; return cnt; } void random_map(){ for(int i=1;i<=7;i++) for(int j=1;j<=7;j++) map[i][j]=rand()%3; } int main(){ freopen("test2.out","w",stdout); long long sum=0; init(); srand(time(0)); for(int K=1;K<=10000;K++){ random_map(); sum+=count(); } printf("%lf",sum/10000.0); return 0; }
1 /* 2 Author : Robert_Yuan 3 */ 4 5 #include<cstdio> 6 #include<cstring> 7 #include<algorithm> 8 9 using namespace std; 10 11 const int INF=0x3f3f3f3f; 12 13 int map[9][9],TTT[9][9]; 14 int cnt[3]; 15 int mvx[25],mvy[25]; 16 int arx[9],ary[9]; 17 int move_list[25],top; 18 19 void init();//初始化 20 void menu();//操做界面 21 void sum();//統計棋子數目 22 void print(int map[][9]);//輸出棋盤 23 void print2(int map[][9]);//輸出一個好看的棋盤 24 void operation1();//單人遊戲 25 void operation2();//雙人遊戲 26 void Copy(); 27 void Save1();//存單人遊戲檔 28 void Save2();//存雙人遊戲檔 29 bool can_move(int x,int y); 30 void Search1(int Depth); 31 void Search2(int Depth); 32 33 int main(){ 34 //freopen("bug.in","r",stdin); 35 //freopen("game.out","w",stdout); 36 // init(); 37 menu(); 38 //operation1(); 39 } 40 41 void menu(){ 42 int ord1,ord2; 43 printf(" ━━━━━━━━━━━━━━━━━━━━━━━━ \n"); 44 printf("歡迎來到同化棋小遊戲,您能夠輸入數字來進行如下操做\n"); 45 printf(" ━━━━━━━━━━━━━━━━━━━━━━━━\n"); 46 printf(" 0.退出遊戲\n"); 47 printf(" 1.單人遊戲\n"); 48 printf(" 2.雙人遊戲\n"); 49 scanf("%d",&ord1); 50 if(ord1==1){ 51 printf(" ━━━━━━━━━━━━━━━━━━━━━━━\n"); 52 printf(" 您來到了單人遊戲,您能夠輸入數字來進行如下操做\n"); 53 printf(" ━━━━━━━━━━━━━━━━━━━━━━━\n"); 54 printf(" 0.返回上層\n"); 55 printf(" 1.新遊戲\n"); 56 printf(" 2.讀取存檔\n"); 57 scanf("%d",&ord2); 58 if(ord2==0) menu();//返回上層即再次遞歸 59 else{ 60 init(); 61 if(ord2==2){//讀取存檔 62 FILE *fp; 63 fp=fopen("rec1.txt","r"); 64 for(int i=1;i<=7;i++) 65 for(int j=1;j<=7;j++) 66 fscanf(fp,"%d",&map[i][j]); 67 } 68 operation1(); 69 } 70 } 71 else if(ord1==2){ 72 printf(" ━━━━━━━━━━━━━━━━━━━━━━━\n"); 73 printf(" 您來到了雙人遊戲,您能夠輸入數字來進行如下操做\n"); 74 printf(" ━━━━━━━━━━━━━━━━━━━━━━━\n"); 75 printf(" 0.返回上層\n"); 76 printf(" 1.新遊戲\n"); 77 printf(" 2.讀取存檔\n"); 78 scanf("%d",&ord2); 79 if(ord2==0) menu(); 80 else{ 81 init(); 82 if(ord2==2){ 83 FILE *fp; 84 fp=fopen("rec2.txt","r"); 85 for(int i=1;i<=7;i++) 86 for(int j=1;j<=7;j++) 87 fscanf(fp,"%d",&map[i][j]); 88 } 89 operation2(); 90 } 91 } 92 else 93 return ; 94 } 95 96 //初始化函數 97 void init(){ 98 //初始化棋盤 99 map[1][7]=map[7][1]=1; 100 map[1][1]=map[7][7]=2; 101 //初始化移動和周圍數組 102 int tmp=0; 103 for(int i=-2;i<=2;i++) 104 for(int j=-2;j<=2;j++) 105 if(!(i==0 && j==0)) tmp++,mvx[tmp]=i,mvy[tmp]=j; //mvx和mvy分別表示棋子移動時x方向上和y方向上的移動 106 tmp=0; 107 for(int i=-1;i<=1;i++) 108 for(int j=-1;j<=1;j++) 109 if(!(i==0 && j==0)) tmp++,arx[tmp]=i,ary[tmp]=j; //arx和ary分別表示染色時在x和y上的移動 110 } 111 112 //統計棋盤內各類子的數目 113 void sum(int map[][9]){ 114 cnt[0]=cnt[1]=cnt[2]=0; 115 for(int i=1;i<=7;i++) 116 for(int j=1;j<=7;j++) 117 cnt[map[i][j]]++; 118 } 119 120 //輸出一個簡陋的棋盤(@和#組成) 121 void print(int map[][9]){ 122 sum(map); 123 printf("YOU:%2d COM:%2d\n",cnt[1],cnt[2]); 124 putchar(' '); 125 for(int i=1;i<=7;i++) 126 printf(" %d",i); 127 putchar('\n'); 128 for(int i=1;i<=7;i++){ 129 printf("%d",i); 130 for(int j=1;j<=7;j++){ 131 if(map[i][j]==1) printf(" @"); 132 else if(map[i][j]==2) printf(" #"); 133 else printf(" "); 134 } 135 putchar('\n'); 136 } 137 } 138 139 //輸出一個漂亮的棋盤,使用製表符 140 void print2(int map[][9]){ 141 sum(map); 142 printf(" ━━━━━━━━━━━━━━━━ \n"); 143 printf(" YOU: %2d ┃COM: %2d\n",cnt[1],cnt[2]); 144 printf(" ━━━━━━━━━━━━━━━━ \n"); 145 printf(" 1 2 3 4 5 6 7 \n"); 146 printf(" ┏━┳━┳━┳━┳━┳━┳━┓\n"); 147 printf(" 1 ┃"); 148 for(int i=1;i<=7;i++) 149 if(map[1][i]==1) printf("●┃"); 150 else if(map[1][i]==2) printf("○┃"); 151 else printf(" ┃"); 152 putchar('\n'); 153 for(int i=2;i<=7;i++){ 154 printf(" ┣━╋━╋━╋━╋━╋━╋━┫\n"); 155 printf(" %d ┃",i); 156 for(int j=1;j<=7;j++) 157 if(map[i][j]==1) printf("●┃"); 158 else if(map[i][j]==2) printf("○┃"); 159 else printf(" ┃"); 160 putchar('\n'); 161 } 162 printf(" ┗━┻━┻━┻━┻━┻━┻━┛\n"); 163 } 164 165 //判斷一個位置的琪是否還有位置能夠移動 ,同時將能夠移動的方向存在move_list中 166 bool can_move(int x,int y){ 167 top=0; 168 int nx,ny; 169 for(int i=1;i<=24;i++){ 170 nx=x+mvx[i],ny=y+mvy[i]; 171 if(nx>=1 && nx<=7 && ny>=1 && ny<=7 && map[nx][ny]==0) 172 move_list[++top]=i; 173 } 174 return top!=0; 175 } 176 177 //處理一個從(x1,y1)移動到(x2,y2)的t種棋子所產生的效果 178 void Deal_With(int x1,int y1,int x2,int y2,int t,int map[][9]){ 179 map[x1][y1]=t*(abs(x2-x1)<=1 && abs(y2-y1)<=1); 180 map[x2][y2]=t; 181 int nx,ny; 182 for(int i=1;i<=8;i++){ 183 nx=x2+arx[i],ny=y2+ary[i]; 184 if(map[nx][ny]) map[nx][ny]=t; 185 } 186 } 187 188 //單人遊戲存檔 189 void Save1(){ 190 FILE *fp; 191 fp=fopen("rec1.txt","w"); 192 for(int i=1;i<=7;i++){ 193 for(int j=1;j<=7;j++) 194 fprintf(fp,"%d ",map[i][j]); 195 fprintf(fp,"\n"); 196 } 197 } 198 199 //雙人遊戲存檔 200 void Save2(){ 201 FILE *fp; 202 fp=fopen("rec2.txt","w"); 203 for(int i=1;i<=7;i++){ 204 for(int j=1;j<=7;j++) 205 fprintf(fp,"%d ",map[i][j]); 206 fprintf(fp,"\n"); 207 } 208 } 209 210 //複製兩個棋盤 211 void Copy(int A[][9],int B[][9]){ 212 for(int i=1;i<=7;i++) 213 for(int j=1;j<=7;j++) 214 B[i][j]=A[i][j]; 215 } 216 217 //電腦0,使用黑棋子最多戰略 218 void COMPUTER0(){ 219 printf("如今是電腦0時間!"); 220 int BEST_I,BEST_J,BEST_NI,BEST_NJ,BEST=0; 221 for(int i=1;i<=7;i++) 222 for(int j=1;j<=7;j++) 223 if(map[i][j]==2){ 224 if(can_move(i,j)){ 225 for(int k=1;k<=top;k++){ 226 int nx=i+mvx[move_list[k]],ny=j+mvy[move_list[k]]; 227 Copy(map,TTT); 228 Deal_With(i,j,nx,ny,2,TTT); 229 sum(TTT); 230 if(cnt[2]>BEST) 231 BEST=cnt[2],BEST_I=i,BEST_J=j,BEST_NI=nx,BEST_NJ=ny; 232 } 233 } 234 } 235 Deal_With(BEST_I,BEST_J,BEST_NI,BEST_NJ,2,map); 236 printf("電腦把(%d,%d)移動到了(%d,%d):\n",BEST_I,BEST_J,BEST_NI,BEST_NJ); 237 } 238 239 //電腦1,使用黑棋減去白琪最多戰略 240 void COMPUTER1(){ 241 printf("如今是電腦1時間!"); 242 int BEST_I,BEST_J,BEST_NI,BEST_NJ,BEST=-49; 243 for(int i=1;i<=7;i++) 244 for(int j=1;j<=7;j++) 245 if(map[i][j]==2){ 246 if(can_move(i,j)){ 247 for(int k=1;k<=top;k++){ 248 int nx=i+mvx[move_list[k]],ny=j+mvy[move_list[k]]; 249 Copy(map,TTT); 250 Deal_With(i,j,nx,ny,2,TTT); 251 sum(TTT); 252 if(cnt[2]-cnt[1]>BEST) 253 BEST=cnt[2]-cnt[1],BEST_I=i,BEST_J=j,BEST_NI=nx,BEST_NJ=ny; 254 } 255 } 256 } 257 Deal_With(BEST_I,BEST_J,BEST_NI,BEST_NJ,2,map); 258 printf("電腦把(%d,%d)移動到了(%d,%d):\n",BEST_I,BEST_J,BEST_NI,BEST_NJ); 259 } 260 261 int height[9],ins[9],ht;//height和ht表示維護的單調棧和棧頂指針,ins表示每一個位置能管到的最前面的位置 262 int Left[9][9];//Left表示統計這個位置往左邊最長延伸爲多少 263 264 //返回兩個值中的最大值 265 int Max(int x,int y){ 266 return x>y?x:y; 267 } 268 269 int Min(int x,int y){ 270 return x<y?x:y; 271 } 272 273 //計算map中t的最大矩陣,使用單調棧 274 int calcu_matrix(int map[][9],int t){ 275 int ans=0; 276 for(int i=1;i<=7;i++) 277 for(int j=1;j<=7;j++){ 278 Left[i][j]=0; 279 if(map[i][j]==t) 280 Left[i][j]=Left[i][j-1]+1; 281 } 282 for(int i=1;i<=7;i++){ 283 ht=0; 284 for(int j=1;j<=8;j++){ 285 while(Left[height[ht]][i]>=Left[j][i] && ht>0){ 286 ans=Max(ans,Left[height[ht]][i]*(j-ins[height[ht]])); 287 ht--; 288 } 289 ins[j]=height[ht]+1; 290 ans=Max(Left[j][i]*(j-ins[j]+1),ans); 291 height[++ht]=j; 292 293 } 294 } 295 return ans; 296 } 297 298 //COM1優化:當黑子減白子相同時,能夠經過最大矩陣進行第二次判斷 299 void COMPUTER2(){ 300 printf("如今是電腦2時間!"); 301 int BEST_I,BEST_J,BEST_NI,BEST_NJ,BEST=-49,BESTC=0; 302 for(int i=1;i<=7;i++) 303 for(int j=1;j<=7;j++) 304 if(map[i][j]==2){ 305 if(can_move(i,j)){ 306 for(int k=1;k<=top;k++){ 307 int nx=i+mvx[move_list[k]],ny=j+mvy[move_list[k]],nc; 308 Copy(map,TTT); 309 Deal_With(i,j,nx,ny,2,TTT); 310 nc=calcu_matrix(TTT,2); 311 sum(TTT); 312 if(cnt[2]-cnt[1]>BEST) 313 BEST=cnt[2]-cnt[1],BEST_I=i,BEST_J=j,BEST_NI=nx,BEST_NJ=ny,BESTC=nc; 314 else if(cnt[2]-cnt[1]==BEST && BESTC<nc){ 315 BEST_I=i,BEST_J=j,BEST_NI=nx,BEST_NJ=ny,BESTC=nc; 316 } 317 } 318 } 319 } 320 Deal_With(BEST_I,BEST_J,BEST_NI,BEST_NJ,2,map); 321 printf("電腦把(%d,%d)移動到了(%d,%d):\n",BEST_I,BEST_J,BEST_NI,BEST_NJ); 322 } 323 int move_steps(int x,int y){ 324 top=0; 325 int nx,ny; 326 for(int i=1;i<=24;i++){ 327 nx=x+mvx[i],ny=y+mvy[i]; 328 if(nx>=1 && nx<=7 && ny>=1 && ny<=7 && !map[nx][ny]) top++; 329 } 330 return top; 331 } 332 333 int Move_power(int t){ 334 int cnt=0; 335 for(int i=1;i<=7;i++) 336 for(int j=1;j<=7;j++) 337 if(map[i][j]==t) cnt+=move_steps(i,j); 338 return cnt; 339 } 340 341 int Judge(int map[][9]){ 342 sum(map); 343 int Main=cnt[2]-cnt[1],Other=calcu_matrix(map,2),Another; 344 Another=0; 345 //Another=Move_power(2); 346 return Main*100+Other+Another; 347 } 348 349 int rec[10][9][9],Inform[9][2]; 350 int Greed[25]; 351 352 int Calcu_Next(int i,int j,int k,int Depth){ 353 int nx=i+mvx[move_list[k]],ny=j+mvy[move_list[k]]; 354 Deal_With(i,j,nx,ny,map[i][j],map); 355 int ans=Judge(map); 356 Copy(rec[Depth],map); 357 return ans; 358 } 359 360 int MVL[10][25],TP[10]; 361 bool can_move2(int x,int y,int Depth){ 362 TP[Depth]=0; 363 int nx,ny; 364 for(int i=1;i<=24;i++){ 365 nx=x+mvx[i],ny=y+mvy[i]; 366 if(nx>=1 && nx<=7 && ny>=1 && ny<=7 && map[nx][ny]==0) 367 MVL[Depth][++TP[Depth]]=i; 368 } 369 return TP[Depth]!=0; 370 } 371 372 bool cmp1(const int &A,const int &B){ 373 return Greed[A]>Greed[B]; 374 } 375 bool cmp2(const int &A,const int &B){ 376 return Greed[A]<Greed[B]; 377 } 378 379 //假設電腦是得分者 380 void Search1(int Depth){ 381 if(Depth>3){ 382 Inform[Depth-1][1]=Min(Inform[Depth-1][1],Judge(map)); 383 return ; 384 } 385 Copy(map,rec[Depth]); 386 //若是是我(電腦)下 387 for(int i=1;i<=7;i++){ 388 for(int j=1;j<=7;j++) 389 if(map[i][j]==2 && can_move2(i,j,Depth)){ 390 for(int k=1;k<=TP[Depth];k++) 391 Greed[k]=Calcu_Next(i,j,k,Depth); 392 //把貪心中容易得分的先下 393 for(int k=1;k<=TP[Depth];k++) 394 for(int l=1;l<=TP[Depth]-k;l++) 395 if(Greed[l]<Greed[l+1]){ 396 int tmp=Greed[l];Greed[l]=Greed[l+1];Greed[l+1]=tmp; 397 tmp=MVL[Depth][l];MVL[Depth][l]=MVL[Depth][l+1];MVL[Depth][l+1]=tmp; 398 } 399 400 for(int k=1;k<=TP[Depth];k++){ 401 int nx=i+mvx[MVL[Depth][k]],ny=j+mvy[MVL[Depth][k]],Interest; 402 Deal_With(i,j,nx,ny,2,map); 403 Inform[Depth+1][0]=-INF; 404 Inform[Depth+1][1]=INF; 405 406 Search2(Depth+1); 407 Copy(rec[Depth],map); 408 if(Inform[Depth-1][1]<=Inform[Depth][0]) return; 409 410 } 411 } 412 } 413 Inform[Depth-1][1]=Min(Inform[Depth-1][1],Inform[Depth][0]); 414 } 415 416 void Search2(int Depth){ 417 if(Depth>3){ 418 Inform[Depth-1][0]=Max(Inform[Depth-1][0],Judge(map)); 419 return ; 420 } 421 Copy(map,rec[Depth]); 422 //若是是阻礙者下 423 for(int i=1;i<=7;i++){ 424 for(int j=1;j<=7;j++) 425 if(map[i][j]==1 && can_move2(i,j,Depth)){ 426 for(int k=1;k<=TP[Depth];k++) 427 Greed[k]=Calcu_Next(i,j,k,Depth); 428 //把貪心中難以得分的先下 429 for(int k=1;k<=TP[Depth];k++) 430 for(int l=1;l<=TP[Depth]-k;l++) 431 if(Greed[l]>Greed[l+1]){ 432 int tmp=Greed[l];Greed[l]=Greed[l+1];Greed[l+1]=tmp; 433 tmp=MVL[Depth][l];MVL[Depth][l]=MVL[Depth][l+1];MVL[Depth][l+1]=tmp; 434 } 435 436 for(int k=1;k<=TP[Depth];k++){ 437 int nx=i+mvx[MVL[Depth][k]],ny=j+mvy[MVL[Depth][k]],Interest; 438 Deal_With(i,j,nx,ny,1,map); 439 Inform[Depth+1][0]=-INF; 440 Inform[Depth+1][1]=INF; 441 442 Search1(Depth+1); 443 Copy(rec[Depth],map); 444 if(Inform[Depth-1][0]>=Inform[Depth][1]) return; 445 } 446 } 447 } 448 Inform[Depth-1][0]=Max(Inform[Depth-1][0],Inform[Depth][1]); 449 } 450 451 //這個就是搜索的過程了 452 void COMPUTER3(){ 453 int MIN=-INF; 454 int BEST_I,BEST_J,BEST_NI,BEST_NJ; 455 Copy(map,rec[0]); 456 Inform[0][0]=-INF; 457 Inform[0][1]=INF; 458 //若是是我(電腦)下 459 for(int i=1;i<=7;i++){ 460 for(int j=1;j<=7;j++) 461 if(map[i][j]==2 && can_move(i,j)){ 462 for(int k=1;k<=top;k++) 463 Greed[k]=Calcu_Next(i,j,k,0); 464 //把貪心中容易得分的先下 465 for(int k=1;k<=top;k++) 466 for(int l=1;l<=top-k;l++) 467 if(Greed[l]<Greed[l+1]){ 468 int tmp=Greed[l];Greed[l]=Greed[l+1];Greed[l+1]=tmp; 469 tmp=move_list[l];move_list[l]=move_list[l+1];move_list[l+1]=tmp; 470 } 471 472 for(int k=1;k<=top;k++){ 473 int nx=i+mvx[move_list[k]],ny=j+mvy[move_list[k]],Interest; 474 Deal_With(i,j,nx,ny,2,map); 475 Inform[1][0]=-INF; 476 Inform[1][1]=INF; 477 478 Search2(1); 479 Copy(rec[0],map); 480 if(Inform[0][0]>MIN){ 481 BEST_NI=nx;BEST_NJ=ny;BEST_I=i;BEST_J=j; 482 MIN=Inform[0][0]; 483 } 484 } 485 } 486 } 487 if(MIN==-INF){printf("很差意思它掛機了!");return;} 488 Deal_With(BEST_I,BEST_J,BEST_NI,BEST_NJ,2,map); 489 printf("電腦把(%d,%d)移動到了(%d,%d):\n",BEST_I,BEST_J,BEST_NI,BEST_NJ); 490 } 491 492 //單人遊戲操做 493 void operation1(){ 494 int x1,y1,x2,y2; 495 while(true){ 496 print2(map); 497 if(!cnt[0]){ 498 if(cnt[1]>cnt[2]) printf("您贏了!Orz!"); 499 else printf("您差點就贏了!Orz!"); 500 return ; 501 } 502 int f1=false,f2=false; 503 for(int i=1;i<=7;i++) 504 for(int j=1;j<=7;j++) 505 if(map[i][j]==1 && !f1){ 506 if(can_move(i,j)) f1=true; 507 } 508 if(!f1) {printf("您差點就贏了!Orz!");return;} 509 int ord; 510 printf("您須要存檔嗎?若是須要請輸入1不然輸入0\n"); 511 scanf("%d",&ord); 512 if(ord) {printf("已存檔!\n");Save1();return ;} 513 bool Over=0; 514 while(true){ 515 printf("請輸入您須要移動的棋子的行和列\n"); 516 scanf("%d%d",&x1,&y1); 517 if(map[x1][y1]!=1) 518 printf("您在該位置沒有棋子!\n"); 519 else if(!can_move(x1,y1)) printf("您選擇的棋子沒法移動!\n"); 520 else{ 521 while(true){ 522 printf("請輸入您須要移動的棋子到的位置:\n"); 523 scanf("%d%d",&x2,&y2); 524 if(abs(x2-x1)>2 || abs(y2-y1)>2 || (x1==x2 && y1==y2) || map[x2][y2]){ 525 printf("您的移動不合法!\n"); break; 526 } 527 else{ 528 Over=1; 529 break; 530 } 531 } 532 } 533 if(Over) break; 534 } 535 Deal_With(x1,y1,x2,y2,1,map); 536 print2(map); 537 for(int i=1;i<=7;i++) 538 for(int j=1;j<=7;j++) 539 if(map[i][j]==2 && !f2) 540 if(can_move(i,j)) f2=true; 541 if(!f2) {printf("您贏了!Orz!");return;} 542 if(!cnt[0]){ 543 if(cnt[1]>cnt[2]) printf("PLAYER1贏了!Orz!"); 544 else printf("PLAYER2贏了!Orz!"); 545 return ; 546 } 547 COMPUTER3(); 548 } 549 } 550 551 //雙人遊戲操做 552 void operation2(){ 553 int x1,y1,x2,y2; 554 while(true){ 555 bool f1=false,f2=false; 556 print2(map); 557 for(int i=1;i<=7;i++) 558 for(int j=1;j<=7;j++) 559 if(map[i][j]==1 && !f1) 560 if(can_move(i,j)) f1=true; 561 if(!f1) {printf("PLAYER2贏了!Orz!");return;} 562 if(!cnt[0]){ 563 if(cnt[1]>cnt[2]) printf("PLAYER1贏了!Orz!"); 564 else printf("PLAYER2贏了!Orz!"); 565 return ; 566 } 567 568 int ord; 569 printf("您須要存檔嗎?若是須要請輸入1不然輸入0\n"); 570 scanf("%d",&ord); 571 if(ord) {printf("已存檔!\n");Save2();return ;} 572 573 bool Over=0; 574 while(true){ 575 printf("如今是PLAYER1操做!\n請輸入您須要移動的棋子的行和列\n"); 576 scanf("%d%d",&x1,&y1); 577 if(map[x1][y1]!=1) 578 printf("您在該位置沒有棋子!\n"); 579 else if(!can_move(x1,y1)) printf("您選擇的棋子沒法移動!\n"); 580 else{ 581 while(true){ 582 printf("請輸入您須要移動的棋子到的位置:\n"); 583 scanf("%d%d",&x2,&y2); 584 if(abs(x2-x1)>2 || abs(y2-y1)>2 || (x1==x2 && y1==y2) || map[x2][y2]){ 585 printf("您的移動不合法!\n"); break; 586 } 587 else{ 588 Over=1; 589 break; 590 } 591 } 592 } 593 if(Over) break; 594 } 595 Deal_With(x1,y1,x2,y2,1,map); 596 print2(map); 597 for(int i=1;i<=7;i++) 598 for(int j=1;j<=7;j++) 599 if(map[i][j]==2 && !f2) 600 if(can_move(i,j)) f2=true; 601 if(!f2) {printf("PLAYER1贏了!Orz!");return;} 602 if(!cnt[0]){ 603 if(cnt[1]>cnt[2]) printf("PLAYER1贏了!Orz!"); 604 else printf("PLAYER2贏了!Orz!"); 605 return ; 606 } 607 608 Over=0; 609 while(true){ 610 printf("如今是PLAYER2操做!\n請輸入您須要移動的棋子的行和列\n"); 611 scanf("%d%d",&x1,&y1); 612 if(map[x1][y1]!=2) 613 printf("您在該位置沒有棋子!\n"); 614 else if(!can_move(x1,y1)) printf("您選擇的棋子沒法移動!\n"); 615 else{ 616 while(true){ 617 printf("請輸入您須要移動的棋子到的位置:\n"); 618 scanf("%d%d",&x2,&y2); 619 if(abs(x2-x1)>2 || abs(y2-y1)>2 || (x1==x2 && y1==y2) || map[x2][y2]){ 620 printf("您的移動不合法!\n"); break; 621 } 622 else{ 623 Over=1; 624 break; 625 } 626 } 627 } 628 if(Over) break; 629 } 630 Deal_With(x1,y1,x2,y2,2,map); 631 632 } 633 }