五子棋規則簡單但變化豐富,是練習 C 語言陣列、輸入處理、邏輯判斷的絕佳項目。本文提供一個在 Linux 終端運行的雙人對戰版本,支援悔棋、退出、動態刷新棋盤。
create_board():初始化 20×20 棋盤,空位標記 '-'。print_board():system("clear") 刷屏,打印座標軸與棋子 (白方 X、黑方 O)。print_info():提示當前落子方、輸入錯誤、勝利訊息。play_chess():讀取座標 x,y,支援 q 退出、r 悔棋,合法性校驗(越界、有子、格式)。check_board():從落子點向 4 個方向 (橫、豎、兩對角) 掃描連珠,≥5 判勝,否則切換玩家。int play_chess(char board[N][N], int *player, int *x, int *y) {
printf("Input position(x,y): ");
if (scanf("%d,%d", x, y) != 2) { // 格式錯誤
char c = getchar();
if (c == 'q') return 2; // 退出
if (c == 'r') { // 悔棋
if (board[*x][*y] == '-') return -1;
board[*x][*y] = '-';
*player = (*player + 1) % 2;
return 3; // 繼續循環,不切換玩家
}
return -1;
}
// 越界/有子檢查...
board[*x][*y] = (*player == 0) ? 'X' : 'O';
return 0;
}
int check_board(char board[N][N], int *player, int x, int y) {
int dirs[4][2] = {{0,1}, {1,1}, {1,0}, {1,-1}}; // 右、右下、下、左下
for (int d = 0; d < 4; ++d) {
int cnt = 1;
for (int s = -1; s <= 1; s += 2) { // 正反兩方向
int nx = x, ny = y;
while (true) {
nx += s * dirs[d][0];
ny += s * dirs[d][1];
if (nx<0 || nx>=N || ny<0 || ny>=N || board[nx][ny] != board[x][y]) break;
++cnt;
}
}
if (cnt >= 5) return 1; // 勝利
}
*player = (*player + 1) % 2;
return 0;
}
#include
#include
#define N 20
void create_board(char (*board)[N]);
void print_board(char (*board)[N]);
void print_info(int flag, int player);
int play_chess(char (*board)[N], int *player, int *x, int *y);
int check_board(char (*board)[N], int *player, int x, int y);
int main() {
char board[N][N];
int player = 0, flag = 0, x = 0, y = 0;
create_board(board);
while (1) {
print_board(board);
print_info(flag, player);
if (flag == 1) break; // 勝利退出
flag = play_chess(board, &player, &x, &y);
if (flag == -1 || flag == 3) continue; // 輸入錯誤/悔棋
if (flag == 2) return 0; // 退出
flag = check_board(board, &player, x, y);
}
return 0;
}
// ... 其餘函數實現見上文 ...
gcc wuziqi.c -o wuziqi
./wuziqi
終端顯示帶座標的棋盤,輸入如 10,10 落子,r 悔棋,q 退出。