fix diagonals and user input
This commit is contained in:
parent
db42964a47
commit
1fc731ac59
26
src/agent.rs
26
src/agent.rs
@ -1,4 +1,6 @@
|
|||||||
use crate::{board::Board, piece::Piece};
|
use crate::{board::Board, piece::Piece};
|
||||||
|
use std::io;
|
||||||
|
use std::io::prelude::*;
|
||||||
|
|
||||||
pub trait Agent {
|
pub trait Agent {
|
||||||
fn next_move(&mut self, board: &Board) -> Option<(usize, usize)>;
|
fn next_move(&mut self, board: &Board) -> Option<(usize, usize)>;
|
||||||
@ -12,7 +14,23 @@ pub struct ManualAgent {
|
|||||||
|
|
||||||
impl Agent for ManualAgent {
|
impl Agent for ManualAgent {
|
||||||
fn next_move(&mut self, _: &Board) -> Option<(usize, usize)> {
|
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 {
|
fn name(&self) -> &'static str {
|
||||||
@ -23,3 +41,9 @@ impl Agent for ManualAgent {
|
|||||||
self.color
|
self.color
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl ManualAgent {
|
||||||
|
pub const fn new(color: Piece) -> Self {
|
||||||
|
Self { color }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
24
src/board.rs
24
src/board.rs
@ -14,7 +14,7 @@ impl fmt::Display for Board {
|
|||||||
for i in 0..BOARD_SIZE {
|
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 {
|
for j in 0..BOARD_SIZE {
|
||||||
write!(
|
write!(
|
||||||
f,
|
f,
|
||||||
@ -117,7 +117,17 @@ impl Board {
|
|||||||
// handle diagonals
|
// handle diagonals
|
||||||
chains.extend(
|
chains.extend(
|
||||||
i_chain
|
i_chain
|
||||||
|
.clone()
|
||||||
.into_iter()
|
.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)
|
.zip(j_chain)
|
||||||
.map(|(i_vec, j_vec)| i_vec.into_iter().zip(j_vec).collect()),
|
.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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,3 +1,4 @@
|
|||||||
|
use agent::ManualAgent;
|
||||||
use complexagent::ComplexAgent;
|
use complexagent::ComplexAgent;
|
||||||
use game::Game;
|
use game::Game;
|
||||||
use piece::Piece;
|
use piece::Piece;
|
||||||
@ -11,7 +12,8 @@ mod piece;
|
|||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let player1 = ComplexAgent::new(Piece::Black);
|
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));
|
let mut game = Game::new(Box::new(player1), Box::new(player2));
|
||||||
game.game_loop();
|
game.game_loop();
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user