我正在开发4连续游戏。在这我正在创建AI。 我使用了与Four in a row logic相同的逻辑。
我的游戏中的代表空位。 1表示用户插槽,2表示计算机插槽。
现在我想开发AI,如果用户意味着' 1'连续三次然后将2放到第4行。
[0,0,0,0,0,0,0],
[0,0,0,0,0,0,0],
[0,0,0,0,0,0,0],
[0,0,0,0,0,0,0],
[0,0,2,2,0,0,0],
[0,1,1,1,0,0,0]
我想在' 1'之后的最后一行第4列放2。比如[0,1,1,1,2,0,0],然后通过创建AI然后做什么?
答案 0 :(得分:2)
AI可以使用Minimax算法实现,该算法可以在维基百科上找到,链接如下:
http://en.wikipedia.org/wiki/Minimax
基本上,你需要一个函数f来决定游戏的状态,玩家1是赢了(值1)还是玩家2赢了(值-1)或者游戏还没有结束。如果游戏尚未结束,则必须通过在棋盘上模拟它们并递归地再次呼叫F来评估当前玩家的所有动作,其中相应的其他玩家处于活动状态。可能移动的值将是F的返回值的最大值(如果玩家1是当前玩家)或F的返回值的最小值(如果玩家2是当前玩家)。
至少这是一个粗略的想法;取决于用于实现的编程语言,评估逻辑可以独立于特定游戏来实现,使得相同的代码可以播放四行或者井字游戏。此外,如果找到值1(对于玩家1)或-1(对于玩家2)的移动,则可以停止评估,这也称为“修剪搜索树”。
答案 1 :(得分:0)
使用这部分代码来防止用户在所有行中创建0,1,1,1,0等情况,它将返回计算机应该使用的列数:
for(byte i=0;i<6;i++)
{
byte min = (byte) ((i * 7) + 1);
for(int j = 0;j<=2;j++) {
if (boardValues[min+j] == 1 && boardValues[min + j + 1] == 1 && boardValues[min - 1 + j] == 0 && boardValues[min +j + 2] == 0) {
if (i == 5) return (byte) ((min + j - 1)%7);
else if(boardValues[min - 1 + j + 7] != 0 && boardValues[min +j + 2 + 7] != 0)
return (byte) ((min + j - 1)%7);
}
}
}
在我的代码中,boardValues是这样的:
public static byte[] boardValues = new byte[42];
答案 2 :(得分:0)
使用强化学习技巧。您可以尝试时差学习方法。让游戏自己随机玩,并学习每个州的价值功能。经过几个小时的游戏,它会聚合在一起。
答案 3 :(得分:0)
可能为时已晚,但是如果仍然有人想知道,这里有一系列文章-http://blog.gamesolver.org/。
它逐步解释了概念和逻辑,以使Connect 4解析器AI得以实现。