|
@@ -1,8 +1,8 @@
|
|
use bitboard::Bitboard;
|
|
use bitboard::Bitboard;
|
|
|
|
+use bitboard::Square;
|
|
use bitboard::*;
|
|
use bitboard::*;
|
|
use search::Game;
|
|
use search::Game;
|
|
|
|
|
|
-pub type Square = u8;
|
|
|
|
pub type Side = bool;
|
|
pub type Side = bool;
|
|
|
|
|
|
pub const WHITE: Side = false;
|
|
pub const WHITE: Side = false;
|
|
@@ -17,17 +17,18 @@ pub const ROOK: PieceType = 3;
|
|
pub const QUEEN: PieceType = 4;
|
|
pub const QUEEN: PieceType = 4;
|
|
pub const KING: PieceType = 5;
|
|
pub const KING: PieceType = 5;
|
|
|
|
|
|
-
|
|
|
|
|
|
+#[derive(Copy, Clone, Debug)]
|
|
pub struct SimpleMove {
|
|
pub struct SimpleMove {
|
|
from: Square,
|
|
from: Square,
|
|
to: Square,
|
|
to: Square,
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+#[derive(Debug)]
|
|
pub enum Move {
|
|
pub enum Move {
|
|
Default { mov: SimpleMove, piece_type: PieceType },
|
|
Default { mov: SimpleMove, piece_type: PieceType },
|
|
Castling { side: Side, left: bool },
|
|
Castling { side: Side, left: bool },
|
|
EnPassant { side: Side, column: u8 },
|
|
EnPassant { side: Side, column: u8 },
|
|
- Promotion { side: Side, column: u8, promote_to: PieceType },
|
|
|
|
|
|
+ Promotion { mov: SimpleMove, promote_to: PieceType },
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -53,6 +54,16 @@ impl Iterator for BitboardIterator {
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
+pub fn generate_moves(game: &Game, side: Side) -> Vec<Move> {
|
|
|
|
+ let mut moves: Vec<Move> = Vec::new();
|
|
|
|
+ generate_pawn_pushes(game, side, &mut moves);
|
|
|
|
+ generate_pawn_captures(game, side, &mut moves);
|
|
|
|
+ generate_bishop_moves(game, side, &mut moves);
|
|
|
|
+ return moves;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+/*
|
|
pub fn generate_pawn_moves(game: &Game, side: Side) -> Bitboard {
|
|
pub fn generate_pawn_moves(game: &Game, side: Side) -> Bitboard {
|
|
let pushed = generate_pawn_pushes(game, side);
|
|
let pushed = generate_pawn_pushes(game, side);
|
|
let iter = BitboardIterator { board: pushed };
|
|
let iter = BitboardIterator { board: pushed };
|
|
@@ -61,31 +72,56 @@ pub fn generate_pawn_moves(game: &Game, side: Side) -> Bitboard {
|
|
}
|
|
}
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
-}
|
|
|
|
|
|
+}*/
|
|
|
|
|
|
-fn generate_pawn_pushes(game: &Game, side: Side) -> Bitboard {
|
|
|
|
|
|
+fn generate_pawn_pushes(game: &Game, side: Side, move_list: &mut Vec<Move>) {
|
|
let pawns = game.pawns(side);
|
|
let pawns = game.pawns(side);
|
|
let others = game.get_all_side(!side);
|
|
let others = game.get_all_side(!side);
|
|
let moved_pawns =
|
|
let moved_pawns =
|
|
match side {
|
|
match side {
|
|
WHITE => north_one(pawns),
|
|
WHITE => north_one(pawns),
|
|
BLACK => south_one(pawns)
|
|
BLACK => south_one(pawns)
|
|
- }
|
|
|
|
- & !(ROW_1 | ROW_8);
|
|
|
|
|
|
+ } & !(ROW_1 | ROW_8);
|
|
|
|
|
|
- let possible_pushes = moved_pawns & !others;
|
|
|
|
- return possible_pushes;
|
|
|
|
|
|
+ let iter = BitboardIterator { board: moved_pawns & !others };
|
|
|
|
+ for p in iter {
|
|
|
|
+ let origin = match side {
|
|
|
|
+ WHITE => south_one(p),
|
|
|
|
+ BLACK => north_one(p)
|
|
|
|
+ };
|
|
|
|
+ move_list.push(Move::Default { mov: SimpleMove { from: square(origin), to: square(p) }, piece_type: PAWN });
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
fn generate_pawn_captures(game: &Game, side: Side, move_list: &mut Vec<Move>) {
|
|
fn generate_pawn_captures(game: &Game, side: Side, move_list: &mut Vec<Move>) {
|
|
let pawns = game.pawns(side);
|
|
let pawns = game.pawns(side);
|
|
let others = game.get_all_side(!side);
|
|
let others = game.get_all_side(!side);
|
|
|
|
+ let promotion_mask = ROW_1 | ROW_8;
|
|
|
|
|
|
- let pawn_iterator = BitboardIterator{ pawns };
|
|
|
|
|
|
+ let pawn_iterator = BitboardIterator { board: pawns };
|
|
|
|
|
|
for pawn in pawn_iterator {
|
|
for pawn in pawn_iterator {
|
|
let left_cap = match side {
|
|
let left_cap = match side {
|
|
-
|
|
|
|
|
|
+ WHITE => northeast_one(pawn),
|
|
|
|
+ BLACK => southeast_one(pawn)
|
|
|
|
+ };
|
|
|
|
+ let right_cap = match side {
|
|
|
|
+ WHITE => northwest_one(pawn),
|
|
|
|
+ BLACK => southwest_one(pawn)
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ for cap in [left_cap, right_cap].iter() {
|
|
|
|
+ if cap & others != 0 {
|
|
|
|
+ let simple_move = SimpleMove { from: pawn.trailing_zeros() as u8, to: cap.trailing_zeros() as u8 };
|
|
|
|
+ if cap & promotion_mask != 0 {
|
|
|
|
+ move_list.push(Move::Promotion { mov: simple_move, promote_to: QUEEN });
|
|
|
|
+ move_list.push(Move::Promotion { mov: simple_move, promote_to: ROOK });
|
|
|
|
+ move_list.push(Move::Promotion { mov: simple_move, promote_to: BISHOP });
|
|
|
|
+ move_list.push(Move::Promotion { mov: simple_move, promote_to: KNIGHT });
|
|
|
|
+ } else {
|
|
|
|
+ move_list.push(Move::Default { mov: simple_move, piece_type: PAWN });
|
|
|
|
+ }
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|