經典 3×3 井字棋遊戲,玩家(@)與電腦(#)輪流落子,任意行、列、對角線連成三子者勝。本文提供完整、可運行的控制台實現。
char board[3][3],空格表示空位size 記錄剩余空位數void print_board() {
printf(" | | \n");
for (int i = 0; i < 3; i++) {
printf("_%c_|_%c_|_%c_\n", board[i][0], board[i][1], board[i][2]);
if (i < 2) printf(" | | \n");
}
}
void player_move() {
int x, y;
printf("玩家(@):");
scanf("%d %d", &x, &y);
if (x < 1 || x > 3 || y < 1 || y > 3 || board[x-1][y-1] != ' ') {
printf("座標非法!請重新輸入。\n");
player_move(); // 遞歸重試
return;
}
board[x-1][y-1] = '@';
size--;
}
void computer_move() {
int x, y;
printf("電腦(#):\n");
do {
x = rand() % 3;
y = rand() % 3;
} while (board[x][y] != ' ');
board[x][y] = '#';
size--;
}
int check_winner() {
// 檢查玩家勝利
if ((board[0][0]==board[0][1]&&board[0][1]==board[0][2]&&board[0][2]=='@') ||
(board[1][0]==board[1][1]&&board[1][1]==board[1][2]&&board[1][2]=='@') ||
(board[2][0]==board[2][1]&&board[2][1]==board[2][2]&&board[2][2]=='@') ||
(board[0][0]==board[1][0]&&board[1][0]==board[2][0]&&board[2][0]=='@') ||
(board[0][1]==board[1][1]&&board[1][1]==board[2][1]&&board[2][1]=='@') ||
(board[0][2]==board[1][2]&&board[1][2]==board[2][2]&&board[2][2]=='@') ||
(board[0][0]==board[1][1]&&board[1][1]==board[2][2]&&board[2][2]=='@') ||
(board[0][2]==board[1][1]&&board[1][1]==board[2][0]&&board[2][0]=='@'))
return 1; // 玩家勝
// 檢查電腦勝利(同理,換為 '#')
if (/* 8 條線檢查 '#' */) return 0; // 電腦勝
if (size == 0) return -1; // 平局
return 2; // 遊戲繼續
}
int main() {
srand(time(NULL));
// 初始化棋盤
for (int i=0; i<3; i++)
for (int j=0; j<3; j++)
board[i][j] = ' ';
while (1) {
print_board();
int result = check_winner();
if (result != 2) break;
player_move();
print_board();
result = check_winner();
if (result != 2) break;
computer_move();
}
print_board();
if (check_winner() == 1) printf("玩家獲勝!\n");
else if (check_winner() == 0) printf("電腦獲勝!\n");
else printf("平局!\n");
system("pause");
return 0;
}