-6

我正在开发连续 4 个游戏。在这我正在创造人工智能。我使用了与连续四行逻辑相同的逻辑

在我的游戏中,0 代表空槽。1 代表用户插槽,2 代表计算机插槽。

现在我想开发人工智能,如果用户的意思是“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]

我想将 2 放在“1”之后的最后一行第 4 列,例如 [0, 1, 1, 1, 2, 0, 0] 并通过创建 AI 那么该怎么办?

4

3 回答 3

2

AI 可以通过使用可在以下链接下的 Wikipedia 上找到的 Minimax 算法来实现:

http://en.wikipedia.org/wiki/Minimax

基本上,您需要一个函数 f 来决定游戏状态是玩家 1 赢了(值 1)还是玩家 2 赢了(值 -1)或者游戏还没有结束。如果游戏尚未结束,则必须通过在棋盘上模拟它们并再次递归调用 F 来评估当前玩家的所有移动,其中相应的其他玩家处于活动状态。可能移动的值将是 F 的返回值的最大值(如果玩家 1 是当前玩家)或 F 的返回值的最小值(如果玩家 2 是当前玩家)。

至少这是一个粗略的想法;取决于用于实现的编程语言,评估逻辑可以独立于特定游戏来实现,这样相同的代码就可以玩四合一或井字游戏。此外,如果找到值 1(对于玩家 1)或 -1(对于玩家 2)的移动,则可以停止评估,这也称为“搜索树的修剪”。

于 2013-10-16T09:51:10.883 回答
0

可能为时已晚,但如果有人仍然有兴趣了解,这里有一系列文章 - http://blog.gamesolver.org/
它解释了概念和逻辑,一步一步地制作一个连接 4 解析器 AI。

于 2019-10-19T12:10:44.837 回答
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];
于 2016-04-17T05:13:09.857 回答