五子棋是一种受大众广泛喜爱的游戏,其规则简单,变化多端,非常富有趣味性和消遣性。这里设计和实现了一个人机对下的五子棋程序,采用了博弈树的方法,应用了剪枝和最大最小树原理进行搜索发现最好的下子位置。介绍五子棋程序的数据结构、评分规则、胜负判断方法和搜索

二、评分规则

对于下子的重要性评分,需要从六个位置来考虑当前棋局的情况,分别为:-,|,/,/,//,//

实际上需要考虑在这六个位置上某一方所形成的子的布局的情况,对于在还没有子的地方落子以后的当前局面的评分,主要是为了说明在这个地方下子的重要性程度,设定了一个简单的规则来表示当前棋面对机器方的分数。

基本的规则如下:

* 判断是否能成5, 如果是机器方的话给予100000分,如果是人方的话给予-100000 分;

* 判断是否能成活4或者是双死4或者是死4活3,如果是机器方的话给予10000分,如果是人方的话给予-10000分;

* 判断是否已成双活3,如果是机器方的话给予5000分,如果是人方的话给予-5000 分;

* 判断是否成死3活3,如果是机器方的话给予1000分,如果是人方的话给予-1000 分;

* 判断是否能成死4,如果是机器方的话给予500分,如果是人方的话给予-500分;

* 判断是否能成单活3,如果是机器方的话给予200分,如果是人方的话给予-200分;

* 判断是否已成双活2,如果是机器方的话给予100分,如果是人方的话给予-100分;

* 判断是否能成死3,如果是机器方的话给予50分,如果是人方的话给予-50分;

* 判断是否能成双活2,如果是机器方的话给予10分,如果是人方的话给予-10分;

* 判断是否能成活2,如果是机器方的话给予5分,如果是人方的话给予-5分;

* 判断是否能成死2,如果是机器方的话给予3分,如果是人方的话给予-3分。

实际上对当前的局面按照上面的规则的顺序进行比较,如果满足某一条规则的话,就给该局面打分并保存,然后退出规则的匹配。注意这里的规则是根据一般的下棋规律的一个总结,在实际运行的时候,用户可以添加规则和对评分机制加以修正。

三、胜负判断

实际上,是根据当前最后一个落子的情况来判断胜负的。

实际上需要从四个位置判断,以该子为出发点的水平,竖直和两条分别为 45度角和135度角的线,目的是看在这四个方向是否最后落子的一方构成连续五个的棋子,如果是的话,就表示该盘棋局已经分出胜负。具体见下面的图示:

四、搜索算法实现描述

注意下面的核心的算法中的变量currentBoardSituation,表示当前机器最新的盘面情况, CountList表示第一层子节点可以选择的较好的盘面的集合。

核心的算法如下:

1. void MainDealFunction()

