mirror of
https://github.com/szymon-jozef/checkers.git
synced 2026-10-27 19:20:44 +01:00
chore: add get_player_pawns_positions
This commit is contained in:
@@ -76,6 +76,21 @@ impl Board {
|
||||
player.id == pawn.owner
|
||||
}
|
||||
|
||||
fn get_player_pawns_positions(&self, player: &Player) -> Vec<Position> {
|
||||
self.board
|
||||
.iter()
|
||||
.filter_map(|field| {
|
||||
if let Some(pawn) = &field.pawn
|
||||
&& pawn.owner == player.id
|
||||
{
|
||||
Some(field.position)
|
||||
} else {
|
||||
None
|
||||
}
|
||||
})
|
||||
.collect()
|
||||
}
|
||||
|
||||
/// Returns true if move was successful
|
||||
pub fn move_pawn(&mut self, player: &Player, from: Position, to: Position) -> bool {
|
||||
if !self.is_move_valid(&from, &to) {
|
||||
@@ -258,4 +273,35 @@ mod tests {
|
||||
assert_eq!(test_board[3][0].pawn.as_ref().unwrap().owner, player1.id);
|
||||
assert!(test_board[2][1].pawn.is_none());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_getting_player_pawns_positions() {
|
||||
init_logger();
|
||||
|
||||
let mut p1: Player = Player::new("Morbius".to_string());
|
||||
let mut p2: Player = Player::new("Milo".to_string());
|
||||
let test_board: Board = Board::new(&mut p1, &mut p2, None);
|
||||
|
||||
let expected_positions: Vec<Position> = (0..test_board.size)
|
||||
.into_iter()
|
||||
.flat_map(|row| {
|
||||
(0..test_board.size).filter_map(move |column| {
|
||||
let is_row_even: bool = row % 2 == 0;
|
||||
let is_column_even: bool = column % 2 == 0;
|
||||
let is_valid_place_for_a_pawn: bool = (is_row_even ^ is_column_even) && row < 3;
|
||||
|
||||
if is_valid_place_for_a_pawn {
|
||||
Some(Position { row, column })
|
||||
} else {
|
||||
None
|
||||
}
|
||||
})
|
||||
})
|
||||
.collect();
|
||||
|
||||
assert_eq!(
|
||||
expected_positions,
|
||||
test_board.get_player_pawns_positions(&p1)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
23
src/logic/field.rs
Normal file
23
src/logic/field.rs
Normal file
@@ -0,0 +1,23 @@
|
||||
use std::fmt;
|
||||
|
||||
use crate::logic::{pawn::Pawn, utils::Position};
|
||||
|
||||
#[derive(Debug, PartialEq, Eq)]
|
||||
pub struct Field {
|
||||
pub position: Position,
|
||||
pub pawn: Option<Pawn>,
|
||||
}
|
||||
|
||||
impl fmt::Display for Field {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
if let Some(pawn) = &self.pawn {
|
||||
write!(
|
||||
f,
|
||||
"Field at pos: {}. Pawn here owned by: {}",
|
||||
self.position, pawn.owner
|
||||
)
|
||||
} else {
|
||||
write!(f, "Field at pos: {}. No pawn here.", self.position)
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user