From 17ed84512581ea8cfc0a4b9994af36d4acf9e89e Mon Sep 17 00:00:00 2001 From: andy Date: Tue, 29 Jun 2021 15:37:52 +0100 Subject: [PATCH] moved tests to file, working on can move --- indices | Bin 11895 -> 13608 bytes src/board/enums.rs | 11 ++ src/board/mod.rs | 376 +++++++++++++++++---------------------------- src/board/tests.rs | 210 +++++++++++++++++++++++++ 4 files changed, 358 insertions(+), 239 deletions(-) create mode 100644 src/board/tests.rs diff --git a/indices b/indices index 514798a06c76367639f3f430270b7af559240a06..7d86299fd8081f3d83590812b9c6ba9f3ec6e9cb 100644 GIT binary patch delta 11672 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 mMi3DHoTnN*kRbsfXp$58uQ>p75 Team{ + match self { + Team::White => Team::Black, + Team::Black => Team::White, + } + } +} + impl Display for Team { fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { match self { @@ -58,4 +67,6 @@ pub enum Moveable { Unplayable = 4, WrongTeamSrc = 5, IllegalTrajectory = 6, + NoJumpablePiece = 7, + JumpingSameTeam = 8, } \ No newline at end of file diff --git a/src/board/mod.rs b/src/board/mod.rs index 885b05d..4889ded 100644 --- a/src/board/mod.rs +++ b/src/board/mod.rs @@ -1,5 +1,7 @@ //! Board module for components related to the checkers board and game structure +#[cfg(test)] pub mod tests; + pub mod enums; use enums::*; @@ -366,64 +368,163 @@ impl Board { return Moveable::OutOfBounds; } + if to.row > self.height - 1 || to.col > self.width - 1 { + return Moveable::OutOfBounds; + } + let from_square = self.cell(self.cell_idx(from)); + // check source square is occupied match from_square.state { - Empty => return Moveable::UnoccupiedSrc, - Unplayable => return Moveable::Unplayable, - Occupied => { + SquareState::Empty => return Moveable::UnoccupiedSrc, + SquareState::Unplayable => return Moveable::Unplayable, + SquareState::Occupied => { // if its not the current teams piece then error match from_square.occupant { + // weird error, shouldn't happen None => panic!("Square is apparently occupied, but no occupant was found from: {}, to: {}, square: {:?}", from, to, from_square), - Some(x) => { + Some(from_square_occupant) => { // piece in the source square is not for the current turn's player - if x.team != self.current_turn { + if from_square_occupant.team != self.current_turn { return Moveable::WrongTeamSrc; } + // cast to signed ints so that -1 will work for black moves + let row_diff: i32 = to.row as i32 - from.row as i32; + let col_diff: i32 = to.col as i32 - from.col as i32; + + // depending on whether the piece is a king or not, the piece can make different moves // TODO: refactor to a IsMove()/IsJump() to check whether the move has a legal trajectory - match x.strength { - Man => { - match self.current_turn { - Black => { - - }, - White => { - - }, - }; - }, - King => { - match self.current_turn { - Black => { - - }, - White => { - - }, - }; - }, + match from_square_occupant.strength { + Strength::Man => self.validate_man_move(from, to, row_diff, col_diff, from_square_occupant), + Strength::King => self.validate_king_move(from, to, row_diff, col_diff, from_square_occupant), }; - - // let diagonal = self.adjacent_dir(from); - // let allowable_squares = Vec::with_capacity(4); - - let jumpable = self.jumpable_dir(from); } } }, } - // let is_adjacent = match self.current_turn { - // Team::Black => diagonal.nw, - // Team::White => {}, - // } - Moveable::Allowed } + pub fn validate_man_move(&self, from: BrdIdx, to: BrdIdx, row_diff: i32, col_diff: i32, from_square_occupant: Piece) -> Moveable { + // men can only move forwards, below is row difference for each team + let idx_scale: i32 = match self.current_turn { + Team::Black => -1, + Team::White => 1, + }; + + // legal standard move + if row_diff == idx_scale { + // destination is directly to the left or right + if col_diff.abs() == 1 { + return Moveable::Allowed; + } + // illegal, not adjacently diagional + else { + return Moveable::IllegalTrajectory; + } + } + // legal jump move trajectory + else if row_diff == 2 * idx_scale { + // destination is directly to the left or right + if col_diff.abs() == 2 { + + // piece to be jumped over + let jumpee = self.get_jumpee(from, row_diff, col_diff); + match jumpee.state { + SquareState::Empty => Moveable::NoJumpablePiece, + SquareState::Unplayable => panic!("Found an unplayable piece to try to jump over, from: {}, to: {}, jumpee: {:?}", from, to, jumpee), + SquareState::Occupied => { + + // check whether jumpee is an opponent's piece + return Board::validate_jumpee(jumpee, from, to, from_square_occupant); + }, + } + } + // illegal, not adjacently diagional + else { + return Moveable::IllegalTrajectory; + } + } + // illegal, not adjacently diagonal + else { + return Moveable::IllegalTrajectory; + } + } + + pub fn validate_king_move(&self, from: BrdIdx, to: BrdIdx, row_diff: i32, col_diff: i32, from_square_occupant: Piece) -> Moveable { + // legal standard move + if row_diff.abs() == 1 { + // destination is directly to the left or right + if col_diff.abs() == 1 { + return Moveable::Allowed; + } + // illegal, not adjacently diagional + else { + return Moveable::IllegalTrajectory; + } + } + // legal jump move trajectory + else if row_diff.abs() == 2 { + // destination is directly to the left or right + if col_diff.abs() == 2 { + + // piece to be jumped over + let jumpee = self.get_jumpee(from, row_diff, col_diff); + match jumpee.state { + SquareState::Empty => Moveable::NoJumpablePiece, + SquareState::Unplayable => panic!("Found an unplayable piece to try to jump over, from: {}, to: {}, jumpee: {:?}", from, to, jumpee), + SquareState::Occupied => { + + // check whether jumpee is an opponent's piece + return Board::validate_jumpee(jumpee, from, to, from_square_occupant); + }, + } + } + // illegal, not adjacently diagional + else { + return Moveable::IllegalTrajectory; + } + } + // illegal, not adjacently diagonal + else { + return Moveable::IllegalTrajectory; + } + } + + pub fn get_jumpee(&self, from: BrdIdx, row_diff: i32, col_diff: i32) -> Square { + self.cell( + self.cell_idx( + BrdIdx::from( + ((from.row as i32) + row_diff / 2) as usize, + ((from.col as i32) + col_diff / 2) as usize) + ) + ) + } + + pub fn validate_jumpee(jumpee: Square, from: BrdIdx, to: BrdIdx, from_occ: Piece) -> Moveable { + // check whether jumpee is an opponent's piece + match jumpee.occupant { + None => panic!("No occupant found when checking the jumpee, from: {}, to: {}, jumpee: {:?}", from, to, jumpee), + Some(jumpee_occupant_uw) => { + if Board::check_jumpee_team(from_occ, jumpee_occupant_uw) { + return Moveable::Allowed; + } + else { + return Moveable::JumpingSameTeam; + } + }, + } + } + + + pub fn check_jumpee_team(from: Piece, jumpee: Piece) -> bool { + return from.team.opponent() == jumpee.team + } + /// Iniitalise a game board without game pieces pub fn new(width: usize, height: usize) -> Board { let total_cells = width * height; @@ -526,207 +627,4 @@ impl Display for Board { write!(f, "{}", string) } -} - -#[cfg(test)] -mod tests { - use super::*; - use wasm_bindgen_test::*; - use crate::log; - - wasm_bindgen_test_configure!(run_in_browser); - - #[wasm_bindgen_test] - fn create() { - let board = Board::new(STD_WIDTH, STD_HEIGHT); - assert!(true); - } - - #[wasm_bindgen_test] - fn std_num_cells() { - let board = Board::new(8, 8); - assert_eq!(64, board.num_cells()); - } - - ////////////// - // INDEXING - ////////////// - - #[wasm_bindgen_test] - fn cell_index_top_left() { - let board = Board::new(8, 8); - assert_eq!(0, board.cell_index(0, 0)); - } - - #[wasm_bindgen_test] - fn cell_index_central() { - let board = Board::new(8, 8); - assert_eq!(9, board.cell_index(1, 1)); - } - - #[wasm_bindgen_test] - fn cell_index_central_2() { - let board = Board::new(8, 8); - assert_eq!(17, board.cell_index(2, 1)); - } - - #[wasm_bindgen_test] - fn board_index() { - let board = Board::new(8, 8); - - // first row - assert_eq!(BrdIdx::from(0, 5), board.board_index(5)); - // second row - assert_eq!(BrdIdx::from(1, 6), board.board_index(14)); - // third row - assert_eq!(BrdIdx::from(2, 4), board.board_index(20)); - } - - /////////////////// - // SQUARE STATE - /////////////////// - - #[wasm_bindgen_test] - fn first_square_unplayable() { - let board = Board::new(8, 8); - assert_eq!(SquareState::Unplayable, board.cell_state(board.cell_index(0, 0))); - } - - #[wasm_bindgen_test] - fn first_square_row_5_unplayable() { - let board = Board::new(8, 8); - assert_eq!(SquareState::Empty, board.cell_state(board.cell_index(5, 0))); - } - - ////////////////////// - // DIAGNOAL INDICES - ////////////////////// - - #[wasm_bindgen_test] - fn moveable_indices_unplayable() { - let board = Board::new(8, 8); - assert_eq!(None, board.diagonal_indices(BrdIdx::from(7, 7))); - assert_eq!(None, board.diagonal_indices(BrdIdx::from(0, 0))); - assert_eq!(None, board.diagonal_indices(BrdIdx::from(1, 1))); - } - - #[wasm_bindgen_test] - fn moveable_indices_central() { - let board = Board::new(8, 8); - assert_eq!(Some(vec![1, 3, 17, 19]), board.diagonal_indices(BrdIdx::from(1, 2))); - } - - #[wasm_bindgen_test] - fn moveable_indices_top_row() { - let board = Board::new(8, 8); - assert_eq!(Some(vec![8, 10]), board.diagonal_indices(BrdIdx::from(0, 1))); - } - - #[wasm_bindgen_test] - fn moveable_indices_left_column() { - let board = Board::new(8, 8); - assert_eq!(Some(vec![1, 17]), board.diagonal_indices(BrdIdx::from(1, 0))); - } - - #[wasm_bindgen_test] - fn moveable_indices_bottom_row() { - let board = Board::new(8, 8); - assert_eq!(Some(vec![49, 51]), board.diagonal_indices(BrdIdx::from(7, 2))); - } - - #[wasm_bindgen_test] - fn moveable_indices_right_column() { - let board = Board::new(8, 8); - assert_eq!(Some(vec![14, 30]), board.diagonal_indices(BrdIdx::from(2, 7))); - } - - #[wasm_bindgen_test] - fn moveable_indices_top_right() { - let board = Board::new(8, 8); - assert_eq!(Some(vec![14]), board.diagonal_indices(BrdIdx::from(0, 7))); - } - - #[wasm_bindgen_test] - fn moveable_indices_bottom_left() { - let board = Board::new(8, 8); - assert_eq!(Some(vec![49]), board.diagonal_indices(BrdIdx::from(7, 0))); - } - - ////////////////////// - // JUMPABLE INDICES - ////////////////////// - - #[wasm_bindgen_test] - fn jumpable_indices_unplayable() { - let board = Board::new(8, 8); - assert_eq!(None, board.jumpable_indices(BrdIdx::from(7, 7))); - assert_eq!(None, board.jumpable_indices(BrdIdx::from(0, 0))); - assert_eq!(None, board.jumpable_indices(BrdIdx::from(1, 1))); - } - - #[wasm_bindgen_test] - fn jumpable_indices() { - let board = Board::new(8, 8); - assert_eq!(Some(vec![24, 28]), board.jumpable_indices(BrdIdx::from(1, 2))); - } - - #[wasm_bindgen_test] - fn jumpable_indices_central() { - let board = Board::new(8, 8); - assert_eq!(Some(vec![10, 14, 42, 46]), board.jumpable_indices(BrdIdx::from(3, 4))); - } - - #[wasm_bindgen_test] - fn jumpable_indices_top_row() { - let board = Board::new(8, 8); - assert_eq!(Some(vec![19]), board.jumpable_indices(BrdIdx::from(0, 1))); - } - - #[wasm_bindgen_test] - fn jumpable_indices_left_column() { - let board = Board::new(8, 8); - assert_eq!(Some(vec![26]), board.jumpable_indices(BrdIdx::from(1, 0))); - } - - #[wasm_bindgen_test] - fn jumpable_indices_bottom_row() { - let board = Board::new(8, 8); - assert_eq!(Some(vec![40, 44]), board.jumpable_indices(BrdIdx::from(7, 2))); - } - - #[wasm_bindgen_test] - fn jumpable_indices_right_column() { - let board = Board::new(8, 8); - assert_eq!(Some(vec![5, 37]), board.jumpable_indices(BrdIdx::from(2, 7))); - } - - #[wasm_bindgen_test] - fn jumpable_indices_top_right() { - let board = Board::new(8, 8); - assert_eq!(Some(vec![21]), board.jumpable_indices(BrdIdx::from(0, 7))); - } - - #[wasm_bindgen_test] - fn jumpable_indices_bottom_left() { - let board = Board::new(8, 8); - assert_eq!(Some(vec![42]), board.jumpable_indices(BrdIdx::from(7, 0))); - } - - // #[wasm_bindgen_test] - // fn init_game() { - // let board = Board::init_game(Board::new(8, 8)); - // log!("{}", board); - // } - - #[wasm_bindgen_test] - fn black_diagonal_indices() { - let board = Board::new(8, 8); - assert_eq!(Some(vec![1, 3]), board.player_diagonal_indices(BrdIdx::from(1, 2), Team::Black)); - } - - #[wasm_bindgen_test] - fn white_diagonal_indices() { - let board = Board::new(8, 8); - assert_eq!(Some(vec![17, 19]), board.player_diagonal_indices(BrdIdx::from(1, 2), Team::White)); - } } \ No newline at end of file diff --git a/src/board/tests.rs b/src/board/tests.rs new file mode 100644 index 0000000..98a30c0 --- /dev/null +++ b/src/board/tests.rs @@ -0,0 +1,210 @@ +use super::*; +use wasm_bindgen_test::*; +use crate::log; + +wasm_bindgen_test_configure!(run_in_browser); + + +// #[wasm_bindgen_test] +// fn init_game() { +// let board = Board::init_game(Board::new(8, 8)); +// log!("{}", board); +// } + +#[wasm_bindgen_test] +fn create() { + let board = Board::new(STD_WIDTH, STD_HEIGHT); + assert!(true); +} + +#[wasm_bindgen_test] +fn std_num_cells() { + let board = Board::new(8, 8); + assert_eq!(64, board.num_cells()); +} + +////////////// +// INDEXING +////////////// + +#[wasm_bindgen_test] +fn cell_index_top_left() { + let board = Board::new(8, 8); + assert_eq!(0, board.cell_index(0, 0)); +} + +#[wasm_bindgen_test] +fn cell_index_central() { + let board = Board::new(8, 8); + assert_eq!(9, board.cell_index(1, 1)); +} + +#[wasm_bindgen_test] +fn cell_index_central_2() { + let board = Board::new(8, 8); + assert_eq!(17, board.cell_index(2, 1)); +} + +#[wasm_bindgen_test] +fn board_index() { + let board = Board::new(8, 8); + + // first row + assert_eq!(BrdIdx::from(0, 5), board.board_index(5)); + // second row + assert_eq!(BrdIdx::from(1, 6), board.board_index(14)); + // third row + assert_eq!(BrdIdx::from(2, 4), board.board_index(20)); +} + +/////////////////// +// SQUARE STATE +/////////////////// + +#[wasm_bindgen_test] +fn first_square_unplayable() { + let board = Board::new(8, 8); + assert_eq!(SquareState::Unplayable, board.cell_state(board.cell_index(0, 0))); +} + +#[wasm_bindgen_test] +fn first_square_row_5_unplayable() { + let board = Board::new(8, 8); + assert_eq!(SquareState::Empty, board.cell_state(board.cell_index(5, 0))); +} + +////////////////////// +// DIAGNOAL INDICES +////////////////////// + +#[wasm_bindgen_test] +fn moveable_indices_unplayable() { + let board = Board::new(8, 8); + assert_eq!(None, board.diagonal_indices(BrdIdx::from(7, 7))); + assert_eq!(None, board.diagonal_indices(BrdIdx::from(0, 0))); + assert_eq!(None, board.diagonal_indices(BrdIdx::from(1, 1))); +} + +#[wasm_bindgen_test] +fn moveable_indices_central() { + let board = Board::new(8, 8); + assert_eq!(Some(vec![1, 3, 17, 19]), board.diagonal_indices(BrdIdx::from(1, 2))); +} + +#[wasm_bindgen_test] +fn moveable_indices_top_row() { + let board = Board::new(8, 8); + assert_eq!(Some(vec![8, 10]), board.diagonal_indices(BrdIdx::from(0, 1))); +} + +#[wasm_bindgen_test] +fn moveable_indices_left_column() { + let board = Board::new(8, 8); + assert_eq!(Some(vec![1, 17]), board.diagonal_indices(BrdIdx::from(1, 0))); +} + +#[wasm_bindgen_test] +fn moveable_indices_bottom_row() { + let board = Board::new(8, 8); + assert_eq!(Some(vec![49, 51]), board.diagonal_indices(BrdIdx::from(7, 2))); +} + +#[wasm_bindgen_test] +fn moveable_indices_right_column() { + let board = Board::new(8, 8); + assert_eq!(Some(vec![14, 30]), board.diagonal_indices(BrdIdx::from(2, 7))); +} + +#[wasm_bindgen_test] +fn moveable_indices_top_right() { + let board = Board::new(8, 8); + assert_eq!(Some(vec![14]), board.diagonal_indices(BrdIdx::from(0, 7))); +} + +#[wasm_bindgen_test] +fn moveable_indices_bottom_left() { + let board = Board::new(8, 8); + assert_eq!(Some(vec![49]), board.diagonal_indices(BrdIdx::from(7, 0))); +} + +////////////////////// +// JUMPABLE INDICES +////////////////////// + +#[wasm_bindgen_test] +fn jumpable_indices_unplayable() { + let board = Board::new(8, 8); + assert_eq!(None, board.jumpable_indices(BrdIdx::from(7, 7))); + assert_eq!(None, board.jumpable_indices(BrdIdx::from(0, 0))); + assert_eq!(None, board.jumpable_indices(BrdIdx::from(1, 1))); +} + +#[wasm_bindgen_test] +fn jumpable_indices() { + let board = Board::new(8, 8); + assert_eq!(Some(vec![24, 28]), board.jumpable_indices(BrdIdx::from(1, 2))); +} + +#[wasm_bindgen_test] +fn jumpable_indices_central() { + let board = Board::new(8, 8); + assert_eq!(Some(vec![10, 14, 42, 46]), board.jumpable_indices(BrdIdx::from(3, 4))); +} + +#[wasm_bindgen_test] +fn jumpable_indices_top_row() { + let board = Board::new(8, 8); + assert_eq!(Some(vec![19]), board.jumpable_indices(BrdIdx::from(0, 1))); +} + +#[wasm_bindgen_test] +fn jumpable_indices_left_column() { + let board = Board::new(8, 8); + assert_eq!(Some(vec![26]), board.jumpable_indices(BrdIdx::from(1, 0))); +} + +#[wasm_bindgen_test] +fn jumpable_indices_bottom_row() { + let board = Board::new(8, 8); + assert_eq!(Some(vec![40, 44]), board.jumpable_indices(BrdIdx::from(7, 2))); +} + +#[wasm_bindgen_test] +fn jumpable_indices_right_column() { + let board = Board::new(8, 8); + assert_eq!(Some(vec![5, 37]), board.jumpable_indices(BrdIdx::from(2, 7))); +} + +#[wasm_bindgen_test] +fn jumpable_indices_top_right() { + let board = Board::new(8, 8); + assert_eq!(Some(vec![21]), board.jumpable_indices(BrdIdx::from(0, 7))); +} + +#[wasm_bindgen_test] +fn jumpable_indices_bottom_left() { + let board = Board::new(8, 8); + assert_eq!(Some(vec![42]), board.jumpable_indices(BrdIdx::from(7, 0))); +} + +#[wasm_bindgen_test] +fn black_diagonal_indices() { + let board = Board::new(8, 8); + assert_eq!(Some(vec![1, 3]), board.player_diagonal_indices(BrdIdx::from(1, 2), Team::Black)); +} + +#[wasm_bindgen_test] +fn white_diagonal_indices() { + let board = Board::new(8, 8); + assert_eq!(Some(vec![17, 19]), board.player_diagonal_indices(BrdIdx::from(1, 2), Team::White)); +} + +//////////////// +// JUMPEE +//////////////// + +// #[wasm_bindgen_test] +// fn check_jumpee() { +// let from = +// assert_eq!(Board::check_jumpee_team(from: Piece, jumpee: Piece)); +// } \ No newline at end of file