C# Minimax TicTacToe Algorithm

Viewed 54

Algorithm is supposed to choose a move based on it's evaluated score but the algorithm rather chooses incrementing values of available slots.


        public string Human = "O";
        public string Computer = "X";

        PlayerMove player = new PlayerMove();
        ComputerMove ai = new ComputerMove();

        static void Main(string[] args)
        {
            Program program = new Program();
            program.PrintBoard();

            program.startGame();
            
        }
        void startGame()
        {
            string turn = "Computer";
            while (EmptySquares() != 0 && Winner() == " ")
            {
                if (turn == "Computer")
                {
                    string[] cloneBoard = (string[])RealBoard.Clone();
                    int ComputerPick = ai.GetMove(cloneBoard);
                    RealBoard[ComputerPick] = Computer;
                    PrintBoard();
                    turn = "Human";

                }
                else if (turn == "Human")
                {
                    int HumanMove = player.GetMove(RealBoard);
                    RealBoard[HumanMove - 1] = Human;
                    PrintBoard();
                    turn = "Computer";
                }


            }
            if (EmptySquares() == 0)
            {
                Console.WriteLine("Tie!");
            }
            else if (Winner() == "X")
            {
                Console.WriteLine("X Wins!");
            }
            else if (Winner() == "O")
            {
                Console.WriteLine("O Wins");
            }
        }
        int EmptySquares()
        {
            int Counter = 0;
            for (int i = 0; i < 9; i++)
            {
                if (RealBoard[i] == " ")
                {
                    Counter++;
                }
            }
            return Counter;
        }
        string Winner()
        {
            if (RealBoard[0] == RealBoard[1] && RealBoard[1] == RealBoard[2])
            {
                return RealBoard[0];
            }
            if (RealBoard[3] == RealBoard[4] && RealBoard[4] == RealBoard[5])
            {
                return RealBoard[3];
            }
            if (RealBoard[6] == RealBoard[7] && RealBoard[7] == RealBoard[8])
            {
                return RealBoard[6];
            }

            if (RealBoard[0] == RealBoard[3] && RealBoard[3] == RealBoard[6])
            {
                return RealBoard[0];
            }
            if (RealBoard[1] == RealBoard[4] && RealBoard[4] == RealBoard[7])
            {
                return RealBoard[1];
            }
            if (RealBoard[2] == RealBoard[5] && RealBoard[5] == RealBoard[8])
            {
                return RealBoard[2];
            }

            if (RealBoard[0] == RealBoard[4] && RealBoard[4] == RealBoard[8])
            {
                return RealBoard[0];
            }
            if (RealBoard[2] == RealBoard[4] && RealBoard[4] == RealBoard[6])
            {
                return RealBoard[2];
            }

            return " ";
        }
        void PrintBoard()
        {
            for (int i = 0; i < 9; i++)
            {
                if (RealBoard[i] == " ")
                {
                    Console.Write(" ");
                }
                else if (RealBoard[i] == "X")
                {
                    Console.Write("X");
                }
                else if (RealBoard[i] == "O")
                {
                    Console.Write("O");
                }
                if (i == 0 || i == 3 || i == 6 || i == 1 | i == 4 | i == 7)
                {
                    Console.Write(" | ");
                }
                if (i == 2 || i == 5)
                {
                    Console.WriteLine("");
                }
            }
            Console.WriteLine("");
            Console.WriteLine("");

        }

Above is the code that is inside the game class that calls the computer class to calculate a move

public int GetMove(string[] board)
        {
            int Move = -1;
            Console.WriteLine("Make a move:");
            Move = Int32.Parse(Console.ReadLine());
            if (board[Move - 1] != " ")
            {
                GetMove(board);
            }
            return Move;
        }

This is already working code from inputting the user's choice of move


    class ComputerMove
    {
        public string Human = "O";
        public string Computer = "X";
        public int GetMove(string[] board)
        {
            int Move = 0;
            int bestScore = -800;

            for (int i = 0; i < 9; i++)
            {
                if (board[i] == " ")
                {
                    board[i] = Computer;
                    int score = minimax(board, 0 , false);
                    if (score > bestScore)
                    {
                        bestScore = score;
                        Move = i;
                    }
                }
            }
            return Move;
        }

        int minimax(string[] board, int depth, Boolean isMaximize)
        {
            int score;
            var result = checkWinner(board, "X");
            
            if (checkWinner(board, Computer))
            {
                return 1;
            } else if (checkWinner(board, Human))
            {
                return -1;
            } else if (checkDraw(board))
            {
                return 0;
            }

            if (isMaximize == true)
            {
                int maxEval = -800;
                for (int i = 0; i < 9; i++)
                {
                    if (board[i] == " ")
                    {
                        board[i] = Computer;
                        score = minimax(board, depth + 1, false);
                        if (score > maxEval)
                        {
                            maxEval = score;
                        }
                    }
                }
                return maxEval;
            } else 
            {
                int minEval = 800;
                for (int i = 0; i < 9; i++)
                {
                    if (board[i] == " ")
                    {
                        board[i] = Human;
                        score = minimax(board, depth + 1, true);
                        if (score < minEval)
                        {
                            minEval = score;
                        }
                    }
                }
                return minEval;
            }
        }

        Boolean checkWinner(string[] board, string Letter)
        {
            string winner = "";
            if (board[0] == board[1] && board[1] == board[2] && board[0] == Letter)
            {
                return true;
            }
            if (board[3] == board[4] && board[4] == board[5] && board[3] == Letter)
            {
                return true;
            }
            if (board[6] == board[7] && board[7] == board[8] && board[6] == Letter)
            {
                return true;
            }

            if (board[0] == board[3] && board[3] == board[6] && board[0] == Letter)
            {
                return true;
            }
            if (board[1] == board[4] && board[4] == board[7] && board[1] == Letter)
            {
                return true;
            }
            if (board[2] == board[5] && board[5] == board[8] && board[2] == Letter)
            {
                return true;
            }

            if (board[0] == board[4] && board[4] == board[8] && board[0] == Letter)
            {
                return true;
            }
            if (board[2] == board[4] && board[4] == board[6] && board[2] == Letter)
            {
                return true;
            }
            return false;
        }

        Boolean checkDraw(string[] board)
        {
            int Counter = 0;
            for (int i = 0; i < 9; i++)
            {
                if (board[i] == " ")
                {
                    return false;
                }
            }
            return true;
        }
    }

This is the code that is supposed to evaluate each possible moving using minimax, if you find any problems could you let me know?

0 Answers
Related