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

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。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/981966.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

盛铂科技SCP4000射频微波功率计与SPP5000系列脉冲峰值 USB功率计 区别

在射频&#xff08;RF&#xff09;和微波测试领域&#xff0c;快速、精准的功率测量是确保通信系统、雷达、卫星设备等高性能运行的核心需求。无论是连续波&#xff08;CW&#xff09;信号的稳定性测试&#xff0c;还是脉冲信号的瞬态功率分析&#xff0c;工程师都需要轻量化、…

GCC RISCV 后端 -- cc1 入口

GCC编译工具链中的 gcc 可执行程序&#xff0c;实际上是个驱动程序&#xff08;Driver&#xff09;&#xff0c;其根据输入的参数&#xff0c;然后调用其它不同的程序&#xff0c;对输入文件进行处理&#xff0c;包括编译、链接等。可以通过以下命令查看&#xff1a; gcc -v h…

C++第二十讲:C++11

C第二十讲&#xff1a;C11 1.列表初始化1.1C98时的{}初始化1.2C11的新规{}初始化1.3initializer_list初始化 2.右值引用和移动语义2.1右值引用2.1.1左值和右值2.1.2左值引用和右值引用2.1.3引用延长声明周期2.1.4左值和右值的参数匹配 2.2右值引用和移动语义的使用2.2.1移动构造…

Finebi_求组内占比和组内累计占比

需求&#xff1a;原始数据结构如下&#xff0c;要求各每个月的各产品销量占比&#xff0c;至每月的各产品销量累计占比 实现步骤&#xff1a; ①维度拖入日期&#xff0c;按年月分组 ②各产品销量占比DEF(SUM_AGG(${&#xfeff;产品销量表&#xfeff;_&#xfeff;销量&…

PE文件结构详解(DOS头/NT头/节表/导入表)使用010 Editor手动解析notepad++.exe的PE结构

一&#xff1a;DOS部分 DOS部分分为DOS MZ文件头和DOS块&#xff0c;其中DOS MZ头实际是一个64位的IMAGE_DOS——HEADER结构体。 DOS MZ头部结构体的内容如下&#xff0c;我们所需要关注的是前面两个字节&#xff08;e_magic&#xff09;和后面四个字节&#xff08;e_lfanew&a…

自由学习记录(41)

代理服务器的核心功能是在客户端&#xff08;用户设备&#xff09;和目标服务器&#xff08;网站/资源服务器&#xff09;之间充当“中介”&#xff0c;具体过程如下&#xff1a; 代理服务器的工作流程 当客户端希望访问某个网站&#xff08;比如 example.com&#xff09;时&…

学习工具的一天之(burp)

第一呢一定是先下载 【Java环境】&#xff1a;Java Downloads | Oracle 下来是burp的下载 Download Burp Suite Community Edition - PortSwigger 【下载方法二】关注的一个博主 【BurpSuite 安装激活使用详细上手教程 web安全测试工具】https://www.bilibili.com/video/BV…

大模型gpt结合drawio绘制流程图

draw下载地址 根据不同操作系统选择不同的安装 截图给gpt 并让他生成drawio格式的&#xff0c;选上推理 在本地将生成的内容保存为xml格式 使用drawio打开 保存的xml文件 只能说效果一般。

K8S学习之基础六:k8s中pod亲和性

Pod节点亲和性和反亲和性 podaffinity&#xff1a;pod节点亲和性指的是pod会被调度到更趋近与哪个pod或哪类pod。 podunaffinity&#xff1a;pod节点反亲和性指的是pod会被调度到远离哪个pod或哪类pod 1. Pod节点亲和性 requiredDuringSchedulingIgnoredDuringExecution&am…

FPGA学习篇——Verilog学习4

1.1 结构语句 结构语句主要是initial语句和always语句&#xff0c;initial 语句它在模块中只执行一次&#xff0c;而always语句则不断重复执行&#xff0c;以下是一个比较好解释的图: (图片来源于知乎博主罗成&#xff0c;画的很好很直观&#xff01;) 1.1.1 initial语句 ini…

