一步一步实现一个完整的围棋游戏

一、画棋盘

 

可以理解为简单的字符画技巧:第一行、中间与最后一行不同;对于每一行,第一列,中间与最后一列不同。

画星位是有一点技巧的,重点理解这个公式的含义: ((i-4)%6==0 && (j-4)%6==0)

#include<iostream>
using namespace std;
int main(){cout<<"●○"<< endl;// 第1行 cout << "┏ ";for (int i=2; i<=18; i++){cout << "┯ ";}cout << "┓ "<< endl;// 中间17行 for (int i=1; i<=19; i++){cout << "┠ ";for (int j=2; j<=18; j++){if ((i-4)%6==0 && (j-4)%6==0){cout<<"╋ ";} else {cout<<"┼ ";} }cout << "┨ ";cout << endl; } // 第19行 cout << "┗ ";for (int i=2; i<=18; i++){cout << "┷ ";}cout << "┛ "<< endl;return 0;//		cout<<"╝╗╔╚║═╧╢╟╤┼╋";//  ┯┷┠┨┗┏┓┛┼╋
}

二、落子

为了让效果好一些,首先加入一些颜色。另外,为了方便使用,增加了鼠标操作的支持。这两部分代码的功能在其他文章有论述,这里略去。到目前为止,仍然是在建立基本的框架。

一开始,我们使用左键落子为白色,右键落子为黑色的简单策略。

#include<iostream>
#include "mousetool.cpp"
#include "tools.cpp"
using namespace std;
void drawBoard(){// 第1行 cout << "┏ ";for (int i=2; i<=18; i++){cout << "┯ ";}cout << "┓ "<< endl;// 中间17行 for (int i=2; i<=18; i++){cout << "┠ ";for (int j=2; j<=18; j++){if ((i-4)%6==0 && (j-4)%6==0){cout<<"╋ ";} else {cout<<"┼ ";} }cout << "┨ ";cout << endl; } // 第19行 cout << "┗ ";for (int i=2; i<=18; i++){cout << "┷ ";}cout << "┛ "<< endl;
}
void click(int a, int x, int y){x=x/2*2;if (y>=19 || x>=38){return;}gotoxy(x,y);if (a==1){setColor(15,6);cout << "●";} else {setColor(0,6);cout << "●";}
}
int main(){initMouse();hideCursor();addEvent(1, click);addEvent(2, click);setColor(1,6);drawBoard();listenMouse();//cout<<"●○"<< endl;return 0;//		cout<<"╝╗╔╚║═╧╢╟╤┼╋";//  ┯┷┠┨┗┏┓┛┼╋
}

 三、单键落子

两键落子使用非常不方便,我们希望换成单键落子。因为围棋是一人一手,记录当前落子方的颜色,即可实现单键落子。算法的思路是状态设置。

代码简单,略(可直接下载)

四、增加提子功能

由于采用了单键落子,另外一个键就空下来。现在左键落子,我们事先右键提子功能。

会下围棋的同学都知道,提子一次可以提起多个子,显然提子时一键提起全部相连的棋子是比较方便合理的操作。

从结构上,这里开始使用二维数组存储落子信息。从算法的角度来说,重点是简单的递归。只展示关键部分逻辑。

void pullStone(int a, int x, int y){if (x<0 || y<0 || x>18 || y>18){return;}//cout << a << " " << x << " " << y << endl;if (arr[x][y]==a){arr[x][y]=0;remove(x,y);pullStone(a, x-1, y);pullStone(a, x+1, y);pullStone(a, x, y-1);pullStone(a, x, y+1);}
}

五、自动提子

手工提子和实物状态是相似的,但计算机上理应更方便一些,我们尝试实现自动提子功能。自动提子的关键在于判断一团相连棋子是否有气。

当每次落子后,查看它周围四个方向的棋子,是否存在没有气的情况,如果有,则提起。

