/// <summary> /// add new fill-in teammates to the roster until it reaches a number of teammates thats easily divisible into the matches. /// /// the weight of the fill-ins are equal to the highest weight around and the weight of the fill-ins to each other is higher than other opponents. /// /// problem though, with its weights being equal to the highest around, as well as the weights being even higher with the other fill-ins, these players will by default be sorted before anyone else until matches become more evenly distributed /// /// this is a problem because in an ideal scenario, a non-fill in player who's been playing with the same teammate too many times in a row would get the first pick, but now goes after fill-ins /// however, this still keeps the matches relatively balanced since they still probably have plenty of choices to pick from. /// </summary> private void AddFillinTeammatesToRoster() { int fillInIndex = 0; //find highest weights so that fill-ins start with average weights int highestTeamWeight = GetHighestTeamWeight(); int highestOpponentWeight = GetHighestOpponentWeight(); PlayerNamesTextBox.AppendText(Environment.NewLine); //create more fill-in Players until the roster is full while ((playerRoster.Count % (Int32.Parse(NumTeamsPerMatchField.Text) * Int32.Parse(NumPlayersOnTeamField.Text))) != 0) { //add a new Player with weights matching the highest Team weight and opponent weight AddNewPlayer("Fill-In " + (fillInIndex + 1), GetHighestTeamWeight(), GetHighestOpponentWeight()); fillInIndex++; } PlayerNamesTextBox.Text = PlayerNamesTextBox.Text.Substring(0, PlayerNamesTextBox.Text.Length - 2); //update NumberOfPlayersInRosterField for ease of future generation NumberOfPlayersInRosterField.Text = "" + PlayerNamesTextBox.Lines.Count(); //increases weight between fill-ins to reduce matches with frequent fill-ins for (int i = 0; i < fillInIndex; i++) { for (int j = 0; j < fillInIndex; j++) { if (i != j) { playerRoster[playerRoster.Count() - 1 - i].opponentWeights[playerRoster.Count() - 1 - j] += 3; playerRoster[playerRoster.Count() - 1 - i].teammateWeights[playerRoster.Count() - 1 - j] += 3; } } } }
/// <summary> /// add a new player to the game with a given name and weights (for all other players) /// </summary> private void AddNewPlayer(string playerName, int playersTeamWeight, int playersOpponentWeight) { List <int> whoTheyFoughtWith = new List <int>(); List <int> whoTheyFoughtAgainst = new List <int>(); //set this Player's weight on self and on all opponents for (int j = 0; j < playerRoster.Count; j++) { playerRoster[j].teammateWeights.Add(playersTeamWeight); playerRoster[j].opponentWeights.Add(playersOpponentWeight); whoTheyFoughtWith.Add(playersTeamWeight); whoTheyFoughtAgainst.Add(playersOpponentWeight); } //add one more line for self whoTheyFoughtWith.Add(-1); whoTheyFoughtAgainst.Add(-1); Player person = new Player(playerName, playerRoster.Count, whoTheyFoughtWith); person.opponentWeights = whoTheyFoughtAgainst; playerRoster.Add(person); //add name to right text box PlayerNamesTextBox.AppendText(person.name); PlayerNamesTextBox.AppendText(Environment.NewLine); }
/// <summary> /// adds a new Player to the roster /// </summary> private void AddPlayerButton_Click(object sender, EventArgs e) { //adds a new line to the PlayerNamesTextBox PlayerNamesTextBox.AppendText(Environment.NewLine); //give everyone weights for the new Player AddNewPlayer("New Player", GetHighestTeamWeight(), GetHighestOpponentWeight()); //remove extra line of PlayerNamesTextBox PlayerNamesTextBox.Text = PlayerNamesTextBox.Text.Substring(0, PlayerNamesTextBox.Text.Length - 2); //increase number of Players in form NumberOfPlayersInRosterField.Text = "" + PlayerNamesTextBox.Lines.Count(); }
/// <summary> /// goes through each column of the CSV for this row, setting appropriate teammate weight /// </summary> private void HandleEachTeammateColumn(string field, ref string[] fields, ref string playerName, ref List <int> whoTheyFoughtWith, int index) { if (field == fields[0]) { //set name from first column playerName = field; //adds Player name to text box on side if (index != 0) { PlayerNamesTextBox.AppendText(Environment.NewLine); } PlayerNamesTextBox.AppendText(field); } else { //add opponent weight whoTheyFoughtWith.Add(Int32.Parse(field)); } }