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

C語言實作井字棋:結構化設計與完整程式碼

     編輯:關於C

專案架構

本程式將井字棋拆分為獨立函式模組,採用結構化程式設計風格,包含:棋盤初始化、顯示、玩家輸入驗證、電腦簡易 AI、勝負判斷、主迴圈控制。

核心函式設計

資料結構

int Arr[3][3]; // 0:空, 'X':玩家, '0':電腦(注意:原碼用字元 '0' 非數字 0)

Init_Arr / Print_Checkerboard

void Init_Arr(int arr[][3]) {
    for (int i = 0; i < 3; i++)
        for (int j = 0; j < 3; j++)
            arr[i][j] = ' ';
}

void Print_Checkerboard(int arr[][3]) {
    for (int i = 0; i < 3; i++) {
        printf("\t\t %c | %c | %c \n", arr[i][0], arr[i][1], arr[i][2]);
        if (i < 2) printf("\t\t---|---|---\n");
    }
}

Player(玩家下棋)

int Player(int arr[][3], int line, int list) {
    // 座標 1-based 轉 0-based
    if (line >= 1 && line <= 3 && list >= 1 && list <= 3) {
        if (arr[line-1][list-1] == ' ') {
            arr[line-1][list-1] = 'X';
            return 1; // 成功
        }
    }
    return 0; // 失敗:座標錯誤或已佔用
}

Robot(電腦下棋 - 簡易版)

void Robot(int *arr) {
    // 將二維陣列視為一維掃描第一個空位
    for (int i = 0; i < 9; i++)
        if (arr[i] == ' ') { arr[i] = '0'; break; }
}

Judge(勝負判斷)

int Judge(int arr[][3]) {
    // 檢查玩家 'X' 勝利
    for (int i = 0; i < 3; i++) {
        if ((arr[i][0]==arr[i][1] && arr[i][1]==arr[i][2] && arr[i][0]=='X') ||
            (arr[0][i]==arr[1][i] && arr[1][i]==arr[2][i] && arr[0][i]=='X')) return 1;
    }
    if ((arr[0][0]==arr[1][1] && arr[0][0]==arr[2][2] && arr[0][0]=='X') ||
        (arr[0][2]==arr[1][1] && arr[1][1]==arr[2][0] && arr[0][2]=='X')) return 1;

    // 檢查電腦 '0' 勝利
    for (int i = 0; i < 3; i++) {
        if ((arr[i][0]==arr[i][1] && arr[i][1]==arr[i][2] && arr[i][0]=='0') ||
            (arr[0][i]==arr[1][i] && arr[1][i]==arr[2][i] && arr[0][i]=='0')) return 2;
    }
    if ((arr[0][0]==arr[1][1] && arr[0][0]==arr[2][2] && arr[0][0]=='0') ||
        (arr[0][2]==arr[1][1] && arr[1][1]==arr[2][0] && arr[0][2]=='0')) return 2;

    // 平手檢查
    int flag = 0;
    for (int i = 0; i < 3; i++)
        for (int j = 0; j < 3; j++)
            if (arr[i][j] != ' ') flag++;
    if (flag == 9) return 3;

    return 0; // 遊戲繼續
}

主程式流程

int main() {
    int Arr[3][3], x, y, result, Result;
    Init_Arr(Arr);
    Print_Checkerboard(Arr);
    printf("Welcome to play the Checkboard Game!\n");

    while (1) {
        printf("Enter X,Y coordinates for your move: ");
        scanf("%d %d", &x, &y);
        Result = Player(Arr, x, y);
        if (Result) {
            Robot(&Arr[0][0]);
            Print_Checkerboard(Arr);
            result = Judge(Arr);
            if (result == 1) { printf("The player win!\n\n"); break; }
            if (result == 2) { printf("The robot win!\n\n"); break; }
            if (result == 3) { printf("Peace!\n\n"); break; }
        } else {
            printf("Can not next chess here!\n");
        }
    }
    system("pause");
    return 0;
}

程式碼優化重點

  1. 統一棋子表示:建議用 `'X'`、`'O'`(大寫 O)而非 `'0'`(數字零),避免視覺混淆。
  2. 輸入緩衝區清理:`scanf` 失敗時需 `while(getchar()!='\n');` 防止無限迴圈。
  3. 電腦 AI 強化:現版本單純掃描第一空位,極易獲勝。建議加入:
    • 優先佔據中心 (1,1)
    • 阻擋玩家即將連線
    • 嘗試自己連線
    • Minimax 演算法實現完美 AI
  4. 模組化拆檔:將各函式移至 `board.c/h`、`player.c/h`、`ai.c/h`、`judge.c/h`,`main.c` 只負責流程。
  5. 跨平台暫停:`system("pause")` 僅 Windows 可用,改用 `printf("Press Enter..."); getchar(); getchar();`。

完整可編譯優化版

#include 
#include 

#define EMPTY ' '
#define PLAYER 'X'
#define COMPUTER 'O'

void init_board(char b[3][3]);
void print_board(char b[3][3]);
int player_move(char b[3][3]);
void computer_move(char b[3][3]);
int check_winner(char b[3][3]);
int is_draw(char b[3][3]);

int main() {
    char board[3][3];
    init_board(board);
    print_board(board);

    while (1) {
        if (player_move(board)) {
            print_board(board);
            if (check_winner(board) == PLAYER) { puts("You win!"); break; }
            if (is_draw(board)) { puts("Draw!"); break; }

            computer_move(board);
            print_board(board);
            if (check_winner(board) == COMPUTER) { puts("Computer wins!"); break; }
            if (is_draw(board)) { puts("Draw!"); break; }
        }
    }
    return 0;
}

// ... 實作各函式(略,參考上述邏輯)

總結

本程式展示了結構化 C 程式設計的典型模式:資料與函式分離、單一職責原則、主迴圈控制流程。雖然電腦 AI 極簡單,但架構清晰,極易擴展為完美 AI 或圖形介面版本。適合作為 C 語言期末專案或教學範例。

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