public void calculateStblNewHcps(Hcps oldHcps) { //ToCheck9 stblPointsForNewHcp.points.Clear(); foreach (flight ctF in flights.Values) { foreach (team ctT in ctF.teams.Values) { foreach (playingBall b in ctT.playingBalls.Values) { string playerString = b.GetPlayersString(); foreach (Player ctP in b.players.Values) { Double oldHcp = ctP.initialHcp; if (oldHcps != null && oldHcps.hpcs.ContainsKey(ctP.name)) { oldHcp = oldHcps.hpcs[ctP.name]; } int ctPlayingHcp = (int)Math.Round(courseDefinition.getPlayingHcp(oldHcp), 0); stblPointsForNewHcp.points.Add(ctP.name, new List <int>() { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }); if (scores.holeResults.ContainsKey(playerString)) { for (int holeNr = 1; holeNr <= 18; holeNr++) { hole ctHoleDefinition = courseDefinition.getHolebyNr(holeNr); int Stbl = calcStblPointforHole(scores.getScore(playerString, holeNr), ctHoleDefinition.par, ctHoleDefinition.hcp, ctPlayingHcp); if (b.nbOfPlayerForBall == 1) { stblPointsForNewHcp.points[ctP.name][holeNr - 1] = Stbl; } } if (stblPointsForNewHcp.isValidForStblDay() && b.nbOfPlayerForBall == 1) { NewHcps.hpcs.Add(ctP.name, NewHcps.calcNewHcpASG(oldHcp, stblPointsForNewHcp.getStblPointsForLastHoles(ctP.name))); } else { NewHcps.hpcs.Add(ctP.name, oldHcp); } } else { throw new Exception(String.Format("Could not find holeResults for Player {0}", playerString)); } } } } } }
public void calculate(int toDayNr) { #region 1st Loop with calc daily stbl ctDayOfCompetition = toDayNr; Hcps prHcps = null; for (int i = 1; i <= toDayNr; ++i) { day ctDay = getDaybyNr(i); ctDay.calculateStbl(); //calculate stbl for the day and every Players ctDay.calculateStblNewHcps(prHcps); prHcps = ctDay.NewHcps; Dictionary <string, PlayerResult> ctDailyResults = new Dictionary <string, PlayerResult>(); List <String> sortedList = ctDay.stblPoints.getSortedPlayerList(); foreach (Player P in Players) { PlayerResult ctPR = new PlayerResult(); ctPR.PlayerName = P.name; ctPR.StblDay = ctDay.stblPoints.getStblPointsForLastHoles(P.name); ctPR.shExtraDay = ctDay.getShPointsForExtra(P.name); ctPR.shMatch = ctDay.getShPointsForMatch(P.name, configForYear); ctPR.shStblDay = ctDay.getShPointsForStblDaily(P.name, configForYear); int Position = sortedList.FindIndex(x => x == P.name); ctPR.posStblDay = Position + 1; ctDailyResults.Add(ctPR.PlayerName, ctPR); } results.Add(ctDailyResults); // stores daily scores for the day } #endregion #region 2nd Loop Sum up and sort for weekly stable for (int i = 1; i <= toDayNr; ++i) { Dictionary <String, Double> sortableScores = new Dictionary <string, Double>(); foreach (Player P in Players) { //loop to identify the worst day for the player (scratch it) (from begin to i) int worstDay = 1; int worstDayStbl = 1000; int cntDaysValidForStbl = 0; for (int j = 1; j <= i; ++j) //loop from begin to i (ctDay in the mainloop) { day ctDay = getDaybyNr(j); if (ctDay.isFoursome) { continue; } cntDaysValidForStbl++; int ctStbl = getResultsbyDayNr(j)[P.name].StblDay; // get the daily stbl if (worstDayStbl > ctStbl) { worstDay = j; worstDayStbl = ctStbl; } } if (cntDaysValidForStbl <= 1) { worstDay = -1; //do not scratch if there is only one day of competition valid for stbl } getResultsbyDayNr(i)[P.name].worstDay = worstDay; //worst day //sortable score looks like 144 (sum) 0036 (stbl day4) 0033 (stbl day3) 0041 (stbl day2) 0034 (stbl day1). 0008 (position from 1st stbl) and is used to sort out players with same sum for the week Double factor = 1; Double factor_X = 1; Double sortableScore = (100 - (double)getResultsbyDayNr(1)[P.name].posStblDay) / 1000; //initialise with position from the 1st stbl (position (not stbl) forces a position even at beginning) Double sortableScore_X = (100 - (double)getResultsbyDayNr(1)[P.name].posStblDay) / 1000; int sumStbl = 0; int sumStbl_X = 0; Double sumEff = 0; for (int j = 1; j <= i; ++j) //loop from begin to i (ctDay in the mainloop) { sumEff += getResultsbyDayNr(j)[P.name].shMatch + getResultsbyDayNr(j)[P.name].shStblDay + getResultsbyDayNr(j)[P.name].shExtraDay; day ctDay = getDaybyNr(j); if (ctDay.isFoursome) { continue; } int ctStbl = getResultsbyDayNr(j)[P.name].StblDay; // get the daily stbl sumStbl += ctStbl; // sum up sortableScore += factor * (double)ctStbl; //store for sort factor *= 1000; //don't use the score from the worstday if (j != worstDay) { sumStbl_X += ctStbl; // sum up sortableScore_X += factor_X * (double)(ctStbl == 0 ? 1: ctStbl); //store for sort (0 is not good) factor_X *= 1000; } } sortableScore += factor * (double)sumStbl; //store for sort sortableScore_X += factor_X * (double)sumStbl_X; //store for sort getResultsbyDayNr(i)[P.name].shEffective = sumEff; //sum of matchs + daily sh + extra if defined getResultsbyDayNr(i)[P.name].StblWeek = sumStbl; //save sum for week getResultsbyDayNr(i)[P.name].StblWeek_X = sumStbl_X; //save sum for week (scratch) if (configForYear.useScratch) { sortableScores.Add(P.name, sortableScore_X); //add sortableScore to dictionary } else { sortableScores.Add(P.name, sortableScore); //add sortableScore to dictionary } } List <String> sortedList = sortableScores.OrderByDescending(kp => kp.Value).Select(kp => kp.Key).ToList(); sortableScores.Clear(); foreach (Player P in Players) //loop again to get Position and sh { int Position = sortedList.FindIndex(x => x == P.name); //if (!getDaybyNr(i).stblPoints.isValidForStblDay()) // Position = 8; // make sure getResultsbyDayNr(i)[P.name].posStblWeek = Position + 1; String[] splits = configForYear.stlWeek.Replace(" ", "").Split(','); double ctSh = 0; if (splits.Length > Position) { Double.TryParse(splits[Position], out ctSh); } getResultsbyDayNr(i)[P.name].shStblWeek = ctSh; getResultsbyDayNr(i)[P.name].shVirtual = getResultsbyDayNr(i)[P.name].shEffective + ctSh; #region sortable score for overall Position Double sortableScore = 0; Double factor = 1; sortableScore += 20 - getResultsbyDayNr(i)[P.name].posStblWeek * factor; factor *= 1000; sortableScore += getResultsbyDayNr(i)[P.name].shVirtual * factor; sortableScores.Add(P.name, sortableScore); #endregion } sortedList.Clear(); sortedList = sortableScores.OrderByDescending(kp => kp.Value).Select(kp => kp.Key).ToList(); foreach (Player P in Players) //loop again to get Position and sh { int Position = sortedList.FindIndex(x => x == P.name); getResultsbyDayNr(i)[P.name].posVirtual = Position + 1; } } #endregion }