Ejemplo n.º 1
0
        public IMove ABNegamax(IBoardGame game, int maxDepth, int currentDepth, double alfa, double beta)
        {
            if (maxDepth == currentDepth || game.GameIsOver())
                return game.EvaluatePosition();
            IMove bestMove = null;
            var moves = (new RandomList<IMove>(game.GetLegalMoves())).Randomize();
            foreach (var validMove in moves)
            {
                if (bestMove == null) bestMove = validMove;
                IBoardGame testGame = game.TestMove(validMove);
                validMove.SetMoveScore(-(ABNegamax(testGame, maxDepth, currentDepth + 1, -beta, -Math.Max(alfa, bestMove.GetMoveScore())).GetMoveScore()));
                if (validMove.GetMoveScore() > bestMove.GetMoveScore())
                {
                    bestMove = validMove;
                }
                if (bestMove.GetMoveScore() >= beta)
                    return bestMove;

            }
            return bestMove;
        }
Ejemplo n.º 2
0
        public IMove MiniMax(IBoardGame game, int maxDepth, double alfa, double beta)
        {
            if (maxDepth == 0)
                return null;
            IMove bestMove = null;
            var moves = (new RandomList<IMove>(game.GetLegalMoves())).Randomize();
            int color = game.GetCurrentPlayer().GetPlayerID();
            foreach (var validMove in moves)
            {

                IBoardGame testGame = game.TestMove(validMove);
                validMove.SetMoveScore(testGame.EvaluatePosition(game));
                if (bestMove == null) bestMove = validMove;
                if (!testGame.GameIsOver())
                {
                    IMove nextBestMove = MiniMax(testGame, maxDepth - 1, alfa, beta);
                    if (nextBestMove != null) validMove.SetMoveScore(nextBestMove.GetMoveScore());
                    if (color == 1 && validMove.GetMoveScore() > beta)
                    {
                        beta = validMove.GetMoveScore();
                    }
                    if (color == -1 && validMove.GetMoveScore() < alfa)
                    {
                        alfa = validMove.GetMoveScore();

                    }
                }
                if (color == 1 && validMove.GetMoveScore() > alfa)
                {
                    validMove.SetMoveScore(alfa);
                    return validMove;
                }
                if (color == -1 && validMove.GetMoveScore() < beta)
                {
                    validMove.SetMoveScore(beta);
                    return validMove;

                }
                if (color * validMove.GetMoveScore() > color * bestMove.GetMoveScore())
                    bestMove = validMove;

            }

            return bestMove;
        }
Ejemplo n.º 3
0
        public List<IMove> EvaluateMoves(IBoardGame game, int maxDepth, int currentDepth, double alfa, double beta)
        {
            List<IMove> rankedMoveList = new List<IMove>();
            var moves = (new RandomList<IMove>(game.GetLegalMoves())).Randomize();
            foreach (var validMove in moves)
            {
                IBoardGame testGame = game.TestMove(validMove);
                validMove.SetMoveScore(-(ABNegamax(testGame, maxDepth, currentDepth + 1, -beta, -alfa)).GetMoveScore());
                int moveRank = 0;
                foreach (var insertedMove in rankedMoveList)
                {
                    if (validMove.GetMoveScore() < insertedMove.GetMoveScore())
                        moveRank++;
                    else break;
                }
                rankedMoveList.Insert(moveRank, validMove);
                for (int index = 0; index < rankedMoveList.Count; index++)
                {
                    rankedMoveList[index].SetRank(index);
                }

            }

            return rankedMoveList;
        }