# C-project-practice---intelligent-man-machine-gobang-fight
C++新手项目实践 — 智能人机五子棋对战(利用Easyx的基础函数)
## 项目说明
**项目开发环境为 Windows10,Vs2019**
**该项目使用语言为c++,利用了easyx辅助画图,并未涉及easyx的高级使用,稍加学习即可掌握,项目涉及三大类,分别是 :**
**1.Class Show。这个类包含了绘图的主要函数,以及鼠标调用的函数。**
**2.Class Users。这个类包含了用户的基本信息,以及二进制读写文件函数。**
**3.Class Chess。这个类是个抽象类,包含了获取该位置得分以及判定胜负等函数。这个类派生了AiChess和MyChess两个子类,顾名思义,分别是与人机棋局和我方棋局的评定有关。**
项目根据胜负场和胜率设定了段位,根据当前棋局得分进行评估,并利用辅助栈实现了悔棋功能,初始时有十步悔棋步数,每赢一局加十步,增加了项目的创意。电脑下棋是随机遍历棋局的,意味着电脑并不是一成不变的,避免了同一套路无限用的可能。
下面我将讲解核心的算法。
## 体验
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的角度):
对于五子棋而言,我们最终的目的就是找到一个五元组(五个连着的位置)使得电脑五子连珠,而一旦这个五元组有一个白棋,那么这个五元组对于电脑而言就算无效五元组(进攻方面),因为它永远也不可能连起来。
具体而言,我们枚举每一个可能的落子点,根据这一个点为起点,向四个方向扩展,枚举所有包含这个点的五元组(记住是所有包含这个点的五元组),根据黑棋和白棋的数量,为每一个可能的五元组判分,最后在把所有包含该点的五元组得分累加,就是该点的总得分,枚举到最高得分的点,就是我们电脑需要下棋的位置。
如何判定得分呢?如果该五元组既有黑棋又有白棋,那么这个五元组是完全报废的,它绝不可能五子连珠(对于双方都是这样);如果仅有黑棋,那么这个五元组对电脑就是有意义的,我们根据黑棋的数量拟定一个进攻得分;如果仅有白棋,这个五元组对于玩家而言是有益的,那么电脑落子在这个五元组内可以有效的防守,我们需要拟定一个防守得分。这个得分规范不是一定的,可以根据实验来调整,我给出我总结出的方案:
```
/*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;
/*四个接口,用于获取包含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); /*获取该点的得分,ch 参数表示是评估电脑的还是用户的*/
int x_Points(vector<int> nums, int ch); /*一个五元组内,根据敌我棋的数量获取得分*/
```
## 项目演示视频以及完整项目下载
**项目演示视频**
[智能五子棋项目视频](https://www.zhihu.com/zvideo/1365346584163643393)
**网盘下载:**
链接:[Vs2019项目下载](https://pan.baidu.com/s/1hxAxJnbA9Ue66vWO3CQICA)
提取码:gbau
没有合适的资源?快使用搜索试试~ 我知道了~
大一课设,一款AI五子棋项目,C++新手项目实践 — 智能人机五子棋对战。.zip
共73个文件
tlog:20个
obj:8个
pdb:5个
需积分: 5 0 下载量 86 浏览量
2024-01-06
11:18:45
上传
评论
收藏 7.3MB ZIP 举报
温馨提示
大一课设,一款AI五子棋项目,C++新手项目实践 — 智能人机五子棋对战。.zip
资源推荐
资源详情
资源评论
收起资源包目录
大一课设,一款AI五子棋项目,C++新手项目实践 — 智能人机五子棋对战。.zip (73个子文件)
afdgafds
AL五子棋
Show.cpp 6KB
Chess.h 2KB
Users.h 348B
Chess.cpp 6KB
users.dat 20B
AL五子棋.sln 1KB
Release
AL五子棋.tlog
CL.write.1.tlog 816B
AL五子棋.write.1u.tlog 216B
AL五子棋.lastbuildstate 156B
CL.command.1.tlog 2KB
link.command.1.tlog 1KB
link.read.1.tlog 4KB
link.write.1.tlog 350B
CL.read.1.tlog 91KB
AL五子棋.vcxproj.FileListAbsolute.txt 48B
Chess.obj 957KB
vc142.pdb 596KB
users.dat 20B
Users.obj 745KB
AI五子棋.exe.recipe 289B
AL五子棋.ipdb 78KB
AL五子棋.exe.recipe 289B
AI五子棋.exe 383KB
win.wav 176KB
AI五子棋.iobj 908KB
AI五子棋.tlog
CL.write.1.tlog 3KB
CL.command.1.tlog 2KB
link.command.1.tlog 1KB
AI五子棋.write.1u.tlog 55KB
link.read.1.tlog 4KB
link.write.1.tlog 420B
AI五子棋.lastbuildstate 156B
CL.read.1.tlog 127KB
AL五子棋.iobj 306KB
AI五子棋.pdb 10.28MB
defet.mp3 112KB
AL五子棋.pdb 4.38MB
源.obj 984KB
AI五子棋.ipdb 256KB
AL五子棋.log 633B
Show.obj 918KB
setChs.wav 19KB
x64
Debug
AL五子棋.vcxproj.FileListAbsolute.txt 67B
Chess.obj 302KB
vc142.idb 643KB
AI五子棋.ilk 1.85MB
vc142.pdb 636KB
Users.obj 294KB
AI五子棋.exe.recipe 299B
AI五子棋.exe 277KB
AI五子棋.tlog
CL.write.1.tlog 2KB
CL.command.1.tlog 3KB
link.command.1.tlog 2KB
link.read.1.tlog 4KB
link.write.1.tlog 772B
AI五子棋.lastbuildstate 283B
CL.read.1.tlog 129KB
AI五子棋.pdb 2.16MB
源.obj 423KB
AL五子棋.log 301B
Show.obj 237KB
AL五子棋.vcxproj.user 168B
Users.cpp 707B
Show.h 719B
AL五子棋.vcxproj.filters 2KB
AL五子棋.vcxproj 7KB
win.wav 176KB
defet.mp3 112KB
源.exe 1.97MB
源.cpp 1KB
setChs.wav 19KB
Class.h 202B
README.md 4KB
共 73 条
- 1
资源评论
Lei宝啊
- 粉丝: 2066
- 资源: 1330
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功