Sync scores between players

This commit is contained in:
2023-03-13 16:49:44 +01:00
parent 2fb71a3969
commit 1fc4e10c39
4 changed files with 101 additions and 0 deletions

79
board-shared/src/score.rs Normal file
View File

@@ -0,0 +1,79 @@
use crate::tile::{Operator, Tile};
/// Calculate the score for a given list of tiles.
pub fn calc_score(tiles: &[Tile]) -> u32 {
tiles
.split(|tile| matches!(tile, Tile::Equals))
.map(calc_expression_score)
.sum()
}
fn calc_expression_score(tiles: &[Tile]) -> u32 {
let mut digit_score = 0u32;
let mut multiplier = 1u32;
for token in tiles {
match token {
Tile::Digit(_) => digit_score += 1,
Tile::Operator(op) => {
match op {
Operator::Add | Operator::Subtract => multiplier = 2,
Operator::Multiply => multiplier = 3,
Operator::Divide => digit_score += 10,
};
}
_ => unreachable!(),
}
}
digit_score * multiplier
}
#[cfg(test)]
mod tests {
use crate::tile::Digit;
use super::*;
#[test]
fn only_digits() {
assert_eq!(
calc_score(&[
Tile::Digit(Digit::new(7)),
Tile::Digit(Digit::new(8)),
Tile::Equals,
Tile::Digit(Digit::new(9)),
Tile::Digit(Digit::new(4)),
]),
4
);
}
#[test]
fn calc_individually() {
assert_eq!(
calc_score(&[
Tile::Digit(Digit::new(4)),
Tile::Operator(Operator::Add),
Tile::Digit(Digit::new(5)),
Tile::Equals,
Tile::Digit(Digit::new(3)),
Tile::Operator(Operator::Multiply),
Tile::Digit(Digit::new(3)),
]),
10
);
}
#[test]
fn diviser_add_to_original_sum() {
assert_eq!(
calc_score(&[
Tile::Digit(Digit::new(8)),
Tile::Operator(Operator::Divide),
Tile::Digit(Digit::new(4)),
Tile::Equals,
Tile::Digit(Digit::new(2)),
]),
13
);
}
}