-
Notifications
You must be signed in to change notification settings - Fork 0
/
attack.cpp
73 lines (57 loc) · 1.96 KB
/
attack.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include "attack.hpp"
#include "constants.hpp"
#include "validate.hpp"
int attack::isSquareAttacked(int square, constants::Color player, board::BoardState& state) {
assert(validate::is120OnBoard(square));
assert(validate::isSideValid(asInt(player)));
assert(state.checkBoard());
if (player == constants::Color::WHITE) {
if (state.pieces[square - 11] == asInt(constants::Piece::wP) || state.pieces[square - 9] == asInt(constants::Piece::wP))
return true;
}
else {
if (state.pieces[square + 11] == asInt(constants::Piece::bP) || state.pieces[square + 9] == asInt(constants::Piece::bP))
return true;
}
for (int move : knight_dir) {
int piece = state.pieces[square + move];
if (piece == asInt(constants::Square::OFFBOARD))
continue;
if (constants::IS_KNIGHT[piece] && (constants::PIECE_COLOR[piece] == player))
return state.pieces[square + move];
}
for (int move : rook_dir) {
int _square = square + move;
int piece = state.pieces[_square];
while (piece != asInt(constants::Square::OFFBOARD)) {
if (piece != asInt(constants::Piece::EMPTY)) {
if (constants::IS_ROOK_QUEEN[piece] && constants::PIECE_COLOR[piece] == player)
return true;
break;
}
_square += move;
piece = state.pieces[_square];
}
}
for (int move : bishop_dir) {
int _square = square + move;
int piece = state.pieces[_square];
while (piece != asInt(constants::Square::OFFBOARD)) {
if (piece != asInt(constants::Piece::EMPTY)) {
if (constants::IS_BISHOP_QUEEN[piece] && constants::PIECE_COLOR[piece] == player)
return true;
break;
}
_square += move;
piece = state.pieces[_square];
}
}
for (int move : king_dir) {
int piece = state.pieces[square + move];
if (piece == asInt(constants::Square::OFFBOARD))
continue;
if (constants::IS_KING[piece] && (constants::PIECE_COLOR[piece] == player))
return state.pieces[square + move];
}
return false;
}