fix diagonals and user input

This commit is contained in:
Simon Gardling 2025-01-30 15:53:02 -05:00
parent db42964a47
commit 1fc731ac59
Signed by: titaniumtown
GPG Key ID: 9AB28AC10ECE533D
3 changed files with 52 additions and 4 deletions

View File

@ -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::<Option<Vec<usize>>>();
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 }
}
}

View File

@ -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);
}
}

View File

@ -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();
}