diff options
| author | Peter B. <peter.bezdek@gmail.com> | 2026-07-25 18:10:17 +0200 |
|---|---|---|
| committer | Peter B. <peter.bezdek@gmail.com> | 2026-07-25 18:10:17 +0200 |
| commit | 98e5c1107ad8f8b22b624ab13c3c96fcbb37cdd2 (patch) | |
| tree | 5d73061fc5a3db44b984452fcc909824b76a2a5c /src/moves.cpp | |
| parent | 7d0364996c3d8b34d4634a163a0829fafcd42fca (diff) | |
| parent | f8d8c20695684a545b536e83a9977c25028232d5 (diff) | |
Merge branch 'main' of https://github.com/AdamMegaRules/chess
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; + } + } + }; +}; |
