From 1fc731ac59c1eb866ac0790473e92653dfa0d276 Mon Sep 17 00:00:00 2001 From: Simon Gardling Date: Thu, 30 Jan 2025 15:53:02 -0500 Subject: [PATCH] fix diagonals and user input --- src/agent.rs | 26 +++++++++++++++++++++++++- src/board.rs | 26 ++++++++++++++++++++++++-- src/main.rs | 4 +++- 3 files changed, 52 insertions(+), 4 deletions(-) diff --git a/src/agent.rs b/src/agent.rs index 44155cf..f6c404f 100644 --- a/src/agent.rs +++ b/src/agent.rs @@ -1,4 +1,6 @@ use crate::{board::Board, piece::Piece}; +use std::io; +use std::io::prelude::*; pub trait Agent { fn next_move(&mut self, board: &Board) -> Option<(usize, usize)>; @@ -12,7 +14,23 @@ pub struct ManualAgent { impl Agent for ManualAgent { fn next_move(&mut self, _: &Board) -> Option<(usize, usize)> { - todo!("user input not implemented") + let stdin = io::stdin(); + let mut input = String::new(); + let mut got: Option<(usize, usize)> = None; + while got.is_none() { + input.clear(); + stdin.lock().read_line(&mut input).ok()?; + let numbers = input + .split_whitespace() + .map(|i| usize::from_str_radix(i, 10).ok()) + .collect::>>(); + if let Some(numbers) = numbers { + if numbers.len() == 2 { + got = Some((numbers[0], numbers[1])); + } + } + } + got } fn name(&self) -> &'static str { @@ -23,3 +41,9 @@ impl Agent for ManualAgent { self.color } } + +impl ManualAgent { + pub const fn new(color: Piece) -> Self { + Self { color } + } +} diff --git a/src/board.rs b/src/board.rs index 8e468ad..ceaa702 100644 --- a/src/board.rs +++ b/src/board.rs @@ -12,9 +12,9 @@ impl fmt::Display for Board { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { let horiz_sep_line = "-".repeat(BOARD_SIZE * 2 + 1); for i in 0..BOARD_SIZE { - writeln!(f, "{}", horiz_sep_line)?; + writeln!(f, " {}", horiz_sep_line)?; - write!(f, "|")?; + write!(f, "{}|", i)?; for j in 0..BOARD_SIZE { write!( f, @@ -117,7 +117,17 @@ impl Board { // handle diagonals chains.extend( i_chain + .clone() .into_iter() + .zip(j_chain.clone()) + .map(|(i_vec, j_vec)| i_vec.into_iter().zip(j_vec).collect()), + ); + + // handle top right diagonals too + chains.extend( + i_chain + .into_iter() + .rev() .zip(j_chain) .map(|(i_vec, j_vec)| i_vec.into_iter().zip(j_vec).collect()), ); @@ -240,4 +250,16 @@ mod test { ); } } + + #[test] + fn diag_capture() { + let mut board = Board::new().starting_pos(); + + assert_eq!(board.place(2, 4, Piece::White), Ok(()), "{}", board); + assert_eq!(board.place(2, 3, Piece::Black), Ok(()), "{}", board); + + assert_eq!(board.place(2, 2, Piece::White), Ok(()), "{}", board); + + assert_eq!(board.place(2, 5, Piece::Black), Ok(()), "{}", board); + } } diff --git a/src/main.rs b/src/main.rs index 74679f8..86206a9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,4 @@ +use agent::ManualAgent; use complexagent::ComplexAgent; use game::Game; use piece::Piece; @@ -11,7 +12,8 @@ mod piece; fn main() { let player1 = ComplexAgent::new(Piece::Black); - let player2 = ComplexAgent::new(Piece::White); + // let player2 = ComplexAgent::new(Piece::White); + let player2 = ManualAgent::new(Piece::White); let mut game = Game::new(Box::new(player1), Box::new(player2)); game.game_loop(); }