Update README.md

This commit is contained in:
happysnaker 2022-12-02 19:29:51 +08:00 committed by GitHub
parent 25bd50eea4
commit ec07e7f9eb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -12,15 +12,19 @@ C++新手项目实践 — 智能人机五子棋对战(利用Easyx的基础函数
**3.Class Chess。这个类是个抽象类包含了获取该位置得分以及判定胜负等函数。这个类派生了AiChess和MyChess两个子类顾名思义分别是与人机棋局和我方棋局的评定有关。**
项目根据胜负场和胜率设定了段位,根据当前棋局得分进行评估,并利用辅助栈实现了悔棋功能,初始时有十步悔棋步数,每赢一局加十步,增加了项目的创意。电脑下棋是随机遍历棋局的,意味着电脑并不是一成不变的,避免了同一套路无限用的可能。
如果你不会C++也没是,下面我将讲解核心的算法,掌握了算法思想用什么语言都可以。
下面我将讲解核心的算法。
## 体验
Windows 平台可下载 exe 程序运行:[下载地址](https://github.com/happysnaker/Gobang/raw/master/AL%E4%BA%94%E5%AD%90%E6%A3%8B/Release/AI%E4%BA%94%E5%AD%90%E6%A3%8B.exe)
## 项目算法思想
五子棋算法没有采用标准的博弈树算法,这对新手来说并不友好,我采用的是五元组算法,这个算法最初是在一个外国友人的博客中看到的,大概的思想是(站在AI的角度)
首先假定白棋为玩家的棋子,黑棋为电脑的棋子。项目五子棋算法没有采用标准的博弈树算法,这对新手来说并不友好,我采用的是五元组算法,这个算法最初是在一个外国友人的博客中看到的,大概的思想是(站在AI的角度)
对于五子棋而言,我们最终的目的就是找到一个五元组(五个连着的位置)使得电脑五子连珠,而一旦这个五元组有一个白棋(假设为玩家的棋),那么这个五元组对于电脑而言就算无效五元组(进攻方面),因为它永远也不可能连起来。
对于五子棋而言,我们最终的目的就是找到一个五元组(五个连着的位置)使得电脑五子连珠,而一旦这个五元组有一个白棋,那么这个五元组对于电脑而言就算无效五元组(进攻方面),因为它永远也不可能连起来。
具体而言,我们枚举每一个可能的落子点,根据这一个点,向四个方向扩展,枚举所有包含这个点的五元组(记住是所有包含这个点的五元组),根据黑棋(假设为电脑的棋)和白棋的数量,为每一个可能的五元组判分,最后在把所有包含该点的五元组得分累加,就是该点的总得分,枚举到最高得分的点,就是我们电脑需要下棋的位置。
具体而言,我们枚举每一个可能的落子点,根据这一个点为起点,向四个方向扩展,枚举所有包含这个点的五元组(记住是所有包含这个点的五元组),根据黑棋和白棋的数量,为每一个可能的五元组判分,最后在把所有包含该点的五元组得分累加,就是该点的总得分,枚举到最高得分的点,就是我们电脑需要下棋的位置。
如何判定得分呢?如果该五元组既有黑棋又有白棋,那么这个五元组是完全报废的,它绝不可能五子连珠(对于双方都是这样);如果仅有黑棋,那么这个五元组对电脑就是有意义的,我们根据黑棋的数量拟定一个进攻得分;如果仅有白棋,这个五元组对于玩家而言是有益的,那么电脑落子在这个五元组内可以有效的防守,我们需要拟定一个防守得分。这个得分规范不是一定的,可以根据实验来调整,我给出我总结出的方案:
```
@ -36,14 +40,14 @@ C++新手项目实践 — 智能人机五子棋对战(利用Easyx的基础函数
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); /*根据敌我棋的数量获取得分*/
int Get_Points(int x, int y, int ch); /*获取该点的得分ch 参数表示是评估电脑的还是用户的*/
int x_Points(vector<int> nums, int ch); /*一个五元组内,根据敌我棋的数量获取得分*/
```
## 项目演示视频以及完整项目下载