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

C語言實作井字棋遊戲:模組化設計與完整程式碼教學

     編輯:關於C

專案概覽

本文實作一個完整的井字棋遊戲,玩家('Y')與電腦('O')輪流下棋,先連成一直線者勝。程式碼採用模組化函式設計,包含棋盤初始化、顯示、玩家輸入、電腦簡單 AI、勝負判斷等模組。

核心資料結構

char chess_arr[3][3]; // 棋盤狀態:' ' 空位, 'Y' 玩家, 'O' 電腦

模組功能詳細解析

1. 棋盤初始化與顯示

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");
}

2. 玩家下棋輸入

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);
    }
}

※ 原碼座標檢查邏輯有誤(未檢查上界),此處已修正。

3. 電腦下棋策略(簡易版)

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 或啟發式評分。

4. 勝負判斷邏輯

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;
}

5. 主遊戲迴圈

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;
}

程式碼優化建議

  1. 輸入健全性:`scanf` 失敗時需清空輸入緩衝區,避免無限迴圈。
  2. 電腦 AI 強化:實作 Minimax 演算法或簡單啟發式(優先中間、角落、阻擋玩家連線)。
  3. 模組化拆分:將各函式移至獨立 `.c/.h` 檔案,主程式只負責流程控制。
  4. 跨平台暫停:替換 `system("pause")` 為 `getchar()` 組合。
  5. 重新遊戲功能:外層加入 `do-while` 迴圈支援連續對戰。

完整可編譯程式碼

#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 語言實作,從基礎版進化到具備基本策略的電腦對手。重點展示模組化設計、輸入驗證、勝負判斷等核心技巧,適合初學者練習陣列操作、函式分解與遊戲迴圈邏輯。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved