本文實作一個完整的井字棋遊戲,玩家('Y')與電腦('O')輪流下棋,先連成一直線者勝。程式碼採用模組化函式設計,包含棋盤初始化、顯示、玩家輸入、電腦簡單 AI、勝負判斷等模組。
char chess_arr[3][3]; // 棋盤狀態:' ' 空位, 'Y' 玩家, 'O' 電腦
void init_chess(char (*chess_arr)[3]) {
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
chess_arr[i][j] = ' ';
// 印出初始空棋盤
for (int i = 0; i < 3; i++) {
printf(" %c | %c | %c", chess_arr[i][0], chess_arr[i][1], chess_arr[i][2]);
if (i != 2) printf("\n---|---|---\n");
}
printf("\n");
}
void input_player(char (*chess_arr)[3]) {
int x, y;
printf("請下您的棋(行 列,0-2):");
scanf("%d%d", &x, &y);
if (x < 0 || x > 2 || y < 0 || y > 2 || chess_arr[x][y] != ' ') {
printf("該位置無效或已被佔用!\n");
input_player(chess_arr); // 遞迴重輸入
} else {
chess_arr[x][y] = 'Y';
print_board(chess_arr);
}
}
※ 原碼座標檢查邏輯有誤(未檢查上界),此處已修正。
void input_computer(char (*chess_arr)[3]) {
// 策略:掃描第一個空位即下棋(無智慧)
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
if (chess_arr[i][j] == ' ') {
chess_arr[i][j] = 'O';
print_board(chess_arr);
return;
}
}
此為「笨電腦」,進階可改用 Minimax 或啟發式評分。
int check_win(char (*chess_arr)[3], char player) {
// 檢查 3 行、3 列、2 斜
for (int i = 0; i < 3; i++) {
if (chess_arr[i][0] == player && chess_arr[i][1] == player && chess_arr[i][2] == player) return 1;
if (chess_arr[0][i] == player && chess_arr[1][i] == player && chess_arr[2][i] == player) return 1;
}
if (chess_arr[0][0] == player && chess_arr[1][1] == player && chess_arr[2][2] == player) return 1;
if (chess_arr[0][2] == player && chess_arr[1][1] == player && chess_arr[2][0] == player) return 1;
return 0;
}
int is_draw(char (*chess_arr)[3]) {
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
if (chess_arr[i][j] == ' ') return 0;
return 1;
}
int main() {
char board[3][3];
init_chess(board);
while (1) {
input_player(board);
if (check_win(board, 'Y')) { printf("Player wins!\n"); break; }
if (is_draw(board)) { printf("Draw!\n"); break; }
input_computer(board);
if (check_win(board, 'O')) { printf("Computer wins!\n"); break; }
if (is_draw(board)) { printf("Draw!\n"); break; }
}
system("pause");
return 0;
}
#include#include void print_board(char b[3][3]) { for (int i = 0; i < 3; i++) { printf(" %c | %c | %c", b[i][0], b[i][1], b[i][2]); if (i != 2) printf("\n---|---|---\n"); } printf("\n"); } void init_board(char b[3][3]) { for (int i = 0; i < 3; i++) for (int j = 0; j < 3; j++) b[i][j] = ' '; print_board(b); } void player_move(char b[3][3]) { int x, y; while (1) { printf("Your move (row col 0-2): "); if (scanf("%d %d", &x, &y) != 2) { while (getchar() != '\n'); // 清緩衝 printf("Invalid input!\n"); continue; } if (x >= 0 && x < 3 && y >= 0 && y < 3 && b[x][y] == ' ') { b[x][y] = 'Y'; print_board(b); return; } printf("Invalid position!\n"); } } void computer_move(char b[3][3]) { // 簡單策略:優先中間 -> 角落 -> 邊緣 int best[4][2] = {{1,1}, {0,0}, {0,2}, {2,0}, {2,2}, {0,1}, {1,0}, {1,2}, {2,1}}; for (int k = 0; k < 9; k++) { int x = best[k][0], y = best[k][1]; if (b[x][y] == ' ') { b[x][y] = 'O'; printf("Computer moves to (%d,%d)\n", x, y); print_board(b); return; } } } int check_win(char b[3][3], char p) { for (int i = 0; i < 3; i++) if ((b[i][0]==p && b[i][1]==p && b[i][2]==p) || (b[0][i]==p && b[1][i]==p && b[2][i]==p)) return 1; if ((b[0][0]==p && b[1][1]==p && b[2][2]==p) || (b[0][2]==p && b[1][1]==p && b[2][0]==p)) return 1; return 0; } int is_full(char b[3][3]) { for (int i = 0; i < 3; i++) for (int j = 0; j < 3; j++) if (b[i][j] == ' ') return 0; return 1; } int main() { char board[3][3]; init_board(board); while (1) { player_move(board); if (check_win(board, 'Y')) { puts("You win!"); break; } if (is_full(board)) { puts("Draw!"); break; } computer_move(board); if (check_win(board, 'O')) { puts("Computer wins!"); break; } if (is_full(board)) { puts("Draw!"); break; } } return 0; }
本文提供井字棋的完整 C 語言實作,從基礎版進化到具備基本策略的電腦對手。重點展示模組化設計、輸入驗證、勝負判斷等核心技巧,適合初學者練習陣列操作、函式分解與遊戲迴圈邏輯。