【简单的C++围棋游戏开发示例】

发布于:2025-03-06 ⋅ 阅读:(16) ⋅ 点赞:(0)

C++围棋游戏开发简单示例(控制台版)

‌核心代码实现‌


#include <iostream>
#include <vector>
#include <queue>
using namespace std;

const int SIZE = 9;  // 简化棋盘为9x9‌:ml-citation{ref="1" data="citationList"}
int board[SIZE][SIZE] = {0};  // 0:空 1:黑 2:白‌:ml-citation{ref="1,2" data="citationList"}
pair<int, int> lastRemoved = {-1, -1};  // 记录上一步提子位置(简化打劫规则)‌:ml-citation{ref="1" data="citationList"}

// 显示棋盘
void displayBoard() {
    cout << "  ";
    for (int i = 0; i < SIZE; i++) cout << i << " ";
    cout << "\n";
    for (int y = 0; y < SIZE; y++) {
        cout << y << " ";
        for (int x = 0; x < SIZE; x++) {
            char c = (board[y][x] == 1) ? 'B' : (board[y][x] == 2) ? 'W' : '+';
            cout << c << " ";
        }
        cout << "\n";
    }
}

// 检查坐标合法性
bool isValid(int x, int y) {
    return x >= 0 && x < SIZE && y >= 0 && y < SIZE;
}

// BFS计算气(Liberty)
int calculateLiberty(int x, int y, int color) {
    bool visited[SIZE][SIZE] = {false};
    queue<pair<int, int>> q;
    q.push({x, y});
    visited[y][x] = true;
    int liberty = 0;

    vector<pair<int, int>> dirs = {{0,1}, {1,0}, {0,-1}, {-1,0}};
    while (!q.empty()) {
        auto [cx, cy] = q.front();
        q.pop();

        for (auto [dx, dy] : dirs) {
            int nx = cx + dx, ny = cy + dy;
            if (!isValid(nx, ny) || visited[ny][nx]) continue;
            if (board[ny][nx] == 0) liberty++;
            else if (board[ny][nx] == color) {
                visited[ny][nx] = true;
                q.push({nx, ny});
            }
        }
    }
    return liberty;
}

// 提子逻辑
void removeGroup(int x, int y, int color) {
    queue<pair<int, int>> q;
    q.push({x, y});
    board[y][x] = 0;

    vector<pair<int, int>> dirs = {{0,1}, {1,0}, {0,-1}, {-1,0}};
    while (!q.empty()) {
        auto [cx, cy] = q.front();
        q.pop();

        for (auto [dx, dy] : dirs) {
            int nx = cx + dx, ny = cy + dy;
            if (isValid(nx, ny) && board[ny][nx] == color) {
                board[ny][nx] = 0;
                q.push({nx, ny});
            }
        }
    }
}

// 落子逻辑
bool placeStone(int x, int y, int color) {
    if (!isValid(x, y) || board[y][x] != 0) return false;

    board[y][x] = color;
    vector<pair<int, int>> dirs = {{0,1}, {1,0}, {0,-1}, {-1,0}};

    // 检查周围敌方棋子是否无气
    for (auto [dx, dy] : dirs) {
        int nx = x + dx, ny = y + dy;
        if (isValid(nx, ny) && board[ny][nx] != 0 && board[ny][nx] != color) {
            if (calculateLiberty(nx, ny, board[ny][nx]) == 0) {
                removeGroup(nx, ny, board[ny][nx]);
                lastRemoved = {x, y};  // 记录提子位置‌:ml-citation{ref="1" data="citationList"}
            }
        }
    }

    // 检查自身棋子是否存活
    if (calculateLiberty(x, y, color) == 0) {
        board[y][x] = 0;  // 自杀规则
        return false;
    }
    return true;
}

int main() {
    int currentPlayer = 1;  // 黑方先手
    while (true) {
        displayBoard();
        int x, y;
        cout << "玩家" << ((currentPlayer == 1) ? "黑(B)" : "白(W)") << "输入坐标(x y): ";
        cin >> x >> y;

        if (placeStone(x, y, currentPlayer)) {
            currentPlayer = (currentPlayer == 1) ? 2 : 1;  // 切换玩家‌:ml-citation{ref="3" data="citationList"}
        } else {
            cout << "落子无效,请重新输入!\n";
        }
    }
    return 0;
}

核心功能说明‌

1.棋盘初始化‌

使用9x9简化棋盘,通过二维数组board存储状态‌12。
符号B表示黑子,W表示白子,+表示空位‌3。

2‌.落子与提子‌

通过placeStone()函数实现落子合法性检查,包括自杀规则和敌方提子逻辑‌12。
使用BFS算法计算棋子群的气,气为0时触发removeGroup()提子‌14。

3.交互与显示‌

控制台输入坐标,动态更新棋盘状态‌3。
简化打劫规则:仅记录最后一次提子位置(未完全实现劫争判断)‌1。

4.编译与运行‌

‌环境要求‌

支持C++11标准的编译器(如GCC/Clang/Visual Studio)‌13。
控制台模式下直接运行,无需图形库依赖‌3。

5.操作说明‌

输入坐标格式为x y(例如3 4表示第3列第4行)。
若落子位置无效(如已有棋子或导致自杀),提示重新输入‌3。

6.扩展方向‌

‌规则完善‌
增加劫争判断:通过lastRemoved变量阻止立即回提‌1。
实现胜负判定:通过计算领地或活子数量‌24。


网站公告

今日签到

点亮在社区的每一天
去签到