private GameState SearchBestMoves(IGame game, int depth, int playerIndex) { if ((game.CurrentUniversityIndex == playerIndex && game.HasWinner()) || depth == 0) { return new GameState(Evaluate(game)); } var allMoves = game.GenerateAllMoves(); if (allMoves.Count() == 1 && playerIndex == game.CurrentUniversityIndex) { return new GameState(allMoves.First(), Evaluate(game)); } var bestMoves = new GameState(game.NumberOfUniversities, double.MinValue); foreach (IPlayerMove move in allMoves) { if (move is IProbabilityPlayerMove) { var expectedScores = new GameState(game.NumberOfUniversities, 0); double totalProbability = 0.0; foreach (var possibleMove in ((IProbabilityPlayerMove) move).AllProbabilityMoves) { var thisProbability = possibleMove.Probability.Value; if (thisProbability < 0.06) { continue; // skip 2, 12, 3, 11 for end turn } totalProbability += thisProbability; GameState nextScores = GetNextScores(game, depth, playerIndex, possibleMove); for (int i = 0; i < expectedScores.Scores.Length; ++i) { expectedScores[i] += thisProbability*nextScores[i]; } } for (int i = 0; i < game.NumberOfUniversities; ++i) { expectedScores[i] /= totalProbability; } // trust it with probability if (_random.NextDouble() < totalProbability) { bestMoves.TakeIfBetter(expectedScores, game.CurrentUniversityIndex, move); } } else //move is BuildCampusMove || move is BuildLinkMove || move is TradingMove) { GameState nextScores = GetNextScores(game, depth, playerIndex, move); bestMoves.TakeIfBetter(nextScores, game.CurrentUniversityIndex, move); } } return bestMoves; }
private GameState SearchBestMoves(IGame game, int depth) { if (game.HasWinner() || depth == 0) { return new GameState(Evaluate(game)); } var allMoves = game.GenerateAllMoves(); if (allMoves.Count() == 1) { return new GameState(allMoves.First(), Evaluate(game)); } var bestMoves = new GameState(game.NumberOfUniversities, double.MinValue); int currentUniversityIndex = game.CurrentUniversityIndex; foreach (var move in allMoves) { if (move is IBuildCampusMove || move is IBuildLinkMove || move is ITradingMove) { game.ApplyMove(move); GameState nextScoredMoves = SearchBestMoves(game, depth - 1); game.UndoMove(); bestMoves.TakeIfBetter(nextScoredMoves, currentUniversityIndex, move); } else if (move is IProbabilityPlayerMove) { var expectedScores = new GameState(game.NumberOfUniversities, 0); foreach (IProbabilityPlayerMove possibleMove in ((IProbabilityPlayerMove) move).AllProbabilityMoves) { game.ApplyMove(possibleMove); GameState nextScores = SearchBestMoves(game, depth - 1); game.UndoMove(); for (int i = 0; i < expectedScores.Scores.Length; ++i) { expectedScores[i] += possibleMove.Probability.Value*nextScores[i]; } } bestMoves.TakeIfBetter(expectedScores, currentUniversityIndex, move); } } return bestMoves; }