前面弱智版五子棋虽然实现了让电脑下棋,但是完全没有思考能力。下面我们就来为电脑提升智力,学会思考后再下棋。

计算机的思考能力体现在对盘面的分析上,通过分析可能形成的盘面,从中选择最优结果,形成这个最优结果的着法即为计算机本次的选择。盘面分析的过程就是查找能形成五连珠的棋形,每种棋形赋予一定的分数,分数最高的盘面即为最佳盘面。下面是我总结的一些基本棋形(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相关推荐

  1. 调试JDK源码-一步一步看HashMap怎么Hash和扩容

    调试JDK源码-一步一步看HashMap怎么Hash和扩容 调试JDK源码-ConcurrentHashMap实现原理 调试JDK源码-HashSet实现原理 调试JDK源码-调试JDK源码-Hash ...

  2. 一步一步指引你在Windows7上配置编译使用Caffe(https://github.com/fengbingchun/Caffe_Test)

    之前写过几篇关于Caffe源码在Windows764位上配置编译及使用过程,只是没有把整个工程放到网上,最近把整个工程整理清理了下,把它放到了GitHub上.下面对这个工程的使用作几点说明: 1.   ...

  3. 一步一步实现扫雷游戏(C语言实现)(三)

    使用WIN32API连接窗口 此项目相关博文链接 一步一步实现扫雷游戏(C语言实现)(一) 一步一步实现扫雷游戏(C语言实现)(二) 一步一步实现扫雷游戏(C语言实现)(三) 一步一步实现扫雷游戏(C ...

  4. 一步一步学Silverlight 2系列(3):界面布局

    概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...

  5. 一步一步写算法(之图结构)

    原文:一步一步写算法(之图结构) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 图是数据结构里面的重要一章.通过图,我们可以判断两个点之间是 ...

  6. 融合应用11.1.8安装,一步一步的引导

    融合应用11.1.8安装,一步一步的引导 融合应用11.1.8 安装并不是简单的与电子商务套件11 i / R12安装. 所以我们需要安装划分为许多步骤. 请注意,11.1.8 11.1.7总统发布供 ...

  7. 一步一步学Silverlight 2系列(10):使用用户控件

    概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...

  8. 【深度学习基础】一步一步讲解卷积神经网络

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送 本文转自:一步一步讲解卷积神经网络 卷积神经网络(Convoluti ...

  9. 通过脚本案例学习shell(五) 通过创建DNS脚本一步一步教你将一个普通脚本规范到一个生产环境脚本...

    通过脚本案例学习shell(五) 通过创建DNS脚本一步一步教你将一个普通脚本规范到一个生产环境脚本   版权声明: 本文遵循"署名非商业性使用相同方式共享 2.5 中国大陆"协议 ...

  10. 一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序 - 强烈推荐!!!

    一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序 本文根据<Professional ASP.NET MVC 1.0>中微软牛人Scott Guthrie 提供 ...

最新文章

  1. 使用tomcat自带的连接池,报错
  2. bugku- web -login3
  3. IDEA连接数据库自动生成实体类
  4. 一个python发包的脚本
  5. Linux操作系统启动流程简单介绍
  6. linux 丢包多少正常_干货总结!Linux运维故障排查思路
  7. 微软推出Azure区块链开发套件,重点解决两大难题
  8. 苹果iOS手机暗藏间谍软件的揭秘者:扎徳尔斯基
  9. HTML学习总结(1)——HTML基本介绍
  10. vsto 批量删除列
  11. Java List集合去重的多种方法
  12. 常用名词理解(APK,SDK,JDK,API,DLL)
  13. Android8 for 9300,三星G9300官方固件rom刷机包 G9300ZCS3CRI1 安卓8.0
  14. html中如何在数字上加方框,EXCEL单元格中方框添加数字(或者数字添加方框)
  15. linux 笔记本sd卡,Linux如何使用笔记本自带的SD/MMC读卡器
  16. Win系统 - 如何查看电脑开机了多长时间?
  17. 完善circos做图
  18. 安卓转战React-Native之签名打包成Apk并极速多渠道打包
  19. 信息安全-网络物理隔离技术原理与应用
  20. 如何区分斜杠和反斜杠?

热门文章

  1. SaaS模式金融危机时期显威力 呼叫中心进入云时代
  2. Endnote | 如何快速分享文献给别人(包含题录+备注+pdf文件)| endnote保存备份
  3. css处理图片上的文字(内阴影)
  4. 今天考驾照了吗?驾考宝典产品框架界面设计稿
  5. 用打怪游戏实例升级版,理解python面向对象
  6. 手机静电放电ESD测试及其整改措施
  7. 虹软人脸识别中人脸追踪框框运动方向跟实际相反
  8. 现在做淘客晚了吗?自媒体淘客告诉你答案
  9. 车辆管理系统c语言课程设计报告,图书馆管理系统C语言课程设计报告
  10. 跟着CTF-Wiki学pwn|格式化字符串(1)