效果截图
一.五子棋游戏策略:
1.
对于15*15的棋盘,每一行的获胜组合为11种,总共有15列,所以水平方向获胜组合为15*11=165;同理垂直方向上也为165中组合,而正反对角线上共有121*2=242种组合。所以所有获胜组合为165*2+121*2=572种。
2.
Boolean ptab[15][15][572]
Boolean ctab[15][15][572]
数组的前两个索引值代表棋格值,第三个数组索引值则是游戏中所有获胜组合的编号。这个获胜表数组所表示的意义就是某一棋格是否位于某个获胜组合之中,当获胜表数组中的元素值位于某个获胜组合中时,便将其设定为”true”,假设棋格”[4][5]”这个位置位于编号为”3”,”45”,”234”的获胜组合中,以玩家的获胜表来说,下面所列的这些元素的值将会是”true”
ptab[4][5][45]=true;
ptab[4][5][234]=true;
此外,在棋局进行时,上面玩家的获胜表元素值为”true”的条件必须是棋格”[4][5]”为空或为玩家的棋子,这样才表示玩家有可能在”[4][5]”位置上由编号”3”,”45”,”234”获胜组合中的其中一个获胜,相反若棋格”[4][5]”位置被计算机的棋子占用了,则玩家无法在此位置上下棋,则各个元素的值将设置为false;
ptab[4][5][3]=false;
ptab[4][5][45]=false;
ptab[4][5][234]=false;
相反,计算机获胜表中相对元素的值则会是true
ctab[4][5][3]=true;
ctab[4][5][45]=true;
ctab[4][5][234]=true;
另外还需要另外一个数组int win[2][572]来记录每一种组合中各填入了几颗棋子,第一个索引值代表玩家或计算机0代表玩家 1代表计算机。”win”数组的所有元素初值都是”0”,每当计算机或玩家在棋盘上放置一颗棋子后,程序会按照棋子的位置去获胜表中找出包含该位置的所有获胜组合,接着累加玩家或计算机在这些获胜组合中填入的棋子数目。以前面的例子来说,当玩家在”[4][5]”这个位置上放置了一颗棋子之后,就等于玩家在包含”[4][5]”这个位置编号为”3”,”45”,”234”的获胜组合中填入了一颗棋子,因此”win”数组中记录玩家在这些获胜组合中填入棋子总数的元素必须累加”1”,即
win[0][3]++;//玩家在编号”3”的获胜组合中的棋子数目加”1”
win[0][45]++;
win[0][234]++;
“win”数组的元素值在正常的情况下为0-6,表示计算机或玩家在各个获胜组合中填入了多少颗棋子,当元素值等于”5”时,便表示有一方已获胜。当玩家或计算机在某一获胜组合中的位置被对方占走,那么”win”数组中对应的元素值会直接设定为”7”,用来表示该方已无法由被占走位置的获胜组合上赢得棋局,延续上面的例子,当玩家在”[4][5]”位置上下了一颗棋子之后,除了将”win”数组里代表玩家获胜组合中包含位置”[4][5]”的元素值累加”1”外还需将代表计算机获胜组合中包含此位置的元素值设为7来表示计算机已无法由这些获胜组合上赢得棋局
Win[1][3]=7;
Win[1][45]=7;
Win[1][234]=7;
3.
计算机决策的设计是在每次下棋子之前先计算所有空白棋格上的获胜分数,接着再根据获胜分数的高低来决定哪一个空白棋格是最佳的下子位置。
分数计算规则:
(1)
| 20 | 20 | 20 | |
20 | | | 20 | 20 |
获胜组合中已放置两颗棋子
| 50 | | 50 | |
| | | 50 | 50 |
获胜组合中已放置三颗棋子
| | | | 1000 |
获胜组合中已放置四颗棋子
由以上说明在可获胜组合中已放置的棋子数越多,则在这个获胜组合上的空棋格上下棋子赢得棋局的机会就越大,所以设定越高的分数
另外,当在可获胜组合中有对方棋子,则在此获胜组合中的空棋格上的获胜分数就应直接设为0如下图
0 | | | | |
(2)按照棋格所在位置上可达成联机的获胜组合总数进行分数加总。用以下图来说明
| | 20 | 25 | 40 |
10 | 30 | 5 | | 5 |
5 | 20 | 25 | 5 | 0 |
10 | | 5 | 15 | 5 |
25 | 20 | 0 | 5 | 5 |
就”[0][4]”这个位置就单一获胜组合分别为20和5,所以加
起来就为25,当然在游戏进行时的实际计算,还必须判断各个单一获胜组合上是否有某些棋格位置已被对手的棋子占走而无法达成,并按获胜组合中已填入的棋子来增减获胜分数的比重,最后累加所有单一组合上棋格的获胜分数,便是棋格真正的获胜分数。
4.
计算机的攻击,按照前面计算出获胜分数越高的棋格就是最有可能使自己的棋子达成联机的位置,也就是最佳的攻击位置。同样道理对于计算机的防守,只需计算玩家获胜分数越高的棋格位置,并判断计算机与玩家哪一方具有最高的获胜分数来决定进行攻击或防守。比如当玩家在某一棋格上具有最高的获胜分数时,则计算机必须将下一步棋子放在此位置上。
二.Java程序实现