You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
gammon/src/main.rs

119 lines
2.6 KiB

use std::default::Default;
use std::fmt;
use std::fmt::Display;
#[derive(Debug,Clone,Copy,Eq,PartialEq)]
pub enum Side {
Black = 0,
White = 1,
}
#[derive(Debug,Clone,Copy)]
pub enum Phase {
PickSides,
Turn(Side),
}
#[derive(Debug,Clone,Default)]
pub struct Player {
pub born_off: u32,
pub on_bar: u32,
}
#[derive(Debug,Clone,Copy)]
pub enum Bin {
Empty,
Black(u32),
White(u32),
}
#[derive(Debug)]
pub struct Game {
pub phase : Phase,
pub multiplier : u32,
pub roll : [u8; 2],
pub players : [Player; 2],
pub bins : [Bin; 24],
}
impl Default for Game {
fn default() -> Self {
Game {
phase: Phase::PickSides,
multiplier: 1,
roll: [0; 2],
players: [
Player::default(),
Player::default(),
],
bins: [Bin::Empty; 24],
}
}
}
impl Display for Game {
fn fmt(&self, f : &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, " ")?;
for n in (13..=24) { write!(f, " {:2}", n)?; }
write!(f, "\n╭")?;
for b in &self.bins[12..=23] {
match *b {
Bin::Empty => write!(f, " ┈┈")?,
Bin::Black(n) => write!(f, "{:2}#", n)?,
Bin::White(n) => write!(f, "{:2}:", n)?
}
}
write!(f, " > {}:\n╰", self.players[Side::Black as usize].born_off)?;
for b in (&self.bins[0..=11]).iter().rev() {
match *b {
Bin::Empty => write!(f, " ┈┈")?,
Bin::Black(n) => write!(f, "{:2}#", n)?, //█
Bin::White(n) => write!(f, "{:2}:", n)? //░
}
}
write!(f, " > {}#\n ", self.players[Side::Black as usize].born_off)?;
for n in (1..=12).rev() { write!(f, " {:2}", n)?; }
write!(f, "\n")?;
Ok(())
}
}
impl Game {
fn clear(&mut self) {
for i in 0..24 {
self.bins[i] = Bin::Empty;
}
}
fn set(&mut self, n : u32, val : Bin) {
assert!(n > 0 && n <= 24);
let i = n - 1;
self.bins[i as usize] = val;
}
fn starting_position(&mut self) {
self.clear();
self.set(1, Bin::White(2));
self.set(6, Bin::Black(5));
self.set(8, Bin::Black(3));
self.set(12, Bin::White(5));
self.set(13, Bin::Black(5));
self.set(17, Bin::White(3));
self.set(19, Bin::White(5));
self.set(24, Bin::Black(2));
}
}
fn main() {
let mut board = Game::default();
board.starting_position();
println!("{}", board);
}