[Computer Vision]图像分割技术

一、技术介绍 1.1 GrabCut 算法 1.1.1 算法原理 GrabCut 算法是一种交互式的图像分割方法,整体流程围绕着用户提供的少量先验信息(如用矩形框大致框选前景区域等),通过构建图模型、拟合高斯混合模型,利用图割算法不断迭代优化,实现了一种有效的交互式图像分割,最终将…

原型链与继承

#搞懂还是得自己动手# 原型链 function Person(name) { this.name name; } Person.prototype.sayName function() { console.log(this.name); };const p new Person("Alice"); 原型链关系图&#xff1a; 原型链&#xff1a;person->Person.prototype->O…

MagicDriveDiT:具有自适应控制的自动驾驶高分辨率长视频生成

24年11月来自香港中文大学、香港科技大学和华为公司的论文“MagicDriveDiT: High-Resolution Long Video Generation for Autonomous Driving with Adaptive Control”。 扩散模型的快速进步极大地改善视频合成&#xff0c;特别是可控视频生成&#xff0c;这对于自动驾驶等应用…

YOLOv8 自定义目标检测

一、引言 YOLOv8 不仅支持预训练模型的推理&#xff0c;还允许用户将其应用于自定义对象检测。本文将详细介绍如何使用 YOLOv8 训练一个新的模型&#xff0c;并在自定义数据集上进行对象检测。 二、数据集准备 1. 数据集格式 YOLOv8 支持多种数据集格式&#xff0c;包括 CO…

Node JS 调用模型Xenova_all-MiniLM-L6-v2实战

本篇通过将句子数组转换为句子的向量表示&#xff0c;并通过平均池化和归一化处理&#xff0c;生成适合机器学习或深度学习任务使用的特征向量为例&#xff0c;演示通过NodeJS 的方式调用Xenova/all-MiniLM-L6-v2 的过程。 关于 all-MiniLM-L6-v2 的介绍&#xff0c;可以参照上…

记录一次Spring事务失效导致的生产问题

一、背景介绍 公司做的是“聚合支付”业务&#xff0c;对接了微信、和包、数字人民币等等多家支付机构&#xff0c;我们提供统一的支付、退款、自动扣款签约、解约等能力给全国的省公司、机构、商户等。 同时&#xff0c;需要做对账功能&#xff0c;即支付机构将对账文件给到…

AORO P9000 PRO三防平板携手RTK高精度定位,电力巡检效率倍增

电网系统覆盖幅员辽阔&#xff0c;每年因设备故障导致的巡检耗时超过百万工日。传统巡检模式受限于定位误差、设备防护不足和作业效率低下三大核心痛点&#xff0c;亟需智能化工具的突破性革新。为了满足这一需求&#xff0c;遨游通讯推出AORO P9000 PRO三防平板&#xff0c;以…

开启AI短剧新纪元!SkyReels-V1/A1双剑合璧!昆仑万维开源首个面向AI短剧的视频生成模型

论文链接&#xff1a;https://arxiv.org/abs/2502.10841 项目链接&#xff1a;https://skyworkai.github.io/skyreels-a1.github.io/ Demo链接&#xff1a;https://www.skyreels.ai/ 开源地址&#xff1a;https://github.com/SkyworkAI/SkyReels-A1 https://github.com/Skywork…

CentOS 7中安装Dify

Dify 是一个开源的 LLM 应用开发平台。其直观的界面结合了 AI 工作流、RAG 管道、Agent、模型管理、可观测性功能等&#xff0c;让您可以快速从原型到生产。尤其是我们本地部署DeepSeek等大模型时&#xff0c;会需要用到Dify来帮我们快捷的开发和应用。 大家可以参考学习它的中…

【Day9】make/makeFile如何让项目构建自动化起飞

【Day9】make/makeFile如何让项目构建自动化起飞 使用make命令编写makefile文件依赖管理增量构建makefile注释&#xff1a;#makefile其他语法 make/makefile递归式工作过程 在Linux中&#xff0c;项目自动化构建是指使用一系列工具和脚本来自动执行软件项目的编译、测试、打包和…