wip: misc
This commit is contained in:
parent
9ac271f276
commit
42ccddc12b
2 changed files with 46 additions and 21 deletions
|
|
@ -308,12 +308,6 @@ impl Position {
|
||||||
from: Bitboard,
|
from: Bitboard,
|
||||||
to: Bitboard,
|
to: Bitboard,
|
||||||
}
|
}
|
||||||
impl<const ROLE: u8> MoveGenImpl<ROLE> {
|
|
||||||
#[inline]
|
|
||||||
fn new(role: Role, from: Bitboard, to: Bitboard) -> Self {
|
|
||||||
Self { role, from, to }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
impl<const ROLE: u8> MoveGen<RawMove> for MoveGenImpl<ROLE> {
|
impl<const ROLE: u8> MoveGen<RawMove> for MoveGenImpl<ROLE> {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn roles(&self, role: Role) -> bool {
|
fn roles(&self, role: Role) -> bool {
|
||||||
|
|
@ -348,7 +342,6 @@ impl Position {
|
||||||
to,
|
to,
|
||||||
promotion,
|
promotion,
|
||||||
} = uci;
|
} = uci;
|
||||||
let role = self.0.role(from).ok_or(InvalidUciMove::Illegal)?;
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn aux<'l, const ROLE: u8>(
|
fn aux<'l, const ROLE: u8>(
|
||||||
position: &'l Position,
|
position: &'l Position,
|
||||||
|
|
@ -356,13 +349,18 @@ impl Position {
|
||||||
from: Square,
|
from: Square,
|
||||||
to: Square,
|
to: Square,
|
||||||
) -> Result<Move<'l>, InvalidUciMove> {
|
) -> Result<Move<'l>, InvalidUciMove> {
|
||||||
let mut moves = MoveGenImpl::<ROLE>::new(role, from.bitboard(), to.bitboard());
|
let mut moves = MoveGenImpl::<ROLE> {
|
||||||
|
role,
|
||||||
|
from: from.bitboard(),
|
||||||
|
to: to.bitboard(),
|
||||||
|
};
|
||||||
let raw = position
|
let raw = position
|
||||||
.generate_moves(&mut moves)
|
.generate_moves(&mut moves)
|
||||||
.break_value()
|
.break_value()
|
||||||
.ok_or(InvalidUciMove::Illegal)?;
|
.ok_or(InvalidUciMove::Illegal)?;
|
||||||
Ok(unsafe { Move::new(position, raw) })
|
Ok(unsafe { Move::new(position, raw) })
|
||||||
}
|
}
|
||||||
|
let role = self.0.role(from).ok_or(InvalidUciMove::Illegal)?;
|
||||||
let promotion = if role == Role::Pawn {
|
let promotion = if role == Role::Pawn {
|
||||||
promotion.unwrap_or(Role::Pawn)
|
promotion.unwrap_or(Role::Pawn)
|
||||||
} else if promotion.is_some() {
|
} else if promotion.is_some() {
|
||||||
|
|
@ -381,18 +379,6 @@ impl Position {
|
||||||
found: Option<RawMove>,
|
found: Option<RawMove>,
|
||||||
found_other: bool,
|
found_other: bool,
|
||||||
}
|
}
|
||||||
impl<const ROLE: u8> MoveGenImpl<ROLE> {
|
|
||||||
#[inline]
|
|
||||||
fn new(role: Role, from: Bitboard, to: Bitboard) -> Self {
|
|
||||||
Self {
|
|
||||||
role,
|
|
||||||
from,
|
|
||||||
to,
|
|
||||||
found: None,
|
|
||||||
found_other: false,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
impl<const ROLE: u8> MoveGen<Infallible> for MoveGenImpl<ROLE> {
|
impl<const ROLE: u8> MoveGen<Infallible> for MoveGenImpl<ROLE> {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn roles(&self, role: Role) -> bool {
|
fn roles(&self, role: Role) -> bool {
|
||||||
|
|
@ -466,7 +452,13 @@ impl Position {
|
||||||
from: Bitboard,
|
from: Bitboard,
|
||||||
to: Bitboard,
|
to: Bitboard,
|
||||||
) -> Result<Move<'l>, InvalidSan> {
|
) -> Result<Move<'l>, InvalidSan> {
|
||||||
let mut moves = MoveGenImpl::<ROLE>::new(role, from, to);
|
let mut moves = MoveGenImpl::<ROLE> {
|
||||||
|
role,
|
||||||
|
from,
|
||||||
|
to,
|
||||||
|
found: None,
|
||||||
|
found_other: false,
|
||||||
|
};
|
||||||
let ControlFlow::Continue(()) = position.generate_moves(&mut moves);
|
let ControlFlow::Continue(()) = position.generate_moves(&mut moves);
|
||||||
match moves.found {
|
match moves.found {
|
||||||
None => Err(InvalidSan::Illegal),
|
None => Err(InvalidSan::Illegal),
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@ use eschac::board::*;
|
||||||
use eschac::position::*;
|
use eschac::position::*;
|
||||||
use eschac::san::*;
|
use eschac::san::*;
|
||||||
use eschac::setup::*;
|
use eschac::setup::*;
|
||||||
|
use eschac::uci::*;
|
||||||
|
|
||||||
static P1: &'static str = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq -";
|
static P1: &'static str = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq -";
|
||||||
static P2: &'static str = "r3k2r/p1ppqpb1/bn2pnp1/3PN3/1p2P3/2N2Q1p/PPPBBPPP/R3K2R w KQkq -";
|
static P2: &'static str = "r3k2r/p1ppqpb1/bn2pnp1/3PN3/1p2P3/2N2Q1p/PPPBBPPP/R3K2R w KQkq -";
|
||||||
|
|
@ -319,6 +320,38 @@ fn san() {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn uci_move() {
|
||||||
|
let position = Setup::from_text_record("3qk3/2P5/8/8/8/8/8/B3K2R w K -")
|
||||||
|
.unwrap()
|
||||||
|
.into_position()
|
||||||
|
.unwrap();
|
||||||
|
for uci in ["a1a1", "a1a2", "c7b8q", "c7c8", "c7d8"].map(|s| s.parse::<UciMove>().unwrap()) {
|
||||||
|
assert!(uci.to_move(&position).is_err(), "{uci}");
|
||||||
|
}
|
||||||
|
for uci in ["c7c8q", "c7d8n", "e1g1"].map(|s| s.parse::<UciMove>().unwrap()) {
|
||||||
|
assert!(uci.to_move(&position).is_ok(), "{uci}");
|
||||||
|
}
|
||||||
|
assert_eq!(
|
||||||
|
"h1h8"
|
||||||
|
.parse::<UciMove>()
|
||||||
|
.unwrap()
|
||||||
|
.to_move(&position)
|
||||||
|
.unwrap()
|
||||||
|
.role(),
|
||||||
|
Role::Rook,
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
"a1h8"
|
||||||
|
.parse::<UciMove>()
|
||||||
|
.unwrap()
|
||||||
|
.to_move(&position)
|
||||||
|
.unwrap()
|
||||||
|
.role(),
|
||||||
|
Role::Bishop,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn max_legal_moves() {
|
fn max_legal_moves() {
|
||||||
let position = Setup::from_text_record("R6R/3Q4/1Q4Q1/4Q3/2Q4Q/Q4Q2/pp1Q4/kBNN1KB1 w - -")
|
let position = Setup::from_text_record("R6R/3Q4/1Q4Q1/4Q3/2Q4Q/Q4Q2/pp1Q4/kBNN1KB1 w - -")
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue