您的位置:首页 > 编程语言 > Qt开发

五子棋评分表算法

2016-02-26 21:13 756 查看
最近学了一点QT的绘图,于是乎照着学长的代码绘制了五子棋的小游戏。

最基础的东西这里就不说了,自己的知识也仅仅比会用多那么一点,下面我们来说说这里貌似高大上的人机AI吧。

评分表算法

一般情况下棋盘是15*15的。那么应该是572个五元组。而这五元组由黑棋白棋还有空格组成。也就是 3^5 * 572 = 138996; 看着很多吧,其实是可以分类的。每个五元组就是一种局势。

我们只用统计只有己方棋子的局势,以及只有敌方棋子的局势,针对这两种局势给予确定的评分,而其他局势直接评分为0。

下面是我使用的是评分表

// tuple is empty
Blank,
// tuple contains a black chess
B,
// tuple contains two black chesses
BB,
// tuple contains three black chesses
BBB,
// tuple contains four black chesses
BBBB,
// tuple contains a white chess
W,
// tuple contains two white chesses
WW,
// tuple contains three white chesses
WWW,
// tuple contains four white chesses
WWWW,
// tuple does not exist
Virtual,
// tuple contains at least one black and at least one white
Polluted

tupleScoreTable[0] = 7;
tupleScoreTable[1] = 35;
tupleScoreTable[2] = 800;
tupleScoreTable[3] = 15000;
tupleScoreTable[4] = 800000;
tupleScoreTable[5] = 15;
tupleScoreTable[6] = 400;
tupleScoreTable[7] = 1800;
tupleScoreTable[8] = 100000;
tupleScoreTable[9] = 0;
tupleScoreTable[10] = 0;


很多人可能没看懂,其实就是当前五元组中黑白棋子个数以及对应的得分,tupleScoreTable[0] 对应 没有棋子的得分,tupleScoreTable[1 - 4] 代表 1个黑棋 到 4个黑棋的得分, tupleScoreTable[5 - 8]代表 1 个白棋到4个白棋的得分,tupleScoreTable[9] 代表黑白棋共存的情况,tupleScoreTable[10] 代表其他情况(貌似没用?)

当然具体怎么来统计那?onezeros的博客没有给出来,对很多初学者来说实现还是有一定困难,这里就详细的讲一讲吧。

首先我们用一个棋盘大小的二维数组来储存每个点的得分。int scoreTabel[15][15];

每次,当People或者Computer下完棋后,以该点为中心统计周围5个点的分数(上下左右对角)。


图1

即红点,统计每个点的分数。

对于每个红点,同样的,我们向其周围8个方向找到所有包括其自身的五元组,并统计白棋和黑棋的个数,从而根据上面的评分表进行加分。

举个栗子


图2

对于1号位置,我们先统计以它为底端的五元组,即第一个矩形,然后是第二个,第三个,一直到以1号位置为顶端的五元组,这样我们就统计了y轴方向的分数。

同理,接着统计x轴方向,两种对角线方向的五元组的得分,这样1号点位置的得分就出来了,我们将这个值赋值在对应的scoreTable[][]里面;

对图1中所有红点的得分统计完成后,我们就可以遍历整个得分表scoreTable[][],其中的分最高而且为空的位置就是计算机下子的位置。

当然,这种方法思路和编程都很简单,自然效果比不上正规军中极大极小值搜索中应用alpha-beta剪枝这种方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息