一步一步实现五子棋5
前面弱智版五子棋虽然实现了让电脑下棋,但是完全没有思考能力。下面我们就来为电脑提升智力,学会思考后再下棋。
计算机的思考能力体现在对盘面的分析上,通过分析可能形成的盘面,从中选择最优结果,形成这个最优结果的着法即为计算机本次的选择。盘面分析的过程就是查找能形成五连珠的棋形,每种棋形赋予一定的分数,分数最高的盘面即为最佳盘面。下面是我总结的一些基本棋形(X表示黑子O表示白子-表示空格:
成五:XXXXX,形成这种棋形时即可分出胜负,赋予极高值。
活四:-XXXX-、X-XXX-X,这种棋形一旦形成,将无法防守,先手必胜,后手除了对方立刻成五也必胜。
冲四:OXXXX- 、OXXX-X、OXX-XX,这种棋形形成,先手必胜,后手对方必须防守。
活三:-XXX-、-X-XX-,这种棋形形成后,先手可成活四,后手对方必须防守,除非对方已经有活四、冲四等棋形,否者必胜。
冲三:OXXX--、OXX-X-、OX-XX-,这种棋形可先手成冲四,虽然不是能立即获胜的棋形,但一次或多次冲四后极可能形成良好的局面。
活二:--XX--、--X-X--,这种棋形是获胜的开始,有赢棋始于活二的说法,活二对后续的发展非常关键。
后面还有冲二,活一等棋形,这里就不一一介绍了。对这些棋形赋予恰当的分数,可更加真实的反应出盘面的优劣。
用户落子后,每次都扫面整个棋盘,这样的效率显得比较低。事实上,新落子只会影响该点在棋盘上四个方向上的价值。因此我们可以将棋盘按照横、纵、斜、反斜向的线用下面的结构体表示:
struct CHESS_LINE {
int point[15];
int mode[2][CHESS_MODE_NUM];
};
数组point[15]用来存储每条线上的棋子情况,二维数组mode用来存储黑棋和白棋在该条线上的特定棋形的数量。每次落子或者回退后时,重新分析该点所在的四条线上的棋形。在分析盘面时,只需要统计棋盘上所有线上的棋形形成的分数后即可。
电脑在选择下一个落子点时,先遍历每一个有效的落子点,模拟落子后分析棋盘的价值。选择所有可能落子中棋盘分数最高的点,该点就是电脑选择的点。
void Engine::Thinking()
{
map<int, CHESS_POINT*> spaceList;
GetSpaceList(spaceList);
int size = spaceList.size();
if (size == 0)
{
return;
}
map<int, CHESS_POINT*>::iterator itor = spaceList.begin();
CHESS_POINT *bestPoint = NULL;
int bestValue = -100000000;
int tempValue = 0;
while(itor != spaceList.end())
{
AddChess(itor->second->x, itor->second->y, m_AIType);
tempValue = CalculateStore(m_userType);
if (tempValue > bestValue)
{
bestValue = tempValue;
bestPoint = (itor->second);
}
RemoveChess(itor->second->x, itor->second->y);
itor++;
}
AIDown(bestPoint->x, bestPoint->y);
}
AddChess和RemoveChess分别是分析落子点和回退点影响的线上的价值,CalculateStore即统计整个盘面的价值。由于代码量较大,就不一一贴出来了。这样一个简单的AI就做好了。多的不说了,线看看效果吧。
看,是不是下的有模有样了,一不小心还被它赢了一盘。不过基本版的五子棋智力还是非常有限的,想让它更聪明,就需要引入博弈算法,进行深度思考了。
一步一步实现五子棋5相关推荐
- 调试JDK源码-一步一步看HashMap怎么Hash和扩容
调试JDK源码-一步一步看HashMap怎么Hash和扩容 调试JDK源码-ConcurrentHashMap实现原理 调试JDK源码-HashSet实现原理 调试JDK源码-调试JDK源码-Hash ...
- 一步一步指引你在Windows7上配置编译使用Caffe(https://github.com/fengbingchun/Caffe_Test)
之前写过几篇关于Caffe源码在Windows764位上配置编译及使用过程,只是没有把整个工程放到网上,最近把整个工程整理清理了下,把它放到了GitHub上.下面对这个工程的使用作几点说明: 1. ...
- 一步一步实现扫雷游戏(C语言实现)(三)
使用WIN32API连接窗口 此项目相关博文链接 一步一步实现扫雷游戏(C语言实现)(一) 一步一步实现扫雷游戏(C语言实现)(二) 一步一步实现扫雷游戏(C语言实现)(三) 一步一步实现扫雷游戏(C ...
- 一步一步学Silverlight 2系列(3):界面布局
概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...
- 一步一步写算法(之图结构)
原文:一步一步写算法(之图结构) [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 图是数据结构里面的重要一章.通过图,我们可以判断两个点之间是 ...
- 融合应用11.1.8安装,一步一步的引导
融合应用11.1.8安装,一步一步的引导 融合应用11.1.8 安装并不是简单的与电子商务套件11 i / R12安装. 所以我们需要安装划分为许多步骤. 请注意,11.1.8 11.1.7总统发布供 ...
- 一步一步学Silverlight 2系列(10):使用用户控件
概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...
- 【深度学习基础】一步一步讲解卷积神经网络
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送 本文转自:一步一步讲解卷积神经网络 卷积神经网络(Convoluti ...
- 通过脚本案例学习shell(五) 通过创建DNS脚本一步一步教你将一个普通脚本规范到一个生产环境脚本...
通过脚本案例学习shell(五) 通过创建DNS脚本一步一步教你将一个普通脚本规范到一个生产环境脚本 版权声明: 本文遵循"署名非商业性使用相同方式共享 2.5 中国大陆"协议 ...
- 一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序 - 强烈推荐!!!
一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序 本文根据<Professional ASP.NET MVC 1.0>中微软牛人Scott Guthrie 提供 ...
最新文章
- 使用tomcat自带的连接池,报错
- bugku- web -login3
- IDEA连接数据库自动生成实体类
- 一个python发包的脚本
- Linux操作系统启动流程简单介绍
- linux 丢包多少正常_干货总结!Linux运维故障排查思路
- 微软推出Azure区块链开发套件,重点解决两大难题
- 苹果iOS手机暗藏间谍软件的揭秘者:扎徳尔斯基
- HTML学习总结(1)——HTML基本介绍
- vsto 批量删除列
- Java List集合去重的多种方法
- 常用名词理解(APK,SDK,JDK,API,DLL)
- Android8 for 9300,三星G9300官方固件rom刷机包 G9300ZCS3CRI1 安卓8.0
- html中如何在数字上加方框,EXCEL单元格中方框添加数字(或者数字添加方框)
- linux 笔记本sd卡,Linux如何使用笔记本自带的SD/MMC读卡器
- Win系统 - 如何查看电脑开机了多长时间?
- 完善circos做图
- 安卓转战React-Native之签名打包成Apk并极速多渠道打包
- 信息安全-网络物理隔离技术原理与应用
- 如何区分斜杠和反斜杠?
热门文章
- SaaS模式金融危机时期显威力 呼叫中心进入云时代
- Endnote | 如何快速分享文献给别人(包含题录+备注+pdf文件)| endnote保存备份
- css处理图片上的文字(内阴影)
- 今天考驾照了吗?驾考宝典产品框架界面设计稿
- 用打怪游戏实例升级版,理解python面向对象
- 手机静电放电ESD测试及其整改措施
- 虹软人脸识别中人脸追踪框框运动方向跟实际相反
- 现在做淘客晚了吗?自媒体淘客告诉你答案
- 车辆管理系统c语言课程设计报告,图书馆管理系统C语言课程设计报告
- 跟着CTF-Wiki学pwn|格式化字符串(1)