diff --git a/src/agent.rs b/src/agent.rs index f6878b1..a92ec72 100644 --- a/src/agent.rs +++ b/src/agent.rs @@ -1,7 +1,4 @@ -use crate::{ - board::Board, - piece::Piece, -}; +use crate::{board::Board, piece::Piece}; use rand::prelude::*; use std::io; use std::io::prelude::*; diff --git a/src/board.rs b/src/board.rs index 67b76a7..6cae402 100644 --- a/src/board.rs +++ b/src/board.rs @@ -112,7 +112,7 @@ impl Board { } pub fn would_prop(&self, i: usize, j: usize, piece: Piece) -> bool { - !self.propegate_from_dry(i, j, piece).is_empty() + self.get(i, j).is_none() && !self.propegate_from_dry(i, j, piece).is_empty() } pub fn place(&mut self, i: usize, j: usize, piece: Piece) -> Result<(), String> { diff --git a/src/complexagent.rs b/src/complexagent.rs index deaef5a..74086df 100644 --- a/src/complexagent.rs +++ b/src/complexagent.rs @@ -50,6 +50,26 @@ impl Move { pub const fn coords(&self) -> (usize, usize) { (self.i, self.j) } + + /// Cursed function to create a dummy move type from a color and board + /// Used to bootstrap [`ComplexAgent`] + pub fn from_board_color(color: Piece, board: &Board) -> Self { + Move { + i: 0, + j: 0, + captured: 0, + color, + board: *board, + next_move: vec![Move { + i: 0, + j: 0, + captured: 0, + color: !color, + board: *board, + next_move: problem_space(board, color).collect(), + }], + } + } } fn problem_space(board: &Board, color: Piece) -> Box + '_> { @@ -72,28 +92,17 @@ impl Agent for ComplexAgent { fn next_move(&mut self, board: &Board) -> Option<(usize, usize)> { const LOOPS: usize = 5; - let curr_move: Move = self.curr_move.take().unwrap_or_else(|| Move { - i: 0, - j: 0, - captured: 0, - color: self.color, - board: *board, - next_move: vec![Move { - i: 0, - j: 0, - captured: 0, - color: !self.color, - board: *board, - next_move: problem_space(board, self.color).collect(), - }], - }); + let curr_move: Move = self + .curr_move + .take() + .unwrap_or_else(|| Move::from_board_color(self.color, board)); let mut other_player_move = curr_move .next_move .into_iter() .filter(|x| &x.board == board) .last() - .unwrap(); + .expect("other player made an invalid move?"); other_player_move.populate_next_moves(LOOPS); diff --git a/src/main.rs b/src/main.rs index 5c9bb14..6506e54 100644 --- a/src/main.rs +++ b/src/main.rs @@ -11,8 +11,8 @@ mod piece; fn main() { let player1 = complexagent::ComplexAgent::new(Piece::Black); // let player2 = complexagent::ComplexAgent::new(Piece::White); - let player2 = agent::ManualAgent::new(Piece::White); - // let player2 = agent::RandomAgent::new(Piece::White); + // let player2 = agent::ManualAgent::new(Piece::White); + let player2 = agent::RandomAgent::new(Piece::White); let mut game = Game::new(Box::new(player1), Box::new(player2)); game.game_loop(); }