AI人工智慧報告 黑白棋 班級:資工四乙 學號:498G0009 姓名:盧冠妤
摘 要 黑白棋(也叫翻轉棋)的棋盤是一個有8*8方格的棋盤。下棋時將棋下在空格中間,而不是像圍棋一樣下在交叉點上。開始時在棋盤正中有兩白兩黑四個棋子交叉放置,黑棋總是先下子。 下子的方法:把自己顏色的棋子放在棋盤的空格上,而當自己放下的棋子在橫、豎、斜八個方向內有一個自己的棋子,則被夾在中間的全部翻轉會成為自己的棋子。並且,只有在可以翻轉棋子的地方才可以下子。
遊戲規則 棋盤共有8行8列共64格。開局時,棋盤正中央的4格先置放黑白相隔的4枚棋子(亦有求變化相鄰放置)。通常黑子先行。雙方輪流落子。只要落子和棋盤上任一枚己方的棋子在一條線上(橫、直、斜線皆可)夾著對方棋子,就能將對方的這些棋子轉變為我己方(翻面即可)。如果在任一位置落子都不能夾住對手的任一顆棋子,就要讓對手下子。當雙方皆不能下子時,遊戲就結束,子多的一方勝。
遊戲策略 因為黑白棋獨特的規則,很容易出現雙方比分的劇烈變化,在遊戲後期可能僅用幾個回合就將大量對方棋子變成己方,從而扭轉局勢。因此,太著眼於比分是沒有必要的,更重要的是佔據有利位置。 中間位置的棋子最容易受到夾擊,有橫、直、斜線共四個方向的可能。而邊緣的棋子則只有一個可能被夾擊的方向,四個角落上的位置被佔據後,則完全不可能被攻擊。 遊戲的後期是關鍵位置的爭奪,而前期的布局,就是為搶佔關鍵位置作準備。比如,若不想讓對方佔據棋盤邊緣的有利位置,那麼自己就應避免在靠近邊緣的那一排落子。
程式碼 int judge(int x, int y, char a) // 判斷當前是否可以落下,同draw函數 { if(map[x][y]) // 如果當前不是空的返回0值 return 0; char b = T(a); int i, x1, y1; int n = 0, sign; for (i = 0; i < 8; i++) sign = 0; x1 = x + move[i][0]; y1 = y + move[i][1]; while (0 <= x1 && x1 < 8 && 0 <= y1 && y1 < 8 && map[x1][y1]) if(map[x1][y1] == b) sign++;
else { n += sign; break; } x1 += move[i][0]; y1 += move[i][1]; return n; // 返回可吃棋數 bool baidu(char c) // 判斷是否有棋可吃 int x, y; for(x = 0; x < 8; x++) for(y = 0; y < 8; y++) if(judge(x, y, c)) return true; return false;
bool quit(char c) // 判斷是否有棋存活 { int x, y; bool b = false, w = false; for(x = 0; x < 8; x++) for(y = 0; y < 8; y++) if(map[x][y] == c) return false; } return true; bool ask(void) // 彈出對話框
if(black == white) key = MessageBox(wnd, str, "和局", MB_YESNO | MB_ICONQUESTION); else if(black > white) key = MessageBox(wnd, str, "黑勝", MB_YESNO | MB_ICONQUESTION); else key = MessageBox(wnd, str, "白勝", MB_YESNO | MB_ICONQUESTION); if(key == IDYES) return true; return false; }
int D(char c, int step) { // 判斷是否结束遞回 if (step > difficult) // 約束步數之内 return 0; if (!baidu(c)) if (baidu(T(c))) return -D(T(c), step); else } int i, j, max = 0, temp, x, y; bool ans = false;
DEMO