2017-08-05 20:48:17 -07:00
|
|
|
// Copyright 2017 Team 254. All Rights Reserved.
|
|
|
|
|
// Author: pat@patfairbank.com (Patrick Fairbank)
|
|
|
|
|
//
|
|
|
|
|
// Game-specific fields by which teams are ranked and the logic for sorting rankings.
|
|
|
|
|
|
|
|
|
|
package game
|
|
|
|
|
|
|
|
|
|
import "math/rand"
|
|
|
|
|
|
|
|
|
|
type RankingFields struct {
|
2020-03-18 22:42:36 -07:00
|
|
|
RankingPoints int
|
|
|
|
|
AutoPoints int
|
|
|
|
|
EndgamePoints int
|
|
|
|
|
TeleopPoints int
|
|
|
|
|
Random float64
|
|
|
|
|
Wins int
|
|
|
|
|
Losses int
|
|
|
|
|
Ties int
|
|
|
|
|
Played int
|
2017-08-05 20:48:17 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type Ranking struct {
|
2020-03-26 21:38:58 -07:00
|
|
|
TeamId int
|
|
|
|
|
Rank int
|
|
|
|
|
PreviousRank int
|
2017-08-05 20:48:17 -07:00
|
|
|
RankingFields
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-26 21:38:58 -07:00
|
|
|
type Rankings []Ranking
|
2017-08-05 20:48:17 -07:00
|
|
|
|
2020-04-14 19:38:14 -05:00
|
|
|
func (fields *RankingFields) AddScoreSummary(ownScore *ScoreSummary, opponentScore *ScoreSummary) {
|
2017-08-05 20:48:17 -07:00
|
|
|
fields.Played += 1
|
|
|
|
|
|
2020-03-21 14:10:20 -07:00
|
|
|
// Store a random value to be used as the last tiebreaker if necessary.
|
|
|
|
|
fields.Random = rand.Float64()
|
|
|
|
|
|
2017-08-05 20:48:17 -07:00
|
|
|
// Assign ranking points and wins/losses/ties.
|
|
|
|
|
if ownScore.Score > opponentScore.Score {
|
|
|
|
|
fields.RankingPoints += 2
|
|
|
|
|
fields.Wins += 1
|
|
|
|
|
} else if ownScore.Score == opponentScore.Score {
|
|
|
|
|
fields.RankingPoints += 1
|
|
|
|
|
fields.Ties += 1
|
|
|
|
|
} else {
|
|
|
|
|
fields.Losses += 1
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Assign tiebreaker points.
|
2020-03-18 22:42:36 -07:00
|
|
|
fields.AutoPoints += ownScore.AutoPoints
|
|
|
|
|
fields.EndgamePoints += ownScore.EndgamePoints
|
2020-04-14 19:38:14 -05:00
|
|
|
fields.TeleopPoints += ownScore.TeleopPoints
|
2017-08-05 20:48:17 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Helper function to implement the required interface for Sort.
|
|
|
|
|
func (rankings Rankings) Len() int {
|
|
|
|
|
return len(rankings)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Helper function to implement the required interface for Sort.
|
|
|
|
|
func (rankings Rankings) Less(i, j int) bool {
|
|
|
|
|
a := rankings[i]
|
|
|
|
|
b := rankings[j]
|
|
|
|
|
|
|
|
|
|
// Use cross-multiplication to keep it in integer math.
|
|
|
|
|
if a.RankingPoints*b.Played == b.RankingPoints*a.Played {
|
2020-03-18 22:42:36 -07:00
|
|
|
if a.AutoPoints*b.Played == b.AutoPoints*a.Played {
|
|
|
|
|
if a.EndgamePoints*b.Played == b.EndgamePoints*a.Played {
|
|
|
|
|
if a.TeleopPoints*b.Played == b.TeleopPoints*a.Played {
|
|
|
|
|
return a.Random > b.Random
|
2017-08-05 20:48:17 -07:00
|
|
|
}
|
2020-03-18 22:42:36 -07:00
|
|
|
return a.TeleopPoints*b.Played > b.TeleopPoints*a.Played
|
2017-08-05 20:48:17 -07:00
|
|
|
}
|
2020-03-18 22:42:36 -07:00
|
|
|
return a.EndgamePoints*b.Played > b.EndgamePoints*a.Played
|
2017-08-05 20:48:17 -07:00
|
|
|
}
|
2020-03-18 22:42:36 -07:00
|
|
|
return a.AutoPoints*b.Played > b.AutoPoints*a.Played
|
2017-08-05 20:48:17 -07:00
|
|
|
}
|
|
|
|
|
return a.RankingPoints*b.Played > b.RankingPoints*a.Played
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Helper function to implement the required interface for Sort.
|
|
|
|
|
func (rankings Rankings) Swap(i, j int) {
|
|
|
|
|
rankings[i], rankings[j] = rankings[j], rankings[i]
|
|
|
|
|
}
|