|
@@ -3,8 +3,8 @@
|
|
|
|
|
|
using namespace chessy;
|
|
|
|
|
|
-template class MoveGenerator<0>;
|
|
|
-template class MoveGenerator<1>;
|
|
|
+template class PawnPushGenerator<WHITE_SIDE>;
|
|
|
+template class PawnPushGenerator<BLACK_SIDE>;
|
|
|
|
|
|
|
|
|
std::string chessy::Move::asString(void) const
|
|
@@ -12,18 +12,61 @@ std::string chessy::Move::asString(void) const
|
|
|
return origin.getName() + "-" + destination.getName();
|
|
|
}
|
|
|
|
|
|
-
|
|
|
+#include <iostream>
|
|
|
template<int side>
|
|
|
-typename MoveGenerator<side>::MoveIterator MoveGenerator<side>::begin(void) const
|
|
|
+typename PawnPushGenerator<side>::MoveIterator PawnPushGenerator<side>::begin(void) const
|
|
|
{
|
|
|
- return MoveIterator{ chessGame.getBoard().getWhitePawns() };
|
|
|
+ const Board& board = chessGame.getBoard();
|
|
|
+ Bitboard movedPieces = side == WHITE_SIDE ?
|
|
|
+ board.getWhitePawns() :
|
|
|
+ board.getBlackPawns();
|
|
|
+ if (side == WHITE_SIDE)
|
|
|
+ movedPieces.moveNorthOne();
|
|
|
+ else
|
|
|
+ movedPieces.moveSouthOne();
|
|
|
+
|
|
|
+ movedPieces &= ~(side == WHITE_SIDE ? board.getBlacks() : board.getWhites());
|
|
|
+
|
|
|
+ std::cout << movedPieces << std::endl;
|
|
|
+ return MoveIterator{ movedPieces };
|
|
|
}
|
|
|
|
|
|
|
|
|
template<int side>
|
|
|
-typename MoveGenerator<side>::MoveIterator chessy::MoveGenerator<side>::end(void) const
|
|
|
+typename PawnPushGenerator<side>::MoveIterator PawnPushGenerator<side>::end(void) const
|
|
|
{
|
|
|
- return MoveIterator{ PositionSet::end() };
|
|
|
+ return MoveIterator{ 0 };
|
|
|
}
|
|
|
|
|
|
|
|
|
+const std::array<Bitboard, 64> KnightMoveGenerator::moveSets = generateKnightMoves();
|
|
|
+
|
|
|
+Bitboard KnightMoveGenerator::generateFromIndex(Index i) {
|
|
|
+ int row = i.getRow();
|
|
|
+ int column = i.getColumn();
|
|
|
+ Bitboard result = 0;
|
|
|
+ auto makeBitboardIfValid = [](int row, int column) -> Bitboard {
|
|
|
+ return row < 8 && column < 8 && row >= 0 && column >= 0 ?
|
|
|
+ Bitboard::fromIndex({row, column}) : Bitboard{ 0 };
|
|
|
+ };
|
|
|
+ result |= makeBitboardIfValid(row - 2, column - 1);
|
|
|
+ result |= makeBitboardIfValid(row - 1, column - 2);
|
|
|
+ result |= makeBitboardIfValid(row + 2, column - 1);
|
|
|
+ result |= makeBitboardIfValid(row + 1, column - 2);
|
|
|
+ result |= makeBitboardIfValid(row - 2, column + 1);
|
|
|
+ result |= makeBitboardIfValid(row - 1, column + 2);
|
|
|
+ result |= makeBitboardIfValid(row + 2, column + 1);
|
|
|
+ result |= makeBitboardIfValid(row + 1, column + 2);
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+std::array<Bitboard, 64> KnightMoveGenerator::generateKnightMoves(void)
|
|
|
+{
|
|
|
+ std::array<Bitboard, 64> moves{};
|
|
|
+ for (int8_t i = 0; i < moves.size(); i++) {
|
|
|
+ moves[i] = generateFromIndex(Index{ i });
|
|
|
+ }
|
|
|
+ return moves;
|
|
|
+}
|
|
|
+
|