Beispiel #1
0
        public Node minimax(OtheloGameLogic i_BoardPiecesPosition, int i_Depth, bool i_MaximizingPlayer)
        {
            if (i_Depth == 0 || (!i_BoardPiecesPosition.GetCurrentPlayerTurn().IsHaveValidMove&& !i_BoardPiecesPosition.GetOpposingPlayer().IsHaveValidMove))
            {
                return(boardPositionAIScore(i_BoardPiecesPosition));
            }

            if (i_MaximizingPlayer)
            {
                int  maxEval    = int.MinValue;
                Node resMaxEval = new Node();
                resMaxEval.ScoreResult         = maxEval;
                resMaxEval.BoardPiecesPosition = i_BoardPiecesPosition;

                foreach (Coordinates child in i_BoardPiecesPosition.ValidCoordinatesToAddPieces())
                {
                    i_BoardPiecesPosition.SetInputPieceAndFlipAllTheInfluencedPieces(child, true);
                    Node eval = minimax(i_BoardPiecesPosition, i_Depth - 1, false);

                    if (maxEval < eval.ScoreResult)
                    {
                        resMaxEval.ScoreResult         = eval.ScoreResult;
                        resMaxEval.BoardPiecesPosition = i_BoardPiecesPosition;
                    }
                }
                return(resMaxEval);
            }
            else
            {
                int  minEval    = int.MaxValue;
                Node resMinEval = new Node();
                resMinEval.ScoreResult         = minEval;
                resMinEval.BoardPiecesPosition = i_BoardPiecesPosition;

                foreach (Coordinates child in i_BoardPiecesPosition.ValidCoordinatesToAddPieces())
                {
                    i_BoardPiecesPosition.SetInputPieceAndFlipAllTheInfluencedPieces(child, true);
                    Node eval = minimax(i_BoardPiecesPosition, i_Depth - 1, true);

                    if (minEval > eval.ScoreResult)
                    {
                        resMinEval.ScoreResult         = eval.ScoreResult;
                        resMinEval.BoardPiecesPosition = i_BoardPiecesPosition;
                    }
                }
                return(resMinEval);
            }
        }
 private void doPlayerHumanMove(ref bool io_IsGameOver, Coordinates i_PlayerMoveCoordinate)
 {
     if (m_OtheloGameLogic.GetCurrentPlayerTurn().IsHaveValidMove)
     {
         io_IsGameOver = false;
         m_OtheloGameLogic.SetInputPieceAndFlipAllTheInfluencedPieces(i_PlayerMoveCoordinate);
         m_FormOthloGameBoard.ShowUpdatePlayerScore(m_OtheloGameLogic.GetCurrentPlayerTurn().Team, m_OtheloGameLogic.GetCurrentPlayerTurn().Score);
         m_FormOthloGameBoard.ShowUpdatePlayerScore(m_OtheloGameLogic.GetOpposingPlayer().Team, m_OtheloGameLogic.GetOpposingPlayer().Score);
     }
     else
     {
         m_OtheloGameLogic.ChangeTurn();
     }
 }