设为首页 加入收藏

TOP

vc之游戏五子棋的核心算法
2014-11-22 14:00:26 】 浏览:7214
Tags:游戏 五子棋 核心 算法

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


  一、相关的数据结构


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


  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分。


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


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇C++VCstrstr函数的仿真 下一篇VC助手VisualAssist的简介

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目