private static int ColorPenalty(GameColorResult wantedColorResult, GameColorResult mostlyPlayedAs) { if (mostlyPlayedAs == GameColorResult.Draw) { return(0); } if (mostlyPlayedAs == wantedColorResult) { return(-1); } return(1); }
private static Player GetOpponent(GameColorResult wantedColorResult, Player playerToPair, List <Player> playersLeft, IEnumerable <Round> previousRounds, IEnumerable <RoundResult> standings) { var opponentsByWeight = new List <OpponentWeight>(); foreach (var player in playersLeft) { var opponenWeight = CalculateWeight(player, playerToPair, wantedColorResult, previousRounds, standings); opponentsByWeight.Add(new OpponentWeight(player, opponenWeight)); } var orderedByWeight = opponentsByWeight.OrderBy(o => o.Weight).ToList(); return(orderedByWeight.First().Player); }
private static double CalculateWeight(Player player, Player playerToPair, GameColorResult wantedColorResult, IEnumerable <Round> previousRounds, IEnumerable <RoundResult> standings) { var weight = 1d; if (player.PlayerId == playerToPair.PlayerId) { return(1000000); } var lastStandings = standings?.Last(); var roundNumber = previousRounds.Any() ? previousRounds.Last().RoundNumber + 1 : 1; var playerGames = GetAllPreviousGames(previousRounds, player); weight += ScorePenalty(roundNumber, lastStandings, player, playerToPair); weight += FloatingPenalty(previousRounds, standings, player, playerToPair); weight += OpponentPenalty(NumberOfTimesPlayerMetPreviously(playerToPair, playerGames)); weight += ColorPenalty(wantedColorResult, MostlyPlayedAs(playerGames, player)); weight += CountryPenalty(roundNumber, player, playerToPair); return(weight); }