这里的算法重点是深度优先搜索。函数noQi,判断某个位置的棋子是否“没有气”。深搜的一个标志性操作是修改状态与恢复状态。

bool noQi(int a, int x, int y){if (x<0 || y<0 || x>18 || y>18){return true;} //cout << a << " " << x << " " << y << endl;if (arr[x][y]==0){return false;} if (arr[x][y]==3-a){return true;} if (arr[x][y]==a){arr[x][y]=-a;bool ret= true;for (int i=-1; i<=1; i++){for (int j=-1; j<=1; j++){if (i*j==0){int x1= x+i;int y1= y+j;ret= ret && noQi(a, x1, y1);}}} arr[x][y]=a;return ret;} return true;
}

六、无气禁入

有了前面的基础,现在可以实现围棋的一个落子规则,落子的位置不能没有气。这个规则就否决了《天龙八部》中虚竹自撞一气直接送掉整条大龙的办法,围棋并不允许这样落子。

当然,落子于无气之处,但是可以直接提子,这就是允许的。 所以我们首先判断是否能提子,能够提子则无条件允许落子,否则检测这枚落子是否“无气”,来决定是否允许落子。

核心逻辑如下:

	// 首先预落子arr[x][y]=gSide;// 检查周围是否存在无气的对方棋子,如果有,则提起 int c= 3-gSide, cnt=0;cnt+=pull(c, x-1, y);cnt+=pull(c, x+1, y);cnt+=pull(c, x, y-1);cnt+=pull(c, x, y+1);if (cnt>0){// 有提子的情况下,无条件可以落子,继续操作 } else {// 没有提子,则本子落下不能是无气状态 if (noQi(gSide, x, y)){// 无气,则取消操作 arr[x][y]=0;return;	}}

七、最后一步,实现打劫的判断

前面的逻辑已经比较完善,除了打劫。打劫的时候,虽然满足落子的时候可以提子,但不能立即提起对方刚刚提过来的子。但是打二还一的情况又是允许的。那么打劫规则应当怎样实现呢?

算法思路是这样的:首先如果刚刚对方的落子导致了提子,并且提子是一个子,则记录这个落子的位置。那么这个时候,本方的落子如果仍然只提一个子,而且提的子恰好是这个子,则不允许。

在前面的基础上,算法逻辑修改如下:

	// 首先预落子arr[x][y]=gSide;// 检查周围是否存在无气的对方棋子,如果有,则提起 int c= 3-gSide, cnt=0;cnt+=pull(c, x-1, y);cnt+=pull(c, x+1, y);cnt+=pull(c, x, y-1);cnt+=pull(c, x, y+1);if (cnt>1){// 有提多子的情况下,无条件可以落子,继续操作 } else if (cnt==1){// 恰好提一子,先看所提子是否是刚刚落下的 if (arr[prex][prey]==0){// 提刚刚落下的子,首先还原状态,再看本子是否无气 arr[prex][prey]=c;if (noQi(gSide, x, y)){// 如果无气,说明是打劫状态,则不能提,还原场景 putStone(c, prex, prey);arr[x][y]=0;return;} else {// 有气状态,则允许,再次还原 arr[prex][prey]=0;				 }} } else {// 没有提子,则本子落下不能是无气状态 if (noQi(gSide, x, y)){// 无气,则取消操作 arr[x][y]=0;return;	}}

八、未实现的功能

功能的实现是没有穷尽的,我们这个小软件实现了完整的单机热座对弈功能。但没有记录棋谱的功能,更没有读谱的功能。最令人发指的是,竟然没有收官后自动数子的功能。有兴趣的同学可以自行尝试,这不是一个非常简单的功能。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

与 ChatGPT 对战国际象棋:仅用三个月,它从完败到完胜!

【CSDN 编者按】也许将来可能会被 OpenAI 的机器人打败&#xff0c;但在那之前依然可以享受人类之于机器的优越感&#xff01; 原文链接&#xff1a;https://villekuosmanen.medium.com/i-played-chess-against-chatgpt-4-and-lost-c5798a9049ca 未经授权&#xff0c;禁止转载&…

