ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C++新手项目实践 — 智能人机对战五子棋

2021-08-17 12:33:18  阅读:241  来源: 互联网

标签:得分 return int 五子棋 C++ else 对战 && 五元


C-project-practice---intelligent-man-machine-gobang-fight

C++新手项目实践 — 智能人机五子棋对战(利用Easyx的基础函数)

项目演示视频

智能五子棋项目视频

项目说明

该项目使用语言为c++,利用了easyx辅助画图,并未涉及easyx的高级使用,稍加学习即可掌握,项目涉及三大类,分别是:

1.Class Show。这个类包含了绘图的主要函数,以及鼠标调用的函数。

2.Class Users。这个类包含了用户的基本信息,以及二进制读写文件函数。

3.Class Chess。这个类是个抽象类,包含了获取该位置得分以及判定胜负等函数。这个类派生了AiChess和MyChess两个子类,顾名思义,分别是与人机棋局和我方棋局的评定有关。

项目根据胜负场和胜率设定了段位,根据当前棋局得分进行评估,并利用辅助栈实现了悔棋功能,初始时有十步悔棋步数,每赢一局加十步,增加了项目的创意。电脑下棋是随机遍历棋局的,意味着电脑并不是一成不变的,避免了同一套路无限用的可能。
如果你不会C++也没是,下面我将讲解核心的算法,掌握了算法思想用什么语言都可以。

项目算法思想

五子棋算法没有采用标准的博弈树算法,这对新手来说并不友好,我采用的是五元组算法,这个算法最初是在一个外国友人的博客中看到的,大概的思想是(站在AI的角度):

对于五子棋而言,我们最终的目的就是找到一个五元组(五个连着的位置)使得电脑五子连珠,而一旦这个五元组有一个白棋(假设为玩家的棋),那么这个五元组对于电脑而言就算无效五元组(进攻方面),因为它永远也不可能连起来。

具体而言,我们枚举每一个可能的落子点,根据这一个点,向四个方向扩展,枚举所有包含这个点的五元组(记住是所有包含这个点的五元组),根据黑棋(假设为电脑的棋)和白棋的数量,为每一个可能的五元组判分,最后在把所有包含该点的五元组得分累加,就是该点的总得分,枚举到最高得分的点,就是我们电脑需要下棋的位置。

如何判定得分呢?如果该五元组既有黑棋又有白棋,那么这个五元组是完全报废的,它绝不可能五子连珠(对于双方都是这样);如果仅有黑棋,那么这个五元组对电脑就是有意义的,我们根据黑棋的数量拟定一个进攻得分;如果仅有白棋,这个五元组对于玩家而言是有益的,那么电脑落子在这个五元组内可以有效的防守,我们需要拟定一个防守得分。这个得分规范不是一定的,可以根据实验来调整,我给出我总结出的方案:

	/*g是电脑一方的棋, b是玩家一方的棋*/
	if (g == 0 && b == 0)		return 10;
	else if (g == 1 && b == 0)	return 35;
	else if (g == 2 && b == 0)	return 1500;
	else if (g == 3 && b == 0)	return 18000;
	else if (g == 4 && b == 0)	return 1000000;
	else if (g == 0 && b == 1)	return 15;
	else if (g == 0 && b == 2)	return 400;
	else if (g == 0 && b == 3)	return 6000;
	else if (g == 0 && b == 4)	return 150000;
	else if (g != 0 && b != 0)	return 0;
	return 0;
在此项目中,我在抽象类Chess中实现了这个功能,只需要调用Get_Points即可,其余函数都是一个接口,其中参数ch代表是需要获取我方得分还是对方得分(便于棋局评估):
	/*四个接口,用于获取包含x,y点四个方向的五元组情况,返回敌我棋的数量*/
	vector<int> Get_Nums1(int x, int y);
	vector<int> Get_Nums2(int x, int y);
	vector<int> Get_Nums3(int x, int y);
	vector<int> Get_Nums4(int x, int y);
	int  Get_Points(int x, int y, int ch);				/*获取该点的得分*/
	int  x_Points(vector<int> nums, int ch);			/*根据敌我棋的数量获取得分*/

完整项目工程下载

网盘下载:

链接:Vs2019项目下载

提取码:gbau

Github下载:
链接:Vs2019项目下载

喜欢的朋友们可以点个赞奥!

标签:得分,return,int,五子棋,C++,else,对战,&&,五元
来源: https://www.cnblogs.com/happysnaker/p/15151749.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有