pub mod move_list;
pub mod movegen;
pub mod movegen_consts;
use std::fmt::Display;
use crate::core::*;
#[derive(PartialEq, Debug, Clone, Copy)]
pub enum MoveType {
Drop,
Bounce,
None
}
#[derive(PartialEq, Debug, Clone, Copy)]
pub struct Move {
pub data: [(Piece, SQ); 3],
pub flag: MoveType,
}
impl Move {
pub fn new(data: [(Piece, SQ); 3], flag: MoveType) -> Move {
Move {
data,
flag,
}
}
pub fn new_null() -> Move {
Move {
data: [(Piece::None, SQ::NONE); 3],
flag: MoveType::None,
}
}
pub fn is_null(&self) -> bool {
self.data == [(Piece::None, SQ::NONE); 3] && self.flag == MoveType::None
}
pub fn is_win(&self) -> bool {
if self.flag == MoveType::Bounce {
self.data[1].1 == SQ::P1_GOAL || self.data[1].1 == SQ::P2_GOAL
} else {
self.data[2].1 == SQ::P1_GOAL || self.data[2].1 == SQ::P2_GOAL
}
}
}
impl Display for Move {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
if self.flag == MoveType::Bounce {
write!(f, "({}, {}) : ({}, {})", self.data[0].0, self.data[0].1, self.data[1].0, self.data[1].1)
} else {
write!(f, "({}, {}) : ({}, {}) : ({}, {})", self.data[0].0, self.data[0].1, self.data[1].0, self.data[1].1, self.data[2].0, self.data[2].1)
}
}
}
#[derive(PartialEq, Debug, Clone, Copy)]
pub struct RootMove {
pub mv: Move,
pub score: f64,
pub threats: usize,
pub ply: i8
}
impl RootMove {
pub fn new(mv: Move, score: f64, ply: i8, threats: usize) -> RootMove {
RootMove {
mv,
score,
ply,
threats,
}
}
pub fn new_null() -> RootMove {
RootMove {
mv: Move::new_null(),
score: 0.0,
ply: 0,
threats: 0,
}
}
pub fn is_null(&self) -> bool {
self.mv.is_null() && self.score == 0.0 && self.ply == 0
}
pub fn set_score_and_ply(&mut self, score: f64, ply: i8) {
self.score = score;
self.ply = ply;
}
}
impl Display for RootMove {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
if self.mv.flag == MoveType::Bounce {
write!(f, "{}|{}", self.mv.data[0].1, self.mv.data[1].1)
} else {
write!(f, "{}|{}|{}", self.mv.data[0].1, self.mv.data[1].1, self.mv.data[2].1)
}
}
}