У меня есть минимаксный алгоритм, но я не уверен, что разобрать на позицию? - PullRequest
1 голос
/ 18 июня 2020

Я делаю настольную игру, похожую на манкалу. Я основал свой алгоритм на этом видео: https://www.youtube.com/watch?v=l-hh51ncgDI

Однако я застрял с переменной позицией и думаю, что мне все еще нужно сохранить ход. Я впервые занимаюсь искусственным интеллектом, и этот проект включал создание искусственного интеллекта для уникальной игры. Я думаю, что делаю это ужасно неправильно, поскольку я думаю, что минимакс должен быть древовидной диаграммой, а у меня нет дерева.

public class MiniMax 
{
    bool gameOver = false;
    public float minimax(position, int depth, float alpha, float beta, bool player1)
    {
        if (depth == 0 || GameOver())
        {
            float score = Utility();
        }


        if (player1)
        {
            float maxVal = float.MaxValue;
            foreach (var child in postition)
            {
                float eval = minimax(postition, depth - 1, alpha, beta, false);
                maxVal = Mathf.Max(maxVal, eval);
                alpha = Mathf.Max(alpha, eval);
                if (beta <= alpha)
                {
                    break;
                }
            }
            return maxVal;
        }
        else
        {
            float minVal = float.MinValue;
            foreach (var child in postition)
            {
                float eval = minimax(postition, depth - 1, alpha, beta, true);
                minVal = Mathf.Max(minVal, eval);
                beta = Mathf.Max(beta, eval);
                if (beta <= alpha)
                {
                    break;
                }
            }
            return minVal;
        }
    }

    bool GameOver()
    {
        return false;
    }

    float Utility()
    {
        //f(x) = -1(j.a + k.b) + l.c + m.d
        float a = GameManager.arr1[0].LightStones;
        float b = GameManager.arr2[0].DarkStones;
        float c = GameManager.arr1[7].LightStones;
        float d = GameManager.arr2[7].DarkStones;

        float j;
        if(a > c)
        {
            j = 1.5f;
        }
        else
        {
            j = 1;
        }

        float k;
        if (b > d)
        {
            k = 1.5f;
        }
        else
        {
            k = 1;
        }

        float l;
        if (c > a)
        {
            l = 1.5f;
        }
        else
        {
            l = 1;
        }

        float m;
        if (d > b)
        {
            m = 1.5f;
        }
        else
        {
            m = 1;
        }

        return (-1*((j*a) + (k*b))) + (l*c) + (m*d);
    }

}
...