use crate::{ agent::Agent, board::{Board, BOARD_SIZE}, piece::Piece, }; pub struct ComplexAgent { color: Piece, } impl Agent for ComplexAgent { fn next_move(&mut self, board: &Board) -> Option<(usize, usize)> { (0..BOARD_SIZE) .flat_map(|i| { (0..BOARD_SIZE) .map(|j| (i, j)) .collect::>() }) .map(|(i, j)| (i, j, board.move_would_propegate(i, j, self.color))) .filter(|&(_, _, c)| c >= 0) // a `c` value of less than 0 implies the move is invalid: TODO! make this an enum or smth .max_by_key(|&(_, _, c)| c) .map(|(i, j, _)| (i, j)) // remove `c` and return the best move } fn name(&self) -> &'static str { "Complex Agent" } fn color(&self) -> Piece { self.color } } impl ComplexAgent { pub fn new(color: Piece) -> Self { Self { color } } }