由于stackoverflowexception,C#Minimax进程终止

时间:2018-01-23 20:33:06

标签: c# minimax

我一直在尝试使用minimax功能在C#中创建一个tic tac toe游戏。不幸的是,我遇到了使minimax函数正常工作的问题。

    static double MiniMax(char[] gameState, int depth)
    {
        int bestMove = 0;
        double bestScore = -double.PositiveInfinity;
        if (maxDepth > 0)
        {
            for (int i = 0; i < 9; i++)
            {
                if (ValidMove(i, gameState))
                {
                    char[] clone = new char[board.Length];
                    board.CopyTo(clone, 0);
                    clone[i] = 'X';
                    double score = 0;
                    score += MinPlay(clone, maxDepth--);
                    if (score > bestScore)
                    {
                        bestMove = i;
                        bestScore = score;
                    }
                }
            }
        }
        return bestMove;
    }

    static double MinPlay(char[] gameState, int depth)
    {
        if (Win(gameState)) return -1;
        if (Draw(gameState)) return 0;
        double bestScore = double.PositiveInfinity;
        if (maxDepth > 0)
        {
            for (int i = 0; i < 9; i++)
            {
                if (ValidMove(i, gameState))
                {
                    char[] clone = new char[board.Length];
                    board.CopyTo(clone, 0);
                    clone[i] = 'O';
                    double score = 0;
                    score += MaxPlay(clone, maxDepth--);
                    if (score > bestScore)
                    {
                        bestScore = score;
                    }
                }
            }
        }
        return bestScore;
    }

    static double MaxPlay(char[] gameState, int depth)
    {
        if (Win(gameState)) return 1;
        if (Draw(gameState)) return 0;
        double bestScore = -double.PositiveInfinity;
        if (maxDepth > 0)
        {
            for (int i = 0; i < 9; i++)
            {
                if (ValidMove(i, gameState))
                {
                    char[] clone = new char[board.Length];
                    board.CopyTo(clone, 0);
                    clone[i] = 'X';
                    double score = 0;
                    score += MinPlay(clone, maxDepth--);
                    if (score > bestScore)
                    {
                        bestScore = score;
                    }
                }
            }
        }
        return bestScore;
    }

我使用以下指南制作了这些功能:http://giocc.com/concise-implementation-of-minimax-through-higher-order-functions.html

运行程序时,一切正常,直到计算机必须轮流运行。我收到错误&#34;由于StackOverflowException&#34;,进程终止。 我认为这是由无限递归引起的,但在查看程序一段时间后,我无法分辨出导致它的原因。

我编辑了代码,以便现在有一个深度,minplay和maxplay循环有一个有效的移动检查。计算机现在采取行动但由于某种原因它只选择第一个位置。如果玩家选择第一个位置作为他们的第一个移动,则计算机然后选择它旁边的位置,并且在下一个转弯处它将在第一个位置上写入玩家。然后计算机停止移动。我不知道为什么会发生这种情况。

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:0)

这是因为MaxPlay调用函数MinPlay,而函数MaxPlay又调用函数FROM node:9 RUN npm install -g bunyan ,并且在每次连续调用之后你都没有做任何改变游戏状态的事情导致递归结束。您只需在'o'和'x'之间切换clone [0],您的函数永远不会完成for循环的迭代。

答案 1 :(得分:0)

将MinPlay和MaxPlay中的for循环更改为仅考虑空方块。它看起来像你没有使用传入的gameState。我不知道在哪里定义了板。

    if (score < bestScore)
    {
        bestScore = score;
    }

编辑:

您将其更改为得分+ =这是不正确的。 此外,您在MinPlay中的分数比较不正确。

{{1}}