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 {
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 {
@ -118,7 +129,7 @@ impl Board {
// the exit : no checker added to the board
if field == 0 {
return Ok(())
return Ok(());
}
if self.blocked(color, field)? {
@ -155,7 +166,7 @@ impl Board {
// the exit is never 'blocked'
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
@ -198,10 +209,14 @@ impl Board {
// Get the corner field for the color
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);
// 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);
@ -279,38 +294,28 @@ mod tests {
Ok(())
}
#[test]
fn set_field_blocked() {
let mut board = Board::new();
assert!(
board.set( &Color::White, 24, 2)
.is_err()
);
assert!(board.set(&Color::White, 24, 2).is_err());
}
#[test]
fn set_wrong_field1() {
let mut board = Board::new();
assert!(board
.set( &Color::White, 50, 2)
.is_err());
assert!(board.set(&Color::White, 50, 2).is_err());
}
#[test]
fn set_wrong_amount0() {
let mut board = Board::new();
assert!(board
.set(&Color::White , 23, -3)
.is_err());
assert!(board.set(&Color::White, 23, -3).is_err());
}
#[test]
fn set_wrong_amount1() {
let mut board = Board::new();
let player = Player::new("".into(), Color::White);
assert!(board
.set( &Color::White, 23, -3)
.is_err());
assert!(board.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::player::{Color, Player, PlayerId};
use crate::Error;
use log::error;
use log::{error, info};
// use itertools::Itertools;
use serde::{Deserialize, Serialize};
@ -233,11 +233,18 @@ impl GameState {
}
// Check move is physically possible
// TODO : à corriger : ne permet pas le jeu tout d'une...
let color = &self.players[player_id].color;
if !self.board.move_possible(color, moves.0)
|| !self.board.move_possible(color, moves.1)
{
if !self.board.move_possible(color, &moves.0) {
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;
}
@ -455,4 +462,32 @@ mod tests {
// println!("string_id : {}", string_id);
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));
}
}