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

C語言實現井字棋(三子棋)遊戲:人機對戰完整版

     編輯:關於C語言

C語言實現井字棋(三子棋)遊戲:人機對戰完整版

經典 3×3 井字棋遊戲,玩家(@)與電腦(#)輪流落子,任意行、列、對角線連成三子者勝。本文提供完整、可運行的控制台實現。

遊戲架構設計

  • 棋盤表示:char board[3][3],空格表示空位
  • 狀態管理:全局變量 size 記錄剩余空位數
  • 模塊劃分:顯示、玩家落子、電腦落子、勝負判斷、主循環

核心函數實現

1. 棋盤顯示

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

2. 玩家落子(含輸入驗證)

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

3. 電腦落子(隨機策略)

void computer_move() {
    int x, y;
    printf("電腦(#):\n");
    do {
        x = rand() % 3;
        y = rand() % 3;
    } while (board[x][y] != ' ');
    board[x][y] = '#';
    size--;
}

4. 勝負判斷(8 條勝利線)

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

優化方向

  1. 電腦 AI:實現 Minimax 算法實現必勝/不敗策略
  2. 輸入健壯性:處理非數字輸入、緩衝區清理
  3. 代碼復用:提取檢查線條的通用函數
  4. 界面美化:添加顏色、座標提示、動畫效果
  5. 擴展性:支持 N×N 棋盤、雙人模式、網絡對戰
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved