use t4t::*;
#[allow(missing_docs)]
#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash)]
pub enum Move {
Rock,
Paper,
Scissors,
Fire,
Water,
}
#[rustfmt::skip]
pub fn rock_paper_scissors() -> Normal<Move, i64, 2> {
Normal::symmetric(
vec![Move::Rock, Move::Paper, Move::Scissors],
vec![ 0, -1, 1,
1, 0, -1,
-1, 1, 0,
],
).unwrap()
}
#[rustfmt::skip]
pub fn fire_water() -> Normal<Move, i64, 2> {
Normal::symmetric(
vec![Move::Rock, Move::Paper, Move::Scissors, Move::Fire, Move::Water],
vec![ 0, -1, 1, -1, 1,
1, 0, -1, -1, 1,
-1, 1, 0, -1, 1,
1, 1, 1, 0, -1,
-1, -1, -1, 1, 0,
],
).unwrap()
}
#[rustfmt::skip]
pub fn big_rock_paper_scissors<const N: usize>() -> Normal<Move, i64, N> {
let moves = PerPlayer::init_with(vec![Move::Rock, Move::Paper, Move::Scissors]);
let payoff_fn = |profile: Profile<Move, N>| {
let mut rocks = 0;
let mut papers = 0;
let mut scissors = 0;
for m in profile.per_player() {
match m {
Move::Rock => rocks += 1,
Move::Paper => papers += 1,
Move::Scissors => scissors += 1,
_ => log::warn!("Unexpected move: {:?}", m),
}
}
let rock_util = scissors - papers;
let paper_util = rocks - scissors;
let scissors_util = papers - rocks;
Payoff::new(profile.per_player().map(|m|
match m {
Move::Rock => rock_util,
Move::Paper => paper_util,
Move::Scissors => scissors_util,
_ => 0,
}
))
};
Normal::from_payoff_fn(moves, payoff_fn)
}