2. {

3. value=-MAXINT; //对初始根节点的value赋值

4. CalSeveralGoodPlace(currentBoardSituation,CountList);

5. //该函数是根据当前的盘面情况来比较得到比较好的可以考虑的几个盘面的情况,

6. //可以根据实际的得分情况选取分数比较高的几个盘面,

7. //也就是说在第一层节点选择的时候采用贪婪算法,

8. //直接找出相对分数比较高的几个形成第一层节点,

9. //目的是为了提高搜索速度和防止堆栈溢出。

10. pos=CountList.GetHeadPosition();

11. CBoardSituation* pBoard;

12. for(i=0;ivalue=Search(pBoard,min,value,0)

13. {

14. Value=Select(value,pBoard->value,max);

15. //取value和pBoard->value中大的赋给根节点

16. }

17.

18.

19. for(i=0;ivalue)

20. //找出那一个得到最高分的盘面

21. {

22. currentBoardSituation=pBoard;

23. PlayerMode=min; //当前下子方改为人

24. Break;

25. }

26. }

27.

28. //其中对于Search函数的表示如下:

29. //实际上核心的算法是一个剪枝过程,其中在这个搜索过程中相关的四个参数为:

30. //(1)当前棋局情况;(2)当前的下子方,可以是机器(max)或者是人(min);

31. //(3)父节点的值oldValue;(4)当前的搜索深度depth。

32.

33. double Search(CBoardSituation& board,int mode,double oldvalue,int depth)

34. {

35. CList m_DeepList;

36. if(deptholdvalue==TRUE)

37. {

38. {

39. if(mode==max)

40. value=select(value,search(successorBoard,min,value,depth+1),max);

41. else

42. value=select(value,search(successorBoard,max,value,depth+1),min);

43. }

44. return value;

45. }

46. else

47. {

48. if (goal(board)!=0)

49. //这里goal(board)<>0表示已经可以分出胜负

50. return goal(board);

51. else

52. return evlation(board);

53. }

54. }

55.

56. //注意这里的goal(board)函数是用来判断当前盘面是否可以分出胜负,

57. //而evlation(board)是对当前的盘面从机器的角度进行打分。

58.

59. //下面是Select函数的介绍,这个函数的主要目的是根据 PlayerMode情况,

60. //即是机器还是用户来返回节点的应有的值。

61. double Select(double a,double b,int mode)

62. {

63. if((a>b && mode==max)||(a< b && mode==min))

64. return a;

65. else

66. return b;

67. }

五、小结

在Windows操作系统下,用VC++实现了这个人机对战的五子棋程序。

和国内许多只是采用规则或者只是采用简单递归而没有剪枝的那些程序相比,在智力上和时间有效性上都要好于这些程序。同时所讨论的方法和设计过程为用户设计其他的游戏(如象棋和围棋等)提供了一个参考。

java五子棋核心算法_五子棋的核心算法 | 学步园相关推荐

  1. java的数列极差_[hoj]数列极差问题 | 学步园

    贪心.关键是证明子问题最优即是总问题最优. 可以考虑三个数的情况,易证选取最小的数擦除将得到最大数,vice versa .故总体也是如此. 用优先队列实现.STL自带仿函数greater<&g ...

  2. java 哈希一致算法_一致哈希算法Java实现

    一致哈希算法(Consistent Hashing Algorithms)是一个分布式系统中常用的算法.传统的Hash算法当槽位(Slot)增减时,面临所有数据重新部署的问题,而一致哈希算法确可以保证 ...

  3. kmeans算法_实战 | KMeans 聚类算法

    1. 写在前面 如果想从事数据挖掘或者机器学习的工作,掌握常用的机器学习算法是非常有必要的,常见的机器学习算法: 监督学习算法:逻辑回归,线性回归,决策树,朴素贝叶斯,K近邻,支持向量机,集成算法Ad ...

  4. hash算法_数据库中间件分片算法之hash

    前言 夜深人静的时候,打开云音乐,点上一曲攀登,带上真无线蓝牙耳机,瞬间燃到爆,键盘打字如飞倦意全无. 分片规则 这几天有人问我,dble和MyCat到底有什么不同.其实dble作为MyCAT的同门, ...

  5. mysql区间算法_「五大常用算法」一文图解分治算法和思想

    前言 分治算法(divide and conquer)是五大常用算法(分治算法.动态规划算法.贪心算法.回溯法.分治界限法)之一,很多人在平时学习中可能只是知道分治算法,但是可能并没有系统的学习分治算 ...

  6. 人工智能算法_人工智能的灵魂——算法

    人工智能有三驾马车:数据.算法.算力.本文重点介绍算法相关的知识. 本文将介绍算法在人工智能里的概念,算法的4个特征.6个通用方法.以及在选择算法时需要注意的3个点. 什么是算法? 简单的说,算法就是 ...

  7. 麻雀优化算法_多种智能优化算法应用案例分享-附代码

    1.智能优化算法应用:基于灰狼算法的Otsu图像多阈值分割 智能优化算法应用:基于灰狼算法的Otsu图像多阈值分割-附代码_Jack旭的博客-CSDN博客​blog.csdn.net 2.智能优化算法 ...

  8. 文本聚类分析算法_常用的聚类分析算法综述

    聚类分析定义 所谓聚类就是按照事物的某些属性,把事物聚集成类,使类间的相似性尽可能小,类内相似性尽可能大.聚类是一个无监督的学习过程,它同分类的根本区别在于分类是需要事先知道所依据的数据特征,而聚类是 ...

  9. 机器学习算法_机器学习之EM算法和概率图模型

    [晓白]今天我准备更新Machine Learning系列文章希望对机器学习复习和准备面试的同学有帮助!之前更新了感知机和SVM,决策树&代码实战,关注我的专栏可以的文章哦!今天继续更新EM算 ...

  10. etc的常见算法_几个常用算法的适应场景及其优缺点(非常好)

    本文主要回顾下几个常用算法的适应场景及其优缺点! 机器学习算法太多了,分类.回归.聚类.推荐.图像识别领域等等,要想找到一个合适算法真的不容易,所以在实际应用中,我们一般都是采用启发式学习方式来实验. ...

最新文章

  1. OC学习篇之---对象的拷贝
  2. 微软沈向洋:写给AI新潮流——人工智能创作的五点建议
  3. 北大图灵班本科生获STOC最佳论文奖!这个对标清华姚班的人才计划,正在频频交出答卷...
  4. 第三章:lambda表达式
  5. 至于你信不信,我反正是信了——以类为单位的编程思想
  6. MySQL(4) 索引、事务与存储引擎
  7. 【Linux开发】linux设备驱动归纳总结(九):1.platform总线的设备和驱动
  8. UNIX网络编程--读书笔记
  9. 思考XSS攻击和跨站伪造请求CSRF
  10. maven 本地仓库的配置
  11. 使用MarkDown来写一份漂亮简约的简历
  12. Jmetter并发测试工具使用笔记
  13. 数字签名技术原理介绍
  14. 【css】svg修改图标颜色
  15. 群发短信平台哪个好?推荐阿里云短信平台
  16. 2019高考江苏卷语文作文
  17. CoLab - 图像人脸检测_框出人脸
  18. css3中的2D和3D转换、动画效果以及布局
  19. 双网卡实现同时连通两个网络
  20. 百度快照更新与排名的关系

热门文章

  1. 暴风云视频平台SDK使用介绍(四)-- 视频播放(Android)
  2. 后台指标计算返回数据格式说明10 - FILLRGN格式
  3. 试用了hipihi首批账号
  4. 天空2006年十大国产优秀软件
  5. 2012r2ad虚拟服务器升级2016,Windows Server 2016 Hyper-V之滚动式升级Hyper-V2012R2群集到2016 | 365vCloud的云计算之旅...
  6. 影视剪辑,再来新一波视频剪辑素材
  7. 彩虹显IP软件即使合法也不合理
  8. 使用easyUI 动态改变datagrid的columns
  9. android老人rom,联络OS老人ROM为父母重新定义手机
  10. unity3d插入android有米广告