功能完整的井字棋:主菜單、先後手選擇、棋盤顯示、玩家落子、簡單電腦 AI(首個空位)、勝負判斷、重新遊戲。
void menu() { ... } // 歡迎菜單
void order() { ... } // 先後手選擇
void init(char a[3][3]) { ... } // 初始化棋盤
void print(char a[3][3]) { ... } // 顯示棋盤
void play(char a[3][3], int x, int y) { ... } // 玩家落子
void computer(char a[3][3]) { ... } // 電腦落子(首空位策略)
int check(char a[3][3]) { ... } // 勝負判斷(返回 1玩家勝 0電腦勝)
int main() {
char board[3][3];
int choice, first;
while (1) {
menu();
scanf("%d", &choice);
if (choice == 0) break;
order();
scanf("%d", &first);
init(board);
print(board);
if (first == 0) goto computer_first; // 原代碼用 goto
while (1) {
// 玩家回合
scanf("%d%d", &x, &y);
play(board, x, y);
if (check(board) == 1) { printf("你贏了!\n"); break; }
computer_first:
// 電腦回合
computer(board);
if (check(board) == 0) { printf("你輸了!\n"); break; }
}
}
}
goto 處理先後手,建議重構為狀態機check 函數未處理平局返回// 狀態機替代 goto
typedef enum { PLAYER_TURN, COMPUTER_TURN } Turn;
Turn turn = first ? PLAYER_TURN : COMPUTER_TURN;
while (game_running) {
if (turn == PLAYER_TURN) {
// 玩家邏輯
turn = COMPUTER_TURN;
} else {
// 電腦邏輯
turn = PLAYER_TURN;
}
// 統一檢查勝負
}