use crate::math::general::NumTools;
pub struct EloPlayer {
pub elo: (f32, u16),
pub age: u8,
k_factor: u8
}
impl EloPlayer {
pub fn new(elo: (f32, u16), age: u8) -> EloPlayer {
let mut res = EloPlayer { elo, age, k_factor: 0 };
res.update_k_factor();
res
}
pub fn update_rating(&mut self, opponent_rating: f32, scored: f32) {
self.update_k_factor();
let expected = (1.0+10.0_f32.powf((opponent_rating - self.elo.0) / 400.0)).recip();
self.elo.0 = self.elo.0 + self.k_factor as f32 * (scored - expected);
self.elo.1.inc();
}
fn update_k_factor(&mut self) {
if (self.age >= 18 && self.elo.0 < 2300.0) || self.elo.1 < 30
{ self.k_factor = 40; }
else if self.elo.0 < 2400.0 && self.elo.1 >= 30
{ self.k_factor = 20; }
else
{ self.k_factor = 10; }
}
}