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

一、相关的数据结构

关于盘面情况的表示,以链表形式表示当前盘面的情况,目的是可以允许用户进行悔棋、回退等操作。

CList StepList;

其中Step结构的表示为:

struct Step

{

int  m; //m,n表示两个坐标值

int  n;

char side; //side表示下子方

};

以数组形式保存当前盘面的情况,

目的是为了在显示当前盘面情况时使用:

char FiveArea[FIVE_MAX_LINE][FIVE_MAX_LINE];

其中FIVE_MAX_LINE表示盘面最大的行数。

同时由于需要在递归搜索的过程中考虑时间和空间有效性,只找出就当前情况来说相对比较好的几个盘面,而不是对所有的可下子的位置都进行搜索,这里用变量CountList来表示当前搜索中可以选择的所有新的盘面情况对象的集合:

CList CountList;

其中类CBoardSituiton为:

class CBoardSituation

{

CList  StepList; //每一步的列表

char FiveArea[FIVE_MAX_LINE][FIVE_MAX_LINE];

struct Step machineStep;    //机器所下的那一步

double value;  //该种盘面状态所得到的分数

}

二、评分规则

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

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

基本的规则如下:

判断是否能成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表示第一层子节点可以选择的较好的盘面的集合。核心的算法如下:

void MainDealFunction()

{

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

CalSeveralGoodPlace(currentBoardSituation,CountList);

//该函数是根据当前的盘面情况来比较得到比较好的可以考虑的几个盘面的情况,可以根据实际的得分情况选取分数比较高的几个盘面,也就是说在第一层节点选择的时候采用贪婪算法,直接找出相对分数比较高的几个形成第一层节点,目的是为了提高搜索速度和防止堆栈溢出。

pos=CountList.GetHeadPosition();

CBoardSituation* pBoard;

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

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

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

}

for(i=0;ivalue)

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

{

currentBoardSituation=pBoard;

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

Break;

}

}

其中对于Search函数的表示如下:实际上核心的算法是一个剪枝过程,其中在这个搜索过程中相关的四个参数为:(1)当前棋局情况;(2)当前的下子方,可以是机器(max)或者是人(min);(3)父节点的值oldValue;(4)当前的搜索深度depth。

double Search(CBoardSituation&

board,int mode,double oldvalue,int depth)

{

CList  m_DeepList;

if(deptholdvalue))==    TRUE)

{

if(mode==max)

value=select(value,search(successor

Board,min,value,depth+1),max);

else

value=select(value,search(successor

Board,max,value,depth+1),min);

}

return value;

}

else

{

if ( goal(board)<>0)

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

return goal(board);

else

return evlation(board);

}

}

注意这里的goal(board)函数是用来判断当前盘面是否可以分出胜负,而evlation(board)是对当前的盘面从机器的角度进行打分。

下面是Select函数的介绍,这个函数的主要目的是根据 PlayerMode情况,即是机器还是用户来返回节点的应有的值。

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

{

if(a>b && mode==max)¦¦ (a< b && mode==min)

return a;

else

return b;

}

五、小结

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

posted on

2005-12-28 12:38

卓如

阅读(686)

评论(0)

编辑

收藏

java五子棋核心算法_五子棋的核心算法(转)相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  10. mysql 编程算法_十大编程算法助程序员走上高手之路

    算法一:快速排序算法 快 速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个项目要Ο(n log n)次比较.在最坏状况下则需要Ο(n2)次比较,但这种 状况并不常见.事实上,快速排 ...

最新文章

  1. 知识图谱前端插件_大型前端项目可持续演进开发的思考
  2. 自然语言处理美国政客的社交媒体消息分类
  3. mongodump 失败且导致mongo服务挂掉【本质原因,wt文件损坏】
  4. 【STC15库函数上手笔记】3、外部中断
  5. Win11正式发布新功能
  6. php 魔术方法使用说明详细
  7. Oracle11g新特性:在线操作功能增强-Oracle11g新增的不可见索引 (转载)
  8. 异常详细信息: System.UnauthorizedAccessException: 对路径的访问被拒绝。
  9. 列表理解与lambda +过滤器
  10. 注册flash.ocx inno setup (转)
  11. android 网络程序下载,Android从网络上下载文件
  12. png、jpg图片格式的区别及
  13. 404页圈小猫游戏源码
  14. 游戏的交互设计与心理学应用
  15. 西班牙国家德比次回合时间确定 中国球迷需熬夜
  16. if语句(判断年月日)
  17. IT能力框架(模型)
  18. 全球50大最重要互联网人物
  19. 零基础入门UI设计必备实用技巧!
  20. 计算机控制技术74hc273,计算机控制技术习题—广州工业大学

热门文章

  1. 入坑MATLAB必会的吐血总结
  2. 启动SparkSql,报javax.jdo.JDOFatalInternalException: Error creating transactional connection factory
  3. a href a/target属性讲解
  4. summernote富文本编辑器基本使用
  5. 小程序微信运动时间戳格式转换+列表渲染微信运动数据
  6. 逻辑函数的两种标准形式
  7. 凹凸贴图和法线贴图的区别
  8. WINDOWS如何用自己的电脑做一个网站服务器
  9. C# 博思得 POSTEK 打印机 打码机 SDK 二次开发 指令打印
  10. CSS去除input框自带的叉号