use crate::game::{Board, Cell}; use crate::player::{Player, PlayerConsole}; pub struct Engine { players: Vec>, turn: usize, board: Board, } impl Engine { pub fn new() -> Engine { // TODO: accept players as args let p1 = PlayerConsole::new("P1", Cell::CellX); let p2 = PlayerConsole::new("P2", Cell::CellO); let board = Board::new(); Engine { players: vec![Box::new(p1), Box::new(p2)], turn: 0, board: board, } } pub fn run(&mut self) -> Result<(), Box> { loop { self.board.reset(); match self.run_single_game() { Ok(_) => {} Err(e) => break Err(e), } // TODO: switch sides } } fn run_single_game(&mut self) -> Result<(), Box> { loop { println!("{}", self.board); let m = self.players[self.turn].request_move(&self.board)?; if !self.board.is_valid_move(&m) { println!("invalid move"); continue; } self.board.put(m)?; if let Some(_winner) = self.board.has_winner() { println!("{}", self.board); println!("The winner is: {}", self.players[self.turn].name()); break; } self.turn = (self.turn + 1) % 2 } Ok(()) } }