【问题标题】:Improving evaluation function in tic-tac-toe game - alpha-beta algorithm改进井字游戏中的评估函数 - alpha-beta 算法
【发布时间】:2017-03-20 22:24:40
【问题描述】:

我正在寻找用于开发井字游戏 AI 的 minimax/alpha-beta 算法的最佳评估函数。

我正在计算一行/列/对角线中圆圈/十字的数量,后面有空格(三排,没有空格)。根据该行中的符号数量,我将单独的分数乘以 10^(counter-1),得到 1,10 或 100 分。

我确信可以改进很多,因为很少找到最佳解决方案,而且我在字母算法中使用此函数时遇到问题

我的问题是 - 如何改进此功能?小段代码和建议表示赞赏。

我的代码:

private int h(int[][] field, int depth, int player) //final score of the node
        {
            if (win(field, 1)) //if human won
                return -1000; //very bad for MAX=computer
            if (win(field, 0)) //if computer won
                return 1000;

            int heuristics = individualScore(field, 0) - individualScore(field, 1);
            return heuristics;
        }

private int individualScore(int[][] field, int player)
        {

            int sum = 0;
            int otherPlayer = -1;
            if (player == 0) //if computer is the current player
                otherPlayer = 1; //other player is human
            else
                otherPlayer = 0;//Vice versa
            for (int i = 0; i < 3; i++) // rows
            {
                int counter = 0;
                bool rowAvailable = true;
                for (int l = 0; l < 3; l++)
                {
                    if (field[i][l] == player)
                        counter++;
                    if (field[i][l] == otherPlayer)
                    {
                        rowAvailable = false;
                        break;
                    }
                }
                if (rowAvailable && counter > 0)
                    sum += (int)Math.Pow(10, counter - 1);
            }

            for (int i = 0; i < 3; i++) // columns
            {
                int counter = 0;
                bool columnAvailable = true;
                for (int k = 0; k < 3; k++)
                {
                    if (field[k][i] == player)
                        counter++;
                    if (field[k][i] == otherPlayer)
                    {
                        columnAvailable = false;
                        break;
                    }
                }
                if (columnAvailable && counter > 0)
                    sum += (int)Math.Pow(10, counter - 1);
            }
            int counterD = 0;
            bool diagonalAvailable = true;
            for (int i = 0; i < 3; i++) //diagonals
            {
                if (field[i][i] == player)
                    counterD++;
                if (field[i][i] == otherPlayer)
                {
                    diagonalAvailable = false;
                    break;
                }
            }
            if (diagonalAvailable && counterD > 0)
                sum += (int)Math.Pow(10, counterD - 1);
            counterD = 0;
            diagonalAvailable = true;
            int j = 0;
            for (int i = 2; i >= 0; i--)
            {
                if (field[i][j] == player)
                    counterD++;
                if (field[i][j] == otherPlayer)
                {
                    diagonalAvailable = false;
                    break;
                }
            }
            if (diagonalAvailable && counterD > 0)
                sum += (int)Math.Pow(10, counterD - 1);

            return sum;
        }

【问题讨论】:

    标签: c# algorithm tic-tac-toe minimax alpha-beta-pruning


    【解决方案1】:

    您可以让您的 AI 向前走一步甚至两步,这样您就可以看到在 AI 迈出一步后用户(然后是 AI)有多少机会(并再次评估该机会)。 此外,您可以添加一些东西,以便 AI 试图诱骗用户进入他无法脱身的情况。这是可能的,因为在井字游戏中没有那么多可能性。

    如果你想变得非常酷,你可以创建一个神经网络,它可以从你玩的一些游戏中学习,但这是一个完全不同的故事。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-27
      • 2015-12-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多