Remove pointers, add BoardState
This commit is contained in:
50
Board.cpp
50
Board.cpp
@@ -1,4 +1,5 @@
|
||||
#include "Board.hpp"
|
||||
#include "BoardState.hpp"
|
||||
|
||||
#include <ostream>
|
||||
#include <cassert>
|
||||
@@ -7,9 +8,6 @@
|
||||
#include <algorithm>
|
||||
#include <iostream>
|
||||
|
||||
Board::Board() {
|
||||
}
|
||||
|
||||
void Board::setPiece(const Square &square, const Piece::Optional &piece) {
|
||||
if (!piece.has_value())
|
||||
return;
|
||||
@@ -21,12 +19,12 @@ void Board::setPiece(const Square &square, const Piece::Optional &piece) {
|
||||
|
||||
mPieceBBs[toIndex(piece->type())].set(index);
|
||||
mPieceBBs[toIndex(piece->color())].set(index);
|
||||
(*mOccupiedBB).set(index);
|
||||
mOccupiedBB.set(index);
|
||||
}
|
||||
|
||||
Piece::Optional Board::piece(const Square &square) const {
|
||||
BitBoard mask = BitBoard::fromIndex(square.index());
|
||||
if (!(*mOccupiedBB & mask)) {
|
||||
if (!(mOccupiedBB & mask)) {
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
@@ -68,17 +66,17 @@ void Board::makeMove(const Move &move) {
|
||||
BitBoard changeBB = fromBB ^ toBB;
|
||||
|
||||
// If Piece is captured
|
||||
if (*mOccupiedBB & toBB) {
|
||||
if (mOccupiedBB & toBB) {
|
||||
auto capturedPiece = Piece(!mTurn, pieceType(toBB));
|
||||
mPieceBBs[toIndex(capturedPiece.color())] ^= toBB;
|
||||
mPieceBBs[toIndex(capturedPiece.type())] ^= toBB;
|
||||
*mOccupiedBB ^= fromBB;
|
||||
mOccupiedBB ^= fromBB;
|
||||
|
||||
if (toBB & CastlingRanks) { // Check castling rights
|
||||
handleCastlingRights(capturedPiece, toBB);
|
||||
}
|
||||
} else {
|
||||
*mOccupiedBB ^= changeBB; // update occupied bitboard
|
||||
mOccupiedBB ^= changeBB; // update occupied bitboard
|
||||
}
|
||||
|
||||
auto movedPiece = Piece(mTurn, pieceType(fromBB));
|
||||
@@ -105,7 +103,7 @@ void Board::makeMove(const Move &move) {
|
||||
|
||||
mPieceBBs[toIndex(PieceType::Rook)] ^= rookBB;
|
||||
mPieceBBs[toIndex(movedPiece.color())] ^= rookBB;
|
||||
*mOccupiedBB ^= rookBB;
|
||||
mOccupiedBB ^= rookBB;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -124,7 +122,7 @@ void Board::handleEnPassant(const Move &move, const Piece &movedPiece) {
|
||||
|
||||
mPieceBBs[toIndex(capturedPiece.color())] ^= epBB;
|
||||
mPieceBBs[toIndex(capturedPiece.type())] ^= epBB;
|
||||
*mOccupiedBB ^= epBB;
|
||||
mOccupiedBB ^= epBB;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -156,28 +154,22 @@ void Board::pseudoLegalMovesFrom(const Square &from, Board::MoveVec &moves) cons
|
||||
return;
|
||||
}
|
||||
|
||||
BoardState bs = BoardState(&mPieceBBs, mOccupiedBB, mTurn, mCR, mEPS);
|
||||
auto p = Piece(mTurn, pieceType(fromBB));
|
||||
|
||||
BitBoard movesBB;
|
||||
switch (p.type()) {
|
||||
case PieceType::Pawn:mMoveGenerator->generatePawnMoves(from, mEPS, mTurn, moves);
|
||||
case PieceType::Pawn: MoveGenerator::generatePawnMoves(bs, from, mEPS, mTurn, moves);
|
||||
return;
|
||||
case PieceType::Knight: break;
|
||||
case PieceType::Bishop:movesBB = BitBoard::bishopAttacks(fromBB, ~*mOccupiedBB) & ~mPieceBBs[toIndex(mTurn)];
|
||||
break;
|
||||
case PieceType::Rook: break;
|
||||
case PieceType::Queen: break;
|
||||
case PieceType::Bishop: MoveGenerator::generateBishopMoves(bs, from, mTurn, moves);
|
||||
return;
|
||||
case PieceType::Rook: MoveGenerator::generateRookMoves(bs, from, mTurn, moves);
|
||||
return;
|
||||
case PieceType::Queen: MoveGenerator::generateQueenMoves(bs, from, mTurn, moves);
|
||||
return;
|
||||
|
||||
case PieceType::King:movesBB = BitBoard::kingAttacks(fromBB) & ~mPieceBBs[toIndex(mTurn)];
|
||||
if (hasCastlingRights()) {
|
||||
if (mTurn == PieceColor::White) {
|
||||
movesBB |= BitBoard::castlingMoves(fromBB, ~mPieceBBs[toIndex(PieceType::Rook)], ~*mOccupiedBB)
|
||||
& WhiteCastlingRank;
|
||||
} else {
|
||||
movesBB |= BitBoard::castlingMoves(fromBB, ~mPieceBBs[toIndex(PieceType::Rook)], ~*mOccupiedBB)
|
||||
& BlackCastlingRank;
|
||||
}
|
||||
}
|
||||
case PieceType::King: MoveGenerator::generateKingMoves(bs, from, mTurn, mCR, moves);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -233,14 +225,6 @@ bool Board::isMoveCastling(const BitBoard &from, const BitBoard &to, const Piece
|
||||
|
||||
return from & BitBoard::fromIndex(E8);
|
||||
}
|
||||
constexpr bool Board::hasCastlingRights() const {
|
||||
switch (mTurn) {
|
||||
case PieceColor::White:return (mCR & CastlingRights::White) != CastlingRights::None;
|
||||
case PieceColor::Black:return (mCR & CastlingRights::Black) != CastlingRights::None;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
std::ostream &operator<<(std::ostream &os, const Board &board) {
|
||||
// For debugging only, performance isn't important
|
||||
|
Reference in New Issue
Block a user