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); }
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); }