最近学了一点QT的绘图,因而乎照着学长的代码绘制了五子棋的小游戏。算法
最基础的东西这里就不说了,本身的知识也仅仅比会用多那么一点,下面咱们来讲说这里貌似高大上的人机AI吧。编程
评分表算法数组
通常状况下棋盘是15*15的。那么应该是572个五元组。而这五元组由黑棋白棋还有空格组成。也就是 3^5 * 572 = 138996; 看着不少吧,实际上是能够分类的。每一个五元组就是一种局势。.net
咱们只用统计只有己方棋子的局势,以及只有敌方棋子的局势,针对这两种局势给予肯定的评分,而其余局势直接评分为0。code
下面是我使用的是评分表
blog
// 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] 表明其余状况(貌似没用?)three
固然具体怎么来统计那?onezeros的博客没有给出来,对不少初学者来讲实现仍是有必定困难,这里就详细的讲一讲吧。游戏
首先咱们用一个棋盘大小的二维数组来储存每一个点的得分。int scoreTabel[15][15];
ip
每次,当People或者Computer下完棋后,以该点为中心统计周围5个点的分数(上下左右对角)。get
图1
即红点,统计每一个点的分数。
对于每一个红点,一样的,咱们向其周围8个方向找到全部包括其自身的五元组,并统计白棋和黑棋的个数,从而根据上面的评分表进行加分。
举个栗子
图2
对于1号位置,咱们先统计以它为底端的五元组,即第一个矩形,而后是第二个,第三个,一直到以1号位置为顶端的五元组,这样咱们就统计了y轴方向的分数。
同理,接着统计x轴方向,两种对角线方向的五元组的得分,这样1号点位置的得分就出来了,咱们将这个值赋值在对应的scoreTable[][]里面;
对图1中全部红点的得分统计完成后,咱们就能够遍历整个得分表scoreTable[][],其中的分最高并且为空的位置就是计算机下子的位置。
固然,这种方法思路和编程都很简单,天然效果比不上正规军中极大极小值搜索中应用alpha-beta剪枝这种方法。