Попытка реализовать алгоритм мин макс на крестики-нолики. Как мне реализовать рекурсивную функцию? - PullRequest
0 голосов
/ 02 января 2019

Я пытаюсь реализовать алгоритм minmax, который я нашел в javascript, для моей игры в крестики-нолики.Я приложил все усилия, но, по моему мнению, проблема, кажется, в рекурсивной функции, которую я отлаживал целую вечность.Это мой первый раз, когда я использую рекурсивную функцию, поэтому это сбивает меня с толку.

Так что я реализую алгоритм таким образом, и он дает мне движение, которое не имеет наилучшего результата, поэтому проблема может заключаться в возвращении результата длядвижение.

Ссылка на код JavaScript: https://medium.freecodecamp.org/how-to-make-your-tic-tac-toe-game-unbeatable-by-using-the-minimax-algorithm-9d690bad4b37

 public int Minimax(string[] reboard, bool player) {

        // board looks like this [] {"0","1","2","3","4","5","6","7","8"}
        //player X == true and player O == false
        //X is human O is an AI
        //array of possible moves 

        var array = Avail(reboard);

        //check if current position of the board, true/false is the current player
        if (WinningMinMax(reboard, true)) {
            return -10;
        } 
        else if (WinningMinMax(reboard, false)) {
          return  10;
        } 
        // or it is a draw
        else if (DrawMinMax(reboard)) {
           return 0;
        }
        //MoveS is an object with two parameters: index and score
        List<MoveS> moves = new List<MoveS>();

        for (var i = 0; i < array.Length; i++)
        {
            var move = new MoveS();
            move.index = Convert.ToInt32(reboard[Convert.ToInt32(array[i])]);

            if (player)
            {
                reboard[Convert.ToInt32(array[i])] = "X";
            }
            else
            {
                reboard[Convert.ToInt32(array[i])] = "O";
            }

            if (!player) {
                var g = new MoveS();
               //recursive call for building the tree of possible moves
                 g.score = Minimax(reboard, true);

                 move.score = g.score;
            } else {
                var g = new MoveS();

                g.score = Minimax(reboard, false);

                move.score = g.score;
            }
            //resets the board value
            reboard[Convert.ToInt32(array[i])] = move.index.ToString();
            // adding the final object move to a List of moves with score for every move
            moves.Add(move);
        }

        //finding the best move of possible moves
        int bestMove = 0;
        if (player == false) {
            var bestScore = -10000;
            for (var i = 0; i < moves.Count; i++) {
                if (moves[i].score > bestScore) {
                    bestScore = moves[i].score;
                    bestMove = i;
                }
            }
        } else {
            var bestScore = 10000;
            for (var i = 0; i < moves.Count; i++) {
                if (moves[i].score < bestScore) {
                    bestScore = moves[i].score;
                    bestMove = i;
                }
            }
        }
        //returning the best move's index for an Ai to play
        return moves[bestMove].index;
        }
...