由于工作需要接触到了五子棋,所以就想自己写写五子棋的算法,于是在查了很多资料,
找到了一种比较简单的思路,用评分表给当前所有还没有落子的地方评分,然后找出评分最高的点。
那么如何给某点评分呢?五子棋最终是要五个子练成一条线,那么我们姑且把五个点的集合称作一个单元。
首先就是要找出所有包含某个点的所有单元(包括水平方向,竖直方向,斜方向)
然后给每个单元打分,最终加起来的总分就是最后结果。
如何打分?参考了网上的资料,找到了一套评分标准
const int g_emptyTupleScore = 7;
const int g_mixtureTupleScore =0;
const int g_ownTupleScore[5] = {0, 35, 800, 15000, 800000};
const int g_rivalTupleScore[5] = {0, 15, 400, 1800, 100000};
如果单元的五个点上没有棋子,也就是空单元,那么这个单元给g_emptyTupleScore 分
如果某个单元又有白字又有黑子,那么这个单元给g_mixtureTupleScore 分
如果某个单元只有己方的棋子,棋子数量1、2、3、4分别对应的分数就是35、800、15000、800000
如果某个单元只有对方的棋子,棋子数量1、2、3、4分别对应的分数就是15, 400, 1800, 100000
以这样一套评分标准就给某个点打分,得分最高的点就是最佳点。
定义一个棋盘二维数组board[15][15];设定0、1、2分别表示该位置无棋子、有白子、有黑子
遍历棋盘数组,发现某点(x,y)的值为0,说明这个点没有棋子,那么我们第一步要做的就是寻找出所有包含这个点的单元
定义一个单元结构体,储存每个单元的5个点信息
这里我把寻找水平方向上的所有单元的代码贴出来了。g_findAllTupleResults是一个容器,保存所有的单元。
还要寻找竖直方向和斜方向的单元。
最终就是遍历整个容器,按照每个单元的棋子种类和数量给每个单元打分,最后得到总分。
这样就完成了一个点的评分,以此类推,得到棋盘上所有没有落子点的分数,最后选择得分最高的点。
这里是自己写的一份完整的五子棋AI代码
http://download.csdn.net/detail/u012987441/9635540点击打开链接