diff --git a/engine/engine.rs b/engine/engine.rs index f4c8c5d..110a19a 100644 --- a/engine/engine.rs +++ b/engine/engine.rs @@ -5,13 +5,14 @@ pub struct Engine { players: Vec>, turn: usize, board: Board, + x: usize, } 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 p1 = PlayerConsole::new("Gopher"); + let p2 = PlayerConsole::new("Rustacean"); let board = Board::new(); @@ -19,18 +20,25 @@ impl Engine { players: vec![Box::new(p1), Box::new(p2)], turn: 0, board: board, + x: 0, } } pub fn run(&mut self) -> Result<(), Box> { loop { - self.board.reset(); - match self.run_single_game() { - Ok(_) => {} - Err(e) => break Err(e), - } + // setup new game for players + self.players[self.x].start_new_game(Cell::CellX)?; + self.players[(self.x + 1) % 2].start_new_game(Cell::CellO)?; - // TODO: switch sides + // reset board + self.board.reset(); + self.turn = self.x; + + // run game + self.run_single_game()?; + + // switch sides + self.x = (self.x + 1) % 2 } } diff --git a/player/human.rs b/player/human.rs index e354a34..c498426 100644 --- a/player/human.rs +++ b/player/human.rs @@ -8,10 +8,10 @@ pub struct PlayerConsole { } impl PlayerConsole { - pub fn new(name: &str, p: Cell) -> impl Player { + pub fn new(name: &str) -> impl Player { PlayerConsole { name: name.to_owned(), - piece: p, + piece: Cell::CellEmpty, } } @@ -19,6 +19,13 @@ impl PlayerConsole { return self.name.as_str(); } + pub fn start_new_game(&mut self, p: Cell) -> Result<(), Box> { + self.piece = p; + println!("{}, you are now playing {}", self.name, p); + + Ok(()) + } + pub fn request_move(&self, _: &Board) -> Result> { let mut x: usize = 0; let mut y: usize = 0; @@ -65,6 +72,10 @@ impl PlayerConsole { } impl Player for PlayerConsole { + fn start_new_game(&mut self, p: Cell) -> Result<(), Box> { + return self.start_new_game(p); + } + fn request_move(&self, b: &Board) -> Result> { self.request_move(b) } diff --git a/player/mod.rs b/player/mod.rs index c5a3ac8..3d47eea 100644 --- a/player/mod.rs +++ b/player/mod.rs @@ -1,9 +1,10 @@ mod human; -use crate::game::{Board, Move}; +use crate::game::{Board, Cell, Move}; pub use human::PlayerConsole; pub trait Player { + fn start_new_game(&mut self, p: Cell) -> Result<(), Box>; fn request_move(&self, b: &Board) -> Result>; fn name(&self) -> &str; }