tout d'une

This commit is contained in:
Henri Bourcereau 2024-01-31 15:39:02 +01:00
parent 9a1ee299ca
commit 41647ebd1b
2 changed files with 69 additions and 29 deletions

View file

@ -23,7 +23,18 @@ impl CheckerMove {
if to < from && to != 0 { if to < from && to != 0 {
return Err(Error::MoveInvalid); return Err(Error::MoveInvalid);
} }
Ok(CheckerMove { from, to }) Ok(Self { from, to })
}
// Construct the move resulting of two successive moves
pub fn chain(self, cmove: Self) -> Result<Self, Error> {
if self.to != cmove.from {
return Err(Error::MoveInvalid);
}
Ok(Self {
from: self.from,
to: cmove.to,
})
} }
pub fn get_from(&self) -> Field { pub fn get_from(&self) -> Field {
@ -118,7 +129,7 @@ impl Board {
// the exit : no checker added to the board // the exit : no checker added to the board
if field == 0 { if field == 0 {
return Ok(()) return Ok(());
} }
if self.blocked(color, field)? { if self.blocked(color, field)? {
@ -155,7 +166,7 @@ impl Board {
// the exit is never 'blocked' // the exit is never 'blocked'
if field == 0 { if field == 0 {
return Ok(false) return Ok(false);
} }
// the square is blocked on the opponent rest corner or if there are opponent's men on the square // the square is blocked on the opponent rest corner or if there are opponent's men on the square
@ -198,10 +209,14 @@ impl Board {
// Get the corner field for the color // Get the corner field for the color
pub fn get_color_corner(&self, color: &Color) -> Field { pub fn get_color_corner(&self, color: &Color) -> Field {
if color == &Color::White { 12 } else { 13 } if color == &Color::White {
12
} else {
13
}
} }
pub fn move_possible(&self, color: &Color, cmove: CheckerMove) -> bool { pub fn move_possible(&self, color: &Color, cmove: &CheckerMove) -> bool {
let blocked = self.blocked(color, cmove.to).unwrap_or(true); let blocked = self.blocked(color, cmove.to).unwrap_or(true);
// Check if there is a player's checker on the 'from' square // Check if there is a player's checker on the 'from' square
let has_checker = self.get_checkers_color(cmove.from).unwrap_or(None) == Some(color); let has_checker = self.get_checkers_color(cmove.from).unwrap_or(None) == Some(color);
@ -279,38 +294,28 @@ mod tests {
Ok(()) Ok(())
} }
#[test] #[test]
fn set_field_blocked() { fn set_field_blocked() {
let mut board = Board::new(); let mut board = Board::new();
assert!( assert!(board.set(&Color::White, 24, 2).is_err());
board.set( &Color::White, 24, 2)
.is_err()
);
} }
#[test] #[test]
fn set_wrong_field1() { fn set_wrong_field1() {
let mut board = Board::new(); let mut board = Board::new();
assert!(board assert!(board.set(&Color::White, 50, 2).is_err());
.set( &Color::White, 50, 2)
.is_err());
} }
#[test] #[test]
fn set_wrong_amount0() { fn set_wrong_amount0() {
let mut board = Board::new(); let mut board = Board::new();
assert!(board assert!(board.set(&Color::White, 23, -3).is_err());
.set(&Color::White , 23, -3)
.is_err());
} }
#[test] #[test]
fn set_wrong_amount1() { fn set_wrong_amount1() {
let mut board = Board::new(); let mut board = Board::new();
let player = Player::new("".into(), Color::White); let player = Player::new("".into(), Color::White);
assert!(board assert!(board.set(&Color::White, 23, -3).is_err());
.set( &Color::White, 23, -3)
.is_err());
} }
} }

View file

@ -3,7 +3,7 @@ use crate::board::{Board, CheckerMove, Field, Move};
use crate::dice::{Dices, Roll}; use crate::dice::{Dices, Roll};
use crate::player::{Color, Player, PlayerId}; use crate::player::{Color, Player, PlayerId};
use crate::Error; use crate::Error;
use log::error; use log::{error, info};
// use itertools::Itertools; // use itertools::Itertools;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
@ -233,11 +233,18 @@ impl GameState {
} }
// Check move is physically possible // Check move is physically possible
// TODO : à corriger : ne permet pas le jeu tout d'une...
let color = &self.players[player_id].color; let color = &self.players[player_id].color;
if !self.board.move_possible(color, moves.0) if !self.board.move_possible(color, &moves.0) {
|| !self.board.move_possible(color, moves.1) return false;
{ }
// Chained_move : "Tout d'une"
let chained_move = moves.0.chain(moves.1);
if chained_move.is_ok() {
if !self.board.move_possible(color, &chained_move.unwrap()) {
return false;
}
} else if !self.board.move_possible(color, &moves.1) {
return false; return false;
} }
@ -455,4 +462,32 @@ mod tests {
// println!("string_id : {}", string_id); // println!("string_id : {}", string_id);
assert!(string_id == "Dz8+AAAAAT8/MAAAAAQAADAD"); assert!(string_id == "Dz8+AAAAAT8/MAAAAAQAADAD");
} }
#[test]
fn test_validate() {
let mut state = GameState::default();
let player1 = Player::new("player1".into(), Color::White);
let player_id = 1;
state.add_player(player_id, player1);
state.add_player(2, Player::new("player2".into(), Color::Black));
state.consume(&GameEvent::BeginGame {
goes_first: player_id,
});
// Chained moves
let moves = (
CheckerMove::new(1, 5).unwrap(),
CheckerMove::new(5, 9).unwrap(),
);
let event: GameEvent = GameEvent::Move { player_id, moves };
assert!(state.validate(&event));
// not chained moves
let moves = (
CheckerMove::new(1, 5).unwrap(),
CheckerMove::new(6, 9).unwrap(),
);
let event: GameEvent = GameEvent::Move { player_id, moves };
assert!(!state.validate(&event));
}
} }