use crate::CheckersBitBoard; #[derive(Copy, Clone, Eq, PartialEq)] pub enum MoveDirection { ForwardLeft = 0, ForwardRight = 1, BackwardLeft = 2, BackwardRight = 3, } #[derive(Copy, Clone)] pub struct Move { start: u32, direction: MoveDirection, jump: bool, } impl Move { pub const fn new(start: usize, direction: MoveDirection, jump: bool) -> Self { Self { start: start as u32, direction, jump, } } pub const unsafe fn apply_to(self, board: CheckersBitBoard) -> CheckersBitBoard { match self.jump { false => match self.direction { MoveDirection::ForwardLeft => { board.move_piece_forward_left_unchecked(self.start as usize) } MoveDirection::ForwardRight => { board.move_piece_forward_right_unchecked(self.start as usize) } MoveDirection::BackwardLeft => { board.move_piece_backward_left_unchecked(self.start as usize) } MoveDirection::BackwardRight => { board.move_piece_backward_right_unchecked(self.start as usize) } }, true => match self.direction { MoveDirection::ForwardLeft => { board.jump_piece_forward_left_unchecked(self.start as usize) } MoveDirection::ForwardRight => { board.jump_piece_forward_right_unchecked(self.start as usize) } MoveDirection::BackwardLeft => { board.jump_piece_backward_left_unchecked(self.start as usize) } MoveDirection::BackwardRight => { board.jump_piece_backward_right_unchecked(self.start as usize) } }, } } }