#include #include #include "board.hpp" #include "moves.hpp" std::vector GetLegalMoves(board *b) { std::vector moves; moves.reserve(50); // almost all position dont have that many moves constexpr std::array rook_Moves{-1, 1, 8, -8}; constexpr std::array 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); } if (piece.type == QUEEN) { GenerateSlidingMoves(b, i, rook_Moves, moves); GenerateSlidingMoves(b, i, bishop_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 &directions, std::vector &moves) { for (int i = 0; i < directions.size(); i++) { int direction = directions[i]; int i2 = from; while (true) { i2 += direction; int oldFile = (i2 - direction) % 8; int newFile = i2 % 8; if (direction == 7 || direction == -7 || direction == 9 || direction == -9) { if (std::abs(newFile - oldFile) != 1) break; } 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(from), IndexToPosition(i2)}); if (b->pieces[i2].color != b->turn && b->pieces[i2].type != NONE) { break; } } }; };