文档介绍:五子棋的核心算法 1 五子棋是一种受大众广泛喜爱的游戏, 其规则简单, 变化多端, 非常富有趣味性和消遣性。这里设计和实现了一个人机对下的五子棋程序, 采用了博弈树的方法, 应用了剪枝和最大最小树原理进行搜索发现最好的下子位置。介绍五子棋程序的数据结构、评分规则、胜负判断方法和搜索算法过程。一、相关的数据结构关于盘面情况的表示, 以链表形式表示当前盘面的情况, 目的是可以允许用户进行悔棋、回退等操作。 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, 如果是机器方的话给予