Exemplo n.º 1
0
        private static int Evaluate(Competition competition, MiniMaxColor color)
        {
            var myScore       = GetScoreForColor(competition, color.Value);
            var opponentScore = GetScoreForColor(competition, color.Opposite().Value);

            var score = myScore - opponentScore;

            return(color.IsMaximizing ? score : -score);
        }
Exemplo n.º 2
0
        private static ScoredMove MiniMax(Competition competition, MiniMaxColor color, int depth)
        {
            var availableMoves = competition.GetAvailableMoves(color.Value);

            if (depth == 0 || availableMoves.Count == 0)
            {
                var score = Evaluate(competition, color);
                return(new ScoredMove(Move.Up, score));
            }

            var scoredMoves = new List <ScoredMove>();

            foreach (var move in availableMoves)
            {
                competition.MakeMove(color.Value, move);
                var scoredMove = MiniMax(competition, color.Opposite(), depth - 1);
                competition.RevertMove(color.Value, move);
                scoredMoves.Add(new ScoredMove(move, scoredMove.Score));
            }

            var bestMove = GetInfinityMove(color.IsMaximizing);

            foreach (var move in scoredMoves)
            {
                if (color.IsMaximizing)
                {
                    if (move.Score > bestMove.Score)
                    {
                        bestMove = move;
                    }
                }
                else
                {
                    if (move.Score < bestMove.Score)
                    {
                        bestMove = move;
                    }
                }
            }

            return(bestMove);
        }