private static Rotation IdentifyRotation(EventRegistration player, GameAssignment swap) { if (swap.CanAddPlayer()) { return(new Rotation(RotationType.MovePlayer)); } else { foreach (var p in swap.Players) { if (p.PrefersGameOverCurrentAssignment(player.Assignment.Game)) { return(new Rotation(RotationType.TradePlayers) { PlayerTwo = p }); } } } return(Rotation.NoRotation); }
private static void FixInvalidGames(List <GameAssignment> assignments) { for (int i = 0; i < assignments.Count; i++) { GameAssignment a = assignments[i]; if (a.Players.Count == 0) { assignments.Remove(a); i--; } } assignments.Sort((x, y) => x.GetTotalSatisfaction().CompareTo(y.GetTotalSatisfaction())); assignments.Reverse(); for (int i = 0; i < assignments.Count; i++) { GameAssignment a = assignments[i]; if (!a.IsValid()) { var unassignedPlayers = new List <EventRegistration>(); Debug.WriteLine("Removing Players from Invalid Assignment: " + a.ToString()); foreach (var p in a.Players) { p.Assignment = null; unassignedPlayers.Add(p); } assignments.Remove(a); i--; for (int j = i; j < assignments.Count; j++) { GameAssignment potentialNewAssignment = assignments[j]; for (int p = 0; p < unassignedPlayers.Count; p++) { EventRegistration unassigned = unassignedPlayers[p]; if (potentialNewAssignment.CanAddPlayer() && unassigned.HasPreferenceForGame(potentialNewAssignment.Game)) { Debug.WriteLine("Moving unassigned player '{0}' to preferred game:{1}", unassigned.User.Name, potentialNewAssignment.Game); potentialNewAssignment.Players.Add(unassigned); unassigned.Assignment = potentialNewAssignment; unassignedPlayers.Remove(unassigned); p--; } } } foreach (EventRegistration p in unassignedPlayers) { foreach (var assignment in assignments) { if (assignment.CanAddPlayer()) { Debug.WriteLine("Moving unsatisfied player '{0}' to game:{1} (sorry!)", p.User.Name, assignment.Game); assignment.Players.Add(p); p.Assignment = assignment; break; } } } } } }