diff --git a/src/agent.rs b/src/agent.rs index 50c3ab9..c9c7ba4 100644 --- a/src/agent.rs +++ b/src/agent.rs @@ -4,24 +4,45 @@ use crate::repr::{Board, Piece}; pub trait Agent { fn next_move(&mut self, board: &Board) -> Option<(usize, usize)>; + fn name(&self) -> &'static str; + fn color(&self) -> Piece; } -pub struct ManualAgent {} +pub struct ManualAgent { + color: Piece, +} impl Agent for ManualAgent { fn next_move(&mut self, board: &Board) -> Option<(usize, usize)> { todo!("user input not implemented") } + + fn name(&self) -> &'static str { + "Manual Agent" + } + + fn color(&self) -> Piece { + self.color + } } pub struct QueueAgent { moves: VecDeque<(usize, usize)>, + color: Piece, } impl Agent for QueueAgent { fn next_move(&mut self, board: &Board) -> Option<(usize, usize)> { self.moves.pop_front() } + + fn name(&self) -> &'static str { + "Queue Agent" + } + + fn color(&self) -> Piece { + self.color + } } pub struct AutoAgent { @@ -32,6 +53,14 @@ impl Agent for AutoAgent { fn next_move(&mut self, board: &Board) -> Option<(usize, usize)> { todo!("next_move not implemented") } + + fn name(&self) -> &'static str { + "Auto Agent" + } + + fn color(&self) -> Piece { + self.color + } } impl AutoAgent { diff --git a/src/game.rs b/src/game.rs index 3adb2d3..f4c1ea4 100644 --- a/src/game.rs +++ b/src/game.rs @@ -4,3 +4,18 @@ pub struct Game { players: [Box; 2], board: Board, } + +impl std::fmt::Display for Game { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + writeln!( + f, + "Players: {} ({}) and {} ({})", + self.players[0].name(), + self.players[0].color().text(), + self.players[1].name(), + self.players[1].color().text() + )?; + write!(f, "{}", self.board)?; + Ok(()) + } +} diff --git a/src/repr.rs b/src/repr.rs index 476290e..efe90cd 100644 --- a/src/repr.rs +++ b/src/repr.rs @@ -192,7 +192,7 @@ mod test { } #[test] - fn long_capture() { + fn long_capture_horiz() { let mut board = Board::new(); assert_eq!(board.place(0, 0, Piece::Black), Ok(()));