diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/board/board.cpp | 13 | ||||
| -rw-r--r-- | src/board/board.hpp | 6 | ||||
| -rw-r--r-- | src/board/fen.cpp | 35 | ||||
| -rw-r--r-- | src/moves.cpp | 7 |
4 files changed, 39 insertions, 22 deletions
diff --git a/src/board/board.cpp b/src/board/board.cpp index 92d448d..cb9254e 100644 --- a/src/board/board.cpp +++ b/src/board/board.cpp @@ -195,7 +195,7 @@ UndoMove MakeMove(Move move, Game *g) { if (g->halfMoveClock >= 50) { g->state = DRAW; } - + UpdateBitboards(g); return undo; }; void UnMakeMove(UndoMove undo, Game *g) { @@ -251,4 +251,15 @@ void UnMakeMove(UndoMove undo, Game *g) { if (g->ThreeFoldMap[undo.ZobristKey] <= 0) { g->ThreeFoldMap.erase(undo.ZobristKey); }; + UpdateBitboards(g); }; +void UpdateBitboards(Game *g) { + g->PieceBitboard = 0; + for (int i = 0; i < 64; i++) { + Piece piece = g->pieces[i]; + if (piece.type == NONEPIECE) { + continue; + } + g->PieceBitboard |= (1ULL << i); + } +} diff --git a/src/board/board.hpp b/src/board/board.hpp index d1e379a..91a38f9 100644 --- a/src/board/board.hpp +++ b/src/board/board.hpp @@ -52,7 +52,8 @@ struct TranspositionsEntry { }; struct Game { Piece pieces[64]; - bool turn = true; // 1 white; 0 black + uint64_t PieceBitboard = 0; // used for quicly iterating over all squares + bool turn = true; // 1 white; 0 black bool whiteCastleKing = false; bool whiteCastleQueen = false; bool blackCastleKing = false; @@ -101,5 +102,6 @@ int PositionToIndex(Position i); UndoMove MakeMove(Move move, Game *g); void UnMakeMove(UndoMove undo, Game *g); -Position FindKing(Game *b, bool white); +Position FindKing(Game *g, bool white); +void UpdateBitboards(Game *g); #endif /* SRC_BOARD_H_ */ diff --git a/src/board/fen.cpp b/src/board/fen.cpp index 4b8686e..91a2533 100644 --- a/src/board/fen.cpp +++ b/src/board/fen.cpp @@ -8,7 +8,7 @@ bool WHITE = true; bool BLACK = false; -void setBoardFen(std::string fen, Game *b) { +void setBoardFen(std::string fen, Game *g) { // example fen rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1 int file = 0; int rank = 0; @@ -51,36 +51,36 @@ void setBoardFen(std::string fen, Game *b) { } if (state == CASTLE) { if (fen[i] == '-') { - b->blackCastleKing = false; - b->blackCastleQueen = false; - b->whiteCastleKing = false; - b->whiteCastleQueen = false; + g->blackCastleKing = false; + g->blackCastleQueen = false; + g->whiteCastleKing = false; + g->whiteCastleQueen = false; continue; } if (fen[i] == 'K') { - b->whiteCastleKing = true; + g->whiteCastleKing = true; continue; } if (fen[i] == 'Q') { - b->whiteCastleQueen = true; + g->whiteCastleQueen = true; continue; } if (fen[i] == 'k') { - b->blackCastleKing = true; + g->blackCastleKing = true; continue; } if (fen[i] == 'q') { - b->blackCastleQueen = true; + g->blackCastleQueen = true; continue; } } if (state == TURN) { if (toupper(fen[i]) == 'W') { - b->turn = WHITE; + g->turn = WHITE; continue; } if (toupper(fen[i]) == 'B') { - b->turn = BLACK; + g->turn = BLACK; continue; } } @@ -107,41 +107,42 @@ void setBoardFen(std::string fen, Game *b) { }; if (toupper(fen[i]) == 'N') { Piece piece = createPiece(KNIGHT, isupper(fen[i])); - b->pieces[rank * 8 + file] = piece; + g->pieces[rank * 8 + file] = piece; file++; continue; }; if (toupper(fen[i]) == 'R') { Piece piece = createPiece(ROOK, isupper(fen[i])); - b->pieces[rank * 8 + file] = piece; + g->pieces[rank * 8 + file] = piece; file++; continue; } if (toupper(fen[i]) == 'Q') { Piece piece = createPiece(QUEEN, isupper(fen[i])); - b->pieces[rank * 8 + file] = piece; + g->pieces[rank * 8 + file] = piece; file++; continue; } if (toupper(fen[i]) == 'B') { Piece piece = createPiece(BISHOP, isupper(fen[i])); - b->pieces[rank * 8 + file] = piece; + g->pieces[rank * 8 + file] = piece; file++; continue; } if (toupper(fen[i]) == 'P') { Piece piece = createPiece(PAWN, isupper(fen[i])); - b->pieces[rank * 8 + file] = piece; + g->pieces[rank * 8 + file] = piece; file++; continue; } if (toupper(fen[i]) == 'K') { Piece piece = createPiece(KING, isupper(fen[i])); - b->pieces[rank * 8 + file] = piece; + g->pieces[rank * 8 + file] = piece; file++; continue; } } break; } + UpdateBitboards(g); } diff --git a/src/moves.cpp b/src/moves.cpp index fc2b8c7..84c5ba4 100644 --- a/src/moves.cpp +++ b/src/moves.cpp @@ -147,10 +147,13 @@ std::vector<Move> GetPseudoLegalMoves(Game *b, bool GenerateQuietMoves) { constexpr std::array<int, 4> rook_Moves{-1, 1, 8, -8}; constexpr std::array<int, 4> bishop_Moves{-9, 9, -7, 7}; - for (uint i = 0; i < sizeof(b->pieces) / sizeof(b->pieces[0]); i++) { + uint64_t piece_bitboard = b->PieceBitboard; + while (piece_bitboard != 0) { + int i = __builtin_ctzll(piece_bitboard); + piece_bitboard &= piece_bitboard - 1; Piece piece = b->pieces[i]; if (piece.type == NONEPIECE) { - continue; + assert(false && "got none piece in piece bitboard"); } if (piece.color != b->turn) { continue; |
