8.5 趣味游戏(2)
8-26 shuffle.c
1 #include <stdio.h> 2 typedef struct card 3 { 4 int Suit; //花色 5 char Number; //牌數 6 }Card; 7 Card card1[52]; //保存每張撲克的花色、數字 8 void ShowCard(); //顯示牌 9 void Shuffle(); //洗牌 10 int main() 11 { 12 int i, suit1, temp; 13 suit1 = 2; 14 for (i = 0; i < 52; i++) //生成52張牌 15 { 16 if (i % 13 == 0) 17 suit1++; //改變花色 18 card1[i].Suit = suit1; //保存花色 19 temp = i % 13; 20 if (temp == 0) 21 card1[i].Number = 'A'; 22 else if (temp == 9) 23 card1[i].Number = '0'; 24 else if (temp == 10) 25 card1[i].Number = 'J'; 26 else if (temp == 11) 27 card1[i].Number = 'Q'; 28 else if (temp == 12) 29 card1[i].Number = 'K'; 30 else 31 card1[i].Number = temp + '1'; 32 } 33 printf("一付新牌的排列:\n"); 34 ShowCard(); //顯示新牌的排列 35 Shuffle(); //洗牌 36 printf("\n洗牌后的排列:\n"); 37 ShowCard(); //顯示新牌的排列 38 getch(); 39 return 0; 40 } 41 void ShowCard() //顯示牌 42 { 43 int i, j; 44 for (i = 0, j = 0; i < 52; i++, j++) 45 { 46 if (!(j % 13)) 47 printf("\n"); 48 printf(" %c%c", card1[i].Suit, card1[i].Number); 49 } 50 printf("\n"); 51 } 52 void Shuffle() //洗牌 53 { 54 int i, j; 55 Card tempcard; 56 srand((int) time(0)); 57 for (i = 0; i < 52; i++) 58 { 59 j = rand() % 52; //隨機換牌,將牌的順序打亂,達到洗牌的效果 60 tempcard = card1[j]; 61 card1[j] = card1[i]; 62 card1[i] = tempcard; 63 } 64 }8-27 b&wchess.c
1 #include <stdio.h> 2 void Output(char chessboard[][8]); //顯示棋盤中下子的情況 3 int Check(char chessboard[][8], int moves[][8], char player); //檢查一方是否有地方可下子 4 void PlayStep(char chessboard[][8], int row, int col, char player); //在指定位置下子 5 void AutoPlayStep(char chessboard[][8], int moves[][8], char player); //計算機在思考下子 6 int GetMaxScore(char chessboard[][8], char player); //獲取分數 7 int BestPlay(char chessboard[][8], int moves[][8], char player); //最優下子 8 int main() 9 { 10 char chessboard[8][8]; //保存棋盤中各單元格下子的狀態 11 int isDown[8][8] = { 0 }; //保存棋盤中各位置是否可以下子,可下子的位置為1,其余位置為0 12 int row, col, x, y; 13 int iCount = 0; //已下棋子數量 14 int player = 0; //下棋方 15 int SkipPlay = 0; //跳過下子的次數,若為2,表示雙方都不能下子 16 int Score[2]; //保存計算機和游戲者的得分 17 char select; 18 printf("黑白棋\n\n"); 19 printf("游戲者執黑先下,計算機執白,按Enter開始:\n"); 20 scanf("%c", &select); 21 do 22 { 23 if (player == 0) //計算下棋方(0表示游戲者,1表示計算機) 24 player = 1; 25 else 26 player = 0; 27 iCount = 4; //累計下子數 28 for (row = 0; row < 8; row++) //棋盤各位置清空 29 for (col = 0; col < 8; col++) 30 chessboard[row][col] = 0; 31 chessboard[3][3] = chessboard[4][4] = 1; //在棋盤中間位置放置白棋 32 chessboard[3][4] = chessboard[4][3] = -1; //在棋盤中間位置放置黑棋 33 printf("\n棋盤初始狀態:\n"); 34 Output(chessboard); //顯示初始棋盤下子的狀況 35 do 36 { 37 if (player == 1) //若是游戲者下棋(下白子) 38 { 39 player = 0; 40 if (Check(chessboard, isDown, 2)) //判斷是否可下黑子 41 { 42 while(1) //死循環,直到用戶輸入正確的坐標為止 43 { 44 fflush(stdin); 45 printf("輸入下子的位置(行 列):"); 46 scanf("%d%c", &x, &y); 47 x--; //計算行坐標位置 48 if(y >= 'a') 49 y = y - 'a' + 1; 50 else 51 y = y - 'A' + 1; 52 y--; //計算列位置 53 if (x >= 0 && y >= 0 && x < 8 && y < 8 && isDown[x][y]) //若行列坐標輸入有效 54 { 55 PlayStep(chessboard, x, y, 2); //在指定坐標位置下黑子 56 iCount++; //累加下子數 57 break; 58 } 59 else 60 printf("坐標輸入錯誤,請重新輸入。\n"); 61 } 62 printf("\n你下子后的狀態:\n"); 63 Output(chessboard); //顯示棋子狀態 64 printf("按任意鍵計算機下子。\n"); 65 getch(); 66 } 67 else if (++SkipPlay < 2) //若無效下子的次數小于2 68 { 69 fflush(stdin); //清除輸入緩沖區 70 printf("你沒位置可下,按Enter鍵讓對方下子。"); 71 scanf("%c", &select); 72 } else 73 printf("雙方都沒地方下子,游戲結束!\n"); 74 } 75 else //若是計算機下棋(下黑子) 76 { 77 player = 1; 78 if (Check(chessboard, isDown, 1)) //檢查是否可下白子 79 { 80 SkipPlay = 0; //清除無效下子次數 81 AutoPlayStep(chessboard, isDown, 1); //計算機下一個白子 82 iCount++; //累加下子數 83 printf("\n計算機下子后的狀態:\n"); 84 Output(chessboard); //顯示棋子狀態 85 } 86 else 87 { 88 if (++SkipPlay < 2) //若無效下子次數小于2 89 printf("我沒位置可走,請你走。\n"); 90 else 91 printf("雙方都沒地方下子,游戲結束!"); 92 } 93 } 94 }while (iCount < 64 && SkipPlay < 2); //下子數量小于64 且無效下子的次數小于2 95 Output(chessboard); //顯示各雙方棋子的狀況 96 Score[0] = Score[1] = 0; //清空計分變量 97 for (row = 0; row < 8; row++) //循環統計各單元格黑白棋子的數量 98 { 99 for (col = 0; col < 8; col++) 100 { 101 Score[0] += chessboard[row][col] == -1; //統計黑子數 102 Score[1] += chessboard[row][col] == 1; //統計白子數 103 } 104 } 105 printf("最終成績:\n"); 106 printf("計算機:%d\n游戲者:%d\n", Score[0], Score[1]); 107 fflush(stdin); //清空輸入緩沖區 108 printf("繼續下一局(y/n)?:"); 109 scanf("%c", &select); 110 }while (select == 'y' || select == 'Y'); 111 printf("Game Over!\n"); 112 getch(); 113 return 0; 114 } 115 void Output(char chessboard[][8]) //顯示棋盤上棋子的狀態 116 { 117 int row, col; 118 printf("\n "); 119 for (col = 0; col < 8; col++) //輸出列標號 120 printf(" %c ", 'A' + col); 121 printf("\n"); 122 printf(" ┌"); //輸出項部橫線 123 for (col = 0; col < 7; col++) //輸出一行 124 printf("─┬"); 125 printf("─┐\n"); 126 for (row = 0; row < 8; row++) 127 { 128 printf("%2d│", row + 1); //輸出行號 129 for (col = 0; col < 8; col++) //輸出棋盤各單元格中棋子的狀態 130 { 131 if (chessboard[row][col] == 1) //白棋 132 printf("○│"); 133 else if (chessboard[row][col] == -1) //黑棋 134 printf("●│"); 135 else //未下子處 136 printf(" │"); 137 } 138 printf("\n"); 139 if (row < 8 - 1) 140 { 141 printf(" ├"); //輸出交叉線 142 for (col = 0; col < 8 - 1; col++) //輸出一行 143 printf("─┼"); 144 printf("─┤\n"); 145 } 146 } 147 printf(" └"); 148 for (col = 0; col < 8 - 1; col++) //最后一行的橫線 149 printf("─┴"); 150 printf("─┘\n"); 151 } 152 int Check(char chessboard[][8], int isDown[][8], char player) //檢查某一方是否還有下子的地方 153 { 154 int rowdelta, coldelta, row, col, x, y = 0; 155 int iStep = 0; 156 char opponent = (player == 1) ? -1 : 1; //對方棋子 157 char myplayer = -1 * opponent; //我方棋子 158 for (row = 0; row < 8; row++) //將isDown數組全部清0 159 for (col = 0; col < 8; col++) 160 isDown[row][col] = 0; 161 for (row = 0; row < 8; row++) //循環判斷棋盤中哪些單元格可以下子 162 { 163 for (col = 0; col < 8; col++) 164 { 165 if (chessboard[row][col] != 0) //若棋盤上對應位置不為空(表示已經有子) 166 continue; //繼續處理下一個單元格 167 for (rowdelta = -1; rowdelta <= 1; rowdelta++) //循環檢查上下行 168 { 169 for (coldelta = -1; coldelta <= 1; coldelta++) //循環檢查左右列 170 { 171 if (row + rowdelta < 0 || row + rowdelta >= 8 172 || col + coldelta < 0 || col + coldelta >= 8 173 || (rowdelta == 0 && coldelta == 0)) //檢查若坐標超過棋盤 或為當前單元格 174 continue; //繼續循環 175 if (chessboard[row + rowdelta][col + coldelta] == opponent) //若(row,col)四周有對手下的子 176 { 177 x = row + rowdelta; //以對手下子位置為坐標 178 y = col + coldelta; 179 180 while(1) //對對手下子為起始點,向四周查找自己方的棋子,以攻擊對方棋子 181 { 182 x += rowdelta; //對手下子的四周坐標 183 y += coldelta; 184 185 if (x < 0 || x >= 8 || y < 0 || y >= 8) //超過棋盤 186 break; //退出循環 187 188 if (chessboard[x][y] == 0) //若對應位置為空 189 break; 190 if (chessboard[x][y] == myplayer) //若對應位置下的子是當前棋手的 191 { 192 isDown[row][col] = 1; //設置移動數組中對應位置為1 (該位置可下子,形成向對手進攻的棋形) 193 iStep++; //累加可下子的位置數量 194 break; 195 } 196 } 197 } 198 } 199 } 200 } 201 } 202 return iStep; //返回可下的位置數量(若返回值為0,表示沒地方可下) 203 } 204 void PlayStep(char chessboard[][8], int row, int col, char player) //在指定位置下子 205 { 206 int rowdelta = 0; 207 int coldelta = 0; 208 int x = 0; 209 int y = 0; 210 char opponent = (player == 1) ? -1 : 1; //對方棋子 211 char myplayer = -1 * opponent; //我方棋子 212 chessboard[row][col] = myplayer; //保存所下的棋子 213 for (rowdelta = -1; rowdelta <= 1; rowdelta++) //檢查所下子四周的棋子 214 { 215 for (coldelta = -1; coldelta <= 1; coldelta++) 216 { 217 if (row + rowdelta < 0 || row + rowdelta >= 8 || col + coldelta < 0 218 || col + coldelta >= 8 || (rowdelta == 0 && coldelta == 0)) //若坐標超過棋盤界限 219 continue; //繼續下一位置 220 if (chessboard[row + rowdelta][col + coldelta] == opponent) //若該位置是對手的棋子 221 { 222 x = row + rowdelta; //以對手棋為坐標 223 y = col + coldelta; 224 while(1) //在對手棋子四周尋找我方棋子 225 { 226 x += rowdelta; 227 y += coldelta; 228 if (x < 0 || x >= 8 || y < 0 || y >= 8) //若坐標超過棋盤 229 break; //退出循環 230 if (chessboard[x][y] == 0) //若對應位置為空 231 break; //退出循環 232 if (chessboard[x][y] == myplayer) //若對應位置是我方模子 233 { 234 while (chessboard[x -= rowdelta][y -= coldelta] == opponent) //循環處理 235 chessboard[x][y] = myplayer; //將中間的棋子都變成我方棋子 236 break; //退出循環 237 } 238 } 239 } 240 } 241 } 242 } 243 int GetMaxScore(char chessboard[][8], char player) //獲取分數 244 { 245 int Score, row, col; 246 char opponent = (player == 1) ? -1 : 1; //對方棋子 247 char myplayer=-1*opponent; 248 for (row = 0; row < 8; row++) //循環 249 { 250 for (col = 0; col < 8; col++) 251 { 252 Score -= chessboard[row][col] == opponent; //若棋盤對應位置是對手下的棋子,從總分中減1 253 Score += chessboard[row][col] == myplayer; //若棋盤對應位置是我方的棋子,總分中加1分 254 } 255 } 256 return Score; //返回分數 257 } 258 int BestPlay(char chessboard[][8], int isDown[][8], char player) //獲取最佳下子位置 259 { 260 int row, col, i, j; 261 char chessboard1[8][8] = { 0 }; //定義一個臨時數組 262 int MaxScore = 0; //保存最高分 263 int Score = 0; 264 char opponent = (player == 1) ? -1 : 1; //對手下的棋子 265 for (row = 0; row < 8; row++) //循環檢查每個單元格 266 { 267 for (col = 0; col < 8; col++) 268 { 269 if (!isDown[row][col]) //若該位置不可下子 270 continue; //繼續 271 for (i = 0; i < 8; i++) //復制棋盤各單元格下子的狀態到臨時數組 272 for (j = 0; j < 8; j++) 273 chessboard1[i][j] = chessboard[i][j]; 274 PlayStep(chessboard1, row, col, player); //在臨時數組中的指定行列下子 275 Score = GetMaxScore(chessboard1, player); //獲取下子后可得到的分數 276 if (MaxScore < Score) //若原方案得到的分數小于本次下子的分數 277 MaxScore = Score; //保存最高分 278 } 279 } 280 return MaxScore; //返回得到的最高分 281 } 282 void AutoPlayStep(char chessboard[][8], int isDown[][8], char player) //計算機自動下子 283 { 284 int row, col, row1, col1, i, j; 285 int Score = 0, MinScore = 100; //對方可下子提到的分數和最小分數 286 char chessboard1[8][8]; //臨時數組,保存棋盤下子位置 287 int isDown1[8][8]; //臨時數組,保存可下子位置 288 char opponent = (player == 1) ? -1 : 1; //對手下的棋子 289 for (row = 0; row < 8; row++) //循環檢查棋盤每個單元格 290 { 291 for (col = 0; col < 8; col++) 292 { 293 if (isDown[row][col] == 0) //若不可下子 294 continue; //繼續下一個位置 295 for (i = 0; i < 8; i++) //將棋盤原來的棋子復制到臨時數組中 296 for (j = 0; j < 8; j++) 297 chessboard1[i][j] = chessboard[i][j]; 298 PlayStep(chessboard1, row, col, player); //試著在臨時棋盤中的一個位子下子 299 Check(chessboard1, isDown1, opponent); //檢查對手是否有地方可下子 300 Score = BestPlay(chessboard1, isDown1, opponent); //獲得臨時棋盤中對方下子的得分情況 301 if (Score < MinScore) //保存對方得分最低的下法 302 { 303 MinScore = Score; 304 row1 = row; 305 col1 = col; 306 } 307 } 308 } 309 PlayStep(chessboard, row1, col1, player); //計算機按最優下法下子 310 }?
#include <stdio.h>void Output(char chessboard[][8]); //顯示棋盤中下子的情況 int Check(char chessboard[][8], int moves[][8], char player); //檢查一方是否有地方可下子 void PlayStep(char chessboard[][8], int row, int col, char player); //在指定位置下子 void AutoPlayStep(char chessboard[][8], int moves[][8], char player); //計算機在思考下子 int GetMaxScore(char chessboard[][8], char player); //獲取分數 int BestPlay(char chessboard[][8], int moves[][8], char player); //最優下子 int main() { char chessboard[8][8]; //保存棋盤中各單元格下子的狀態 int isDown[8][8] = { 0 }; //保存棋盤中各位置是否可以下子,可下子的位置為1,其余位置為0 int row, col, x, y; int iCount = 0; //已下棋子數量 int player = 0; //下棋方int SkipPlay = 0; //跳過下子的次數,若為2,表示雙方都不能下子 int Score[2]; //保存計算機和游戲者的得分 char select; printf("黑白棋\n\n"); printf("游戲者執黑先下,計算機執白,按Enter開始:\n"); scanf("%c", &select); do { if (player == 0) //計算下棋方(0表示游戲者,1表示計算機) player = 1; else player = 0; iCount = 4; //累計下子數 for (row = 0; row < 8; row++) //棋盤各位置清空 for (col = 0; col < 8; col++) chessboard[row][col] = 0; chessboard[3][3] = chessboard[4][4] = 1; //在棋盤中間位置放置白棋 chessboard[3][4] = chessboard[4][3] = -1; //在棋盤中間位置放置黑棋 printf("\n棋盤初始狀態:\n"); Output(chessboard); //顯示初始棋盤下子的狀況 do { if (player == 1) //若是游戲者下棋(下白子) { player = 0; if (Check(chessboard, isDown, 2)) //判斷是否可下黑子 { while(1) //死循環,直到用戶輸入正確的坐標為止 { fflush(stdin); printf("輸入下子的位置(行 列):"); scanf("%d%c", &x, &y); x--; //計算行坐標位置 if(y >= 'a') y = y - 'a' + 1; else y = y - 'A' + 1; y--; //計算列位置 if (x >= 0 && y >= 0 && x < 8 && y < 8 && isDown[x][y]) //若行列坐標輸入有效 { PlayStep(chessboard, x, y, 2); //在指定坐標位置下黑子 iCount++; //累加下子數 break; } elseprintf("坐標輸入錯誤,請重新輸入。\n"); } printf("\n你下子后的狀態:\n"); Output(chessboard); //顯示棋子狀態printf("按任意鍵計算機下子。\n"); getch(); } elseif (++SkipPlay < 2) //若無效下子的次數小于2 { fflush(stdin); //清除輸入緩沖區 printf("你沒位置可下,按Enter鍵讓對方下子。"); scanf("%c", &select); } elseprintf("雙方都沒地方下子,游戲結束!\n"); } else//若是計算機下棋(下黑子) { player = 1; if (Check(chessboard, isDown, 1)) //檢查是否可下白子 { SkipPlay = 0; //清除無效下子次數 AutoPlayStep(chessboard, isDown, 1); //計算機下一個白子 iCount++; //累加下子數printf("\n計算機下子后的狀態:\n"); Output(chessboard); //顯示棋子狀態 } else { if (++SkipPlay < 2) //若無效下子次數小于2 printf("我沒位置可走,請你走。\n"); elseprintf("雙方都沒地方下子,游戲結束!"); } } }while (iCount < 64 && SkipPlay < 2); //下子數量小于64 且無效下子的次數小于2 Output(chessboard); //顯示各雙方棋子的狀況 Score[0] = Score[1] = 0; //清空計分變量 for (row = 0; row < 8; row++) //循環統計各單元格黑白棋子的數量 { for (col = 0; col < 8; col++) { Score[0] += chessboard[row][col] == -1; //統計黑子數 Score[1] += chessboard[row][col] == 1; //統計白子數 } } printf("最終成績:\n"); printf("計算機:%d\n游戲者:%d\n", Score[0], Score[1]); fflush(stdin); //清空輸入緩沖區 printf("繼續下一局(y/n)?:"); scanf("%c", &select); }while (select == 'y' || select == 'Y'); printf("Game Over!\n"); getch(); return0; } void Output(char chessboard[][8]) //顯示棋盤上棋子的狀態 { int row, col; printf("\n "); for (col = 0; col < 8; col++) //輸出列標號 printf(" %c ", 'A' + col); printf("\n"); printf(" ┌"); //輸出項部橫線 for (col = 0; col < 7; col++) //輸出一行 printf("─┬"); printf("─┐\n"); for (row = 0; row < 8; row++) { printf("%2d│", row + 1); //輸出行號for (col = 0; col < 8; col++) //輸出棋盤各單元格中棋子的狀態 { if (chessboard[row][col] == 1) //白棋 printf("○│"); elseif (chessboard[row][col] == -1) //黑棋 printf("●│"); else//未下子處 printf(" │"); } printf("\n"); if (row < 8 - 1) { printf(" ├"); //輸出交叉線 for (col = 0; col < 8 - 1; col++) //輸出一行 printf("─┼"); printf("─┤\n"); } } printf(" └"); for (col = 0; col < 8 - 1; col++) //最后一行的橫線 printf("─┴"); printf("─┘\n"); } int Check(char chessboard[][8], int isDown[][8], char player) //檢查某一方是否還有下子的地方 { int rowdelta, coldelta, row, col, x, y = 0; int iStep = 0; char opponent = (player == 1) ? -1 : 1; //對方棋子 char myplayer = -1 * opponent; //我方棋子 for (row = 0; row < 8; row++) //將isDown數組全部清0 for (col = 0; col < 8; col++) isDown[row][col] = 0; for (row = 0; row < 8; row++) //循環判斷棋盤中哪些單元格可以下子 { for (col = 0; col < 8; col++) { if (chessboard[row][col] != 0) //若棋盤上對應位置不為空(表示已經有子) continue; //繼續處理下一個單元格 for (rowdelta = -1; rowdelta <= 1; rowdelta++) //循環檢查上下行 { for (coldelta = -1; coldelta <= 1; coldelta++) //循環檢查左右列 { if (row + rowdelta < 0 || row + rowdelta >= 8 || col + coldelta < 0 || col + coldelta >= 8 || (rowdelta == 0 && coldelta == 0)) //檢查若坐標超過棋盤 或為當前單元格 continue; //繼續循環 if (chessboard[row + rowdelta][col + coldelta] == opponent) //若(row,col)四周有對手下的子 { x = row + rowdelta; //以對手下子位置為坐標 y = col + coldelta; while(1) //對對手下子為起始點,向四周查找自己方的棋子,以攻擊對方棋子 { x += rowdelta; //對手下子的四周坐標 y += coldelta; if (x < 0 || x >= 8 || y < 0 || y >= 8) //超過棋盤 break; //退出循環 if (chessboard[x][y] == 0) //若對應位置為空 break; if (chessboard[x][y] == myplayer) //若對應位置下的子是當前棋手的 { isDown[row][col] = 1; //設置移動數組中對應位置為1 (該位置可下子,形成向對手進攻的棋形) iStep++; //累加可下子的位置數量 break; } } } } } } } return iStep; //返回可下的位置數量(若返回值為0,表示沒地方可下) } void PlayStep(char chessboard[][8], int row, int col, char player) //在指定位置下子 { int rowdelta = 0; int coldelta = 0; int x = 0; int y = 0; char opponent = (player == 1) ? -1 : 1; //對方棋子char myplayer = -1 * opponent; //我方棋子 chessboard[row][col] = myplayer; //保存所下的棋子for (rowdelta = -1; rowdelta <= 1; rowdelta++) //檢查所下子四周的棋子 { for (coldelta = -1; coldelta <= 1; coldelta++) { if (row + rowdelta < 0 || row + rowdelta >= 8 || col + coldelta < 0 || col + coldelta >= 8 || (rowdelta == 0 && coldelta == 0)) //若坐標超過棋盤界限 continue; //繼續下一位置 if (chessboard[row + rowdelta][col + coldelta] == opponent) //若該位置是對手的棋子 { x = row + rowdelta; //以對手棋為坐標 y = col + coldelta; while(1) //在對手棋子四周尋找我方棋子 { x += rowdelta; y += coldelta; if (x < 0 || x >= 8 || y < 0 || y >= 8) //若坐標超過棋盤 break; //退出循環 if (chessboard[x][y] == 0) //若對應位置為空 break; //退出循環 if (chessboard[x][y] == myplayer) //若對應位置是我方模子 { while (chessboard[x -= rowdelta][y -= coldelta] == opponent) //循環處理 chessboard[x][y] = myplayer; //將中間的棋子都變成我方棋子 break; //退出循環 } } } } } } int GetMaxScore(char chessboard[][8], char player) //獲取分數 { int Score, row, col; char opponent = (player == 1) ? -1 : 1; //對方棋子 char myplayer=-1*opponent; for (row = 0; row < 8; row++) //循環 { for (col = 0; col < 8; col++) { Score -= chessboard[row][col] == opponent; //若棋盤對應位置是對手下的棋子,從總分中減1 Score += chessboard[row][col] == myplayer; //若棋盤對應位置是我方的棋子,總分中加1分 } } return Score; //返回分數 } int BestPlay(char chessboard[][8], int isDown[][8], char player) //獲取最佳下子位置 { int row, col, i, j; char chessboard1[8][8] = { 0 }; //定義一個臨時數組 int MaxScore = 0; //保存最高分 int Score = 0; char opponent = (player == 1) ? -1 : 1; //對手下的棋子 for (row = 0; row < 8; row++) //循環檢查每個單元格 { for (col = 0; col < 8; col++) { if (!isDown[row][col]) //若該位置不可下子 continue; //繼續 for (i = 0; i < 8; i++) //復制棋盤各單元格下子的狀態到臨時數組 for (j = 0; j < 8; j++) chessboard1[i][j] = chessboard[i][j]; PlayStep(chessboard1, row, col, player); //在臨時數組中的指定行列下子 Score = GetMaxScore(chessboard1, player); //獲取下子后可得到的分數if (MaxScore < Score) //若原方案得到的分數小于本次下子的分數 MaxScore = Score; //保存最高分 } } return MaxScore; //返回得到的最高分 } void AutoPlayStep(char chessboard[][8], int isDown[][8], char player) //計算機自動下子 { int row, col, row1, col1, i, j; int Score = 0, MinScore = 100; //對方可下子提到的分數和最小分數 char chessboard1[8][8]; //臨時數組,保存棋盤下子位置 int isDown1[8][8]; //臨時數組,保存可下子位置 char opponent = (player == 1) ? -1 : 1; //對手下的棋子 for (row = 0; row < 8; row++) //循環檢查棋盤每個單元格 { for (col = 0; col < 8; col++) { if (isDown[row][col] == 0) //若不可下子 continue; //繼續下一個位置 for (i = 0; i < 8; i++) //將棋盤原來的棋子復制到臨時數組中 for (j = 0; j < 8; j++) chessboard1[i][j] = chessboard[i][j]; PlayStep(chessboard1, row, col, player); //試著在臨時棋盤中的一個位子下子 Check(chessboard1, isDown1, opponent); //檢查對手是否有地方可下子 Score = BestPlay(chessboard1, isDown1, opponent); //獲得臨時棋盤中對方下子的得分情況 if (Score < MinScore) //保存對方得分最低的下法 { MinScore = Score; row1 = row; col1 = col; } } } PlayStep(chessboard, row1, col1, player); //計算機按最優下法下子 }
轉載于:https://www.cnblogs.com/wozixiaoyao/p/5686057.html
總結
以上是生活随笔為你收集整理的8.5 趣味游戏(2)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: testflight如何加入测试
- 下一篇: leetcode 141. Linked