首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

C語言終端版五子棋實現:完整源碼與模組化設計

     編輯:關於C

五子棋規則簡單但變化豐富,是練習 C 語言陣列、輸入處理、邏輯判斷的絕佳項目。本文提供一個在 Linux 終端運行的雙人對戰版本,支援悔棋、退出、動態刷新棋盤。

功能模組劃分

  1. create_board():初始化 20×20 棋盤,空位標記 '-'。
  2. print_board():system("clear") 刷屏,打印座標軸與棋子 (白方 X、黑方 O)。
  3. print_info():提示當前落子方、輸入錯誤、勝利訊息。
  4. play_chess():讀取座標 x,y,支援 q 退出、r 悔棋,合法性校驗(越界、有子、格式)。
  5. 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;
}

完整源碼 (wuziqi.c)


#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 退出。

可擴展方向

  • AI 對戰:引入極小極大算法 + Alpha-Beta 剪枝。
  • 網絡對戰:Socket 通訊同步棋盤狀態。
  • 圖形界面:移植到 Qt/SDL/raylib 實現圖形化。
  • 規則擴展:禁手判斷(長連、三三、四四)、棋譜保存/回放。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved