diff options
| author | Adam <adammegarules1@gmail.com> | 2026-07-25 18:07:29 +0200 |
|---|---|---|
| committer | Adam <adammegarules1@gmail.com> | 2026-07-25 18:07:29 +0200 |
| commit | f8d8c20695684a545b536e83a9977c25028232d5 (patch) | |
| tree | f595b34cf56445e7dba2aa68663b9be9622bb511 /src/moves.cpp | |
| parent | 1c6c1ed8ede9edf1860b1fbd5f2898b408689a05 (diff) | |
adding get legal moves
Diffstat (limited to 'src/moves.cpp')
| -rw-r--r-- | src/moves.cpp | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/src/moves.cpp b/src/moves.cpp index f417499..65a380a 100644 --- a/src/moves.cpp +++ b/src/moves.cpp @@ -1,3 +1,63 @@ +#include <array> +#include <cstdint> + +#include "board.hpp" #include "moves.hpp" +std::vector<Move> GetLegalMoves(board *b) { + std::vector<Move> moves; + moves.reserve(50); // almost all position dont have that many moves + + constexpr std::array<int, 4> rook_Moves{-1, 1, 8, -8}; + constexpr std::array<int, 4> bishop_Moves{-9, 9, -7, 7}; + + for (int i = 0; i < sizeof(b->pieces) / sizeof(b->pieces[0]); i++) { + Piece piece = b->pieces[i]; + if (piece.type == NONE) { + continue; + } + if (piece.color != b->turn) + continue; + + // Add support for other pieces + if (piece.type == BISHOP) { + GenerateSlidingMoves(b, i, bishop_Moves, moves); + } + if (piece.type == ROOK) { + GenerateSlidingMoves(b, i, rook_Moves, moves); + } + }; + + return moves; +} +Position IndexToPosition(int i) { + uint8_t rank = i / 8; // 0-7 + uint8_t file = i % 8; // 0-7 + return {rank, file}; +} +void GenerateSlidingMoves(board *b, int from, + const std::array<int, 4> &directions, + std::vector<Move> &moves) { + for (int i = 0; i < directions.size(); i++) { + int direction = directions[i]; + int i2 = from; + while (true) { + i2 += direction; + if (i2 >= 64 || i2 < 0) { + break; + } + if (b->pieces[i2].color == b->turn && b->pieces[i2].type != NONE) { + break; + } + if ((direction == 1 || direction == -1) && + (i2 / 8 != (i2 - direction) / 8)) { + break; + } + moves.push_back({IndexToPosition(i2), IndexToPosition(i2)}); + if (b->pieces[i2].color != b->turn && b->pieces[i2].type != NONE) { + break; + } + } + }; +}; |
