diff --git a/kifu/kifu-core/src/types.rs b/kifu/kifu-core/src/types.rs index e9c9f32..a6f5b3c 100644 --- a/kifu/kifu-core/src/types.rs +++ b/kifu/kifu-core/src/types.rs @@ -112,11 +112,28 @@ impl GameState { } } +#[derive(Clone, Debug)] pub struct Board { pub size: Size, pub spaces: Vec>, } +impl std::fmt::Display for Board { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> { + for row in 0..self.size.height { + for column in 0..self.size.width { + match self.stone(column, row) { + None => write!(f, " . ")?, + Some(Color::Black) => write!(f, " X ")?, + Some(Color::White) => write!(f, " O ")?, + } + } + writeln!(f, "")?; + } + Ok(()) + } +} + impl Board { fn new() -> Self { let mut spaces = Vec::new(); @@ -146,3 +163,79 @@ impl Board { ((row as usize) * (self.size.width as usize) + (column as usize)) as usize } } + +#[cfg(test)] +mod test { + use super::*; + + /* Two players (Black and White) take turns and Black plays first + * Stones are placed on the line intersections and not moved. + * A stone with no liberties is removed from the board. + * A group of stones of the same color share liberties. + * A stone at the edge of the board has only three liberties. + * A stone at the corner of the board has only two liberties. + * A stone may not be placed in a suicidal position. + * A stone placed in a suicidal position is legal if it captures other stones first. + */ + + #[test] + fn it_shows_stones() { + let mut board = Board::new(); + board.place_stone(3, 2, Color::White); + board.place_stone(2, 3, Color::White); + board.place_stone(4, 3, Color::White); + board.place_stone(3, 3, Color::Black); + println!("{}", board); + assert!(false); + } + + #[test] + fn it_counts_individual_liberties() { + let mut board = Board::new(); + board.place_stone(3, 3, Color::White); + board.place_stone(0, 3, Color::White); + board.place_stone(0, 0, Color::White); + println!("{}", board); + assert!(false); + } + + #[test] + fn stones_share_liberties() { + let mut board = Board::new(); + board.place_stone(3, 3, Color::White); + board.place_stone(3, 4, Color::White); + board.place_stone(3, 5, Color::White); + board.place_stone(4, 4, Color::White); + println!("{}", board); + assert!(false); + } + + #[test] + fn opposing_stones_reduce_liberties() { + let mut board = Board::new(); + board.place_stone(3, 3, Color::White); + board.place_stone(3, 4, Color::Black); + println!("{}", board); + assert!(false); + } + + #[test] + fn surrounding_a_stone_remove_it() { + assert!(false); + } + + #[test] + fn sorrounding_a_group_removes_it() { + assert!(false); + } + + #[test] + fn suicide_is_forbidden() { + assert!(false); + } + + #[test] + fn captures_preceed_self_capture() { + assert!(false); + } +}