QQ围棋棋谱

腾讯围棋分享出来的链接&#xff1a; https://huanle.qq.com/act/a20170110wq/index-photo.html?type1&chess02000022001100000002020020221121000000002202022122112200002200000222111102000200020020222211200022020202211111200000122222211010120000011111210120221…

GPT-3核心成员出走打造ChatGPT最强竞品,估值50亿美元

来源&#xff1a;量子位 | 公众号 QbitAI 因不满老东家成为微软附庸&#xff0c;11名OpenAI前员工怒而出走。 如今带着“ChatGPT最强竞品”杀回战场&#xff0c;新公司估值50亿美元&#xff0c;一出手就获得3亿美元融资。 这家公司名叫Anthropic&#xff0c;新推出的聊天机器人…

ChatGPT 最强插件,即将开放!

公众号关注 “GitHubDaily” 设为 “星标”&#xff0c;每天带你逛 GitHub&#xff01; 今年 3 月份时&#xff0c;OpenAI 正式在 ChatGPT 上集成了插件系统&#xff08;Plugins&#xff09;&#xff0c;被视为其打造 AI 帝国下的第一步棋。 当时除了上线插件系统外&#xff0c…

原来GPT-4订阅后无法删除信用卡

前言 前段时间写了一篇代开Plus的文章,《ChatGPT Plus代充代开服务:解决客户需求的有效方式》今天有一网友找我代开,他没有信用卡,本着帮助友人(其实是想赚点酬劳费)精神,我就使用了自己的信用卡给对方开了,后面发现,竟然发现无法删除信用卡,这不有点尴尬了,特写此…

chatgpt赋能python:Python如何校验18位身份证号

Python如何校验18位身份证号 在中国&#xff0c;身份证号是每个人的唯一标识符&#xff0c;18位身份证号也是现行标准。但是&#xff0c;假如你的应用程序涉及到用户身份认证&#xff0c;你在处理身份证号码时必须非常小心。使用Python可以很容易地进行身份证号校验&#xff0…

这个学期,110多所高校把AI和大模型带进校园

2023 年春季学期&#xff0c;飞桨校园 AI Day 已登陆全国 114 所高校&#xff0c;为同学们提供了丰富的 AI 学习交流机会。 截至目前&#xff0c;超过 400 所高校的同学线上参与 AI 知识竞赛 PK &#xff0c;累计 2 万余名同学参与春季 AI Day 活动&#xff0c;更有 65 所高校举…

Fox AI横空出世,集成了GPT 3.5,GPT4.0, Midjourney等多种先进的AI模型!

友情提示&#xff1a;文章虽长但句句是精华&#xff0c;跳着看别怪FoxGPT没帮你挣着钱&#xff01;别看说的就是你。 Fox AI&#xff1a;https://foxgpt.club/ 在人工智能领域,Fox AI以其独特的集合式应用模式,引领着技术的新潮流。这款由广东松狐科技有限公司精心打造的产品…

飞桨AI Day落地澳门高校!助力大湾区打造产教融合新范式

为了推动大湾区建设产教融合的人工智能技术生态&#xff0c;加快培养助力社会经济高质量发展的复合型 AI 人才&#xff0c;飞桨校园 AI Day 登陆澳门&#xff0c;开展《AI 技术发展趋势与人才培养》主题讲座 &#xff0c;邀请多位澳门科技大学及百度嘉宾&#xff0c;解读当下AI…

简谈我对人工智能的理解与它的应用发展现状

谈起人工智能&#xff08;Artificial Intelligence&#xff09;&#xff0c;英文缩写 AI&#xff0c;人们理解模糊、众说纷纭、喜忧参半&#xff0c;乐观者认为它极大地推动了产业界的进展&#xff0c;是目前乃至未来引领科技前沿的硬核方向之一&#xff0c;悲观者认为即使在某…

这一波AI浪潮如何重塑互联网产业

人工智能将如何改变互联网以及对企业与消费者关系未来的威胁 微信搜索关注《Java学研大本营》&#xff0c;加入读者群&#xff0c;分享更多精彩 我一遍又一遍地听到或读到诸如“人工智能将绝对改变游戏规则”或“人工智能将改变一切&#xff01;”之类的话。这些既是轻描淡写又…

Laf v1.0 发布:函数计算只有两种,30s 放弃的和 30s 上线的

一般情况下&#xff0c;开发一个系统都需要前端和后端&#xff0c;仅靠一个人几乎无法胜任&#xff0c;需要考虑的特性和功能非常多&#xff0c;比如&#xff1a; 需要一个数据库来存放数据&#xff1b;需要一个文件存储来存放各种文件&#xff0c;比如图片文件&#xff1b;后…

chatGPT对企业的发展有什么影响

ChatGPT目前正在全世界范围内掀起风暴&#xff0c;成为炙手可热的一个名词。作为基于人工智能的工具的最新产品&#xff0c;目前ChatGPT呈现给我们的似乎只是足够有趣&#xff0c;且从目前已知的信息来看&#xff0c;它似乎还没有任何商业运作相关的计划&#xff0c;大多应用聚…

ChatGPT成功背后的技术原因及其对生命科学领域的启发

来源&#xff1a;机器之心 本文约7000字&#xff0c;建议阅读10分钟本文介绍了ChatGPT成功背后的技术原因及思考。 ChatGPT 是 OpenAI 开发的一个基于文本生成技术的对话机器人&#xff0c;以其惊艳的效果迅速出圈&#xff0c;在这个低迷的 2023 年初&#xff0c;凭着一己之力重…

完美免翻使用官方Chat GPT

承接上篇博客&#xff08;青龙面板安装教程&#xff0c;小白也可以&#xff09; 前提&#xff1a;拥有服务器&#xff0c;安装部署宝塔&#xff0c;安装Docker容器&#xff08;详情可见上篇&#xff09;&#xff0c;全程需要魔法自行解决&#xff0c;需要有自己的官方Chat GPT…

案例拆解丨ChatGPT+塔罗牌,批量起号、暴利引流,小白也能轻松月入10000+

ChatGPT 的出现&#xff0c;大大拉低了很多行业的门槛&#xff0c;比如客服、教育、翻译、自媒体……而塔罗牌占卜&#xff0c;肯定也是其中之一。 塔罗牌是一种占卜工具&#xff0c;由78张牌组成。可以用于占卜、灵性探索、个人成长和自我发现。 这是一个相对小众&#xff0c…

当我问chatgpt “你的意识相当于人类几岁?” 直接给我屏蔽了。

爆火的chatgpt 肯定让很多人急不可耐的进行了尝试。尝试对话解决问题。等等。下面就看看我的对话。 问他一些有意思的话题&#xff1f; 比如四个女儿叫法的问题。 当我问了敏感话题后直接自闭了。 让他写个UDP异步接收数据&#xff1a; 哈哈 &#xff0c;真有意思。

詹姆斯首节16分

北京时间12月8日&#xff0c;詹姆斯迎来了爆发。19投13中&#xff0c;三分5中2&#xff0c;拿到了30分5助攻4篮板&#xff0c;谁敢相信还有22天年满37岁了。 赛前&#xff0c;詹姆斯谈到了自己的身体状态&#xff0c;“我现在感觉非常棒&#xff0c;我正在努力找回此前的状态&a…

1998年图灵奖--詹姆斯·格雷简介

大家好&#xff0c;我是执念斩长河。今天讲述的是1988年图灵奖获得者詹姆斯格雷&#xff0c;图灵奖奖励他为数据库技术和“事务处理”做出贡献。读完本篇博文大家可以收获的是&#xff1a; 解决RDBMS问题的技术手段和方法格雷如何开发出微软SQL的格雷认为的IT目标 格雷是第三…