Xiangiqgame
AI engine for Xiangqi
Loading...
Searching...
No Matches
piece_moves.cpp
Go to the documentation of this file.
1
3
5
6namespace gameboard {
7
8const array<BoardDirection, 2> kSideDirections = {
9 BoardDirection{0, 1},
10 BoardDirection{0, -1}
11};
12
13const vector<pair<BoardDirection, vector<BoardDirection>>> kHorsePaths = {
14 {BoardDirection{1, 0}, {BoardDirection{1, 1}, BoardDirection{1, -1}}},
15 {BoardDirection{-1, 0}, {BoardDirection{-1, 1}, BoardDirection{-1, -1}}},
16 {BoardDirection{0, 1}, {BoardDirection{1, 1}, BoardDirection{-1, 1}}},
17 {BoardDirection{0, -1}, {BoardDirection{1, -1}, BoardDirection{-1, -1}}}
18};
19
20const vector<BoardDirection> kAllOrthogonalDirections = {
21 BoardDirection{0, 1},
22 BoardDirection{0, -1},
23 BoardDirection{1, 0},
24 BoardDirection{-1, 0}
25};
26
27const vector<BoardDirection> kAllDiagonalDirections = {
28 BoardDirection{1, 1},
29 BoardDirection{1, -1},
30 BoardDirection{-1, 1},
31 BoardDirection{-1, -1}
32};
33
35 const BoardMap_t &board_map,
36 PieceColor color,
37 const BoardSpace &space,
38 MoveCollection &team_moves
39) {
40
41 auto fwd_space = space + FwdDirection(color);
42
43 if (ExistsAndPassesColorTest(board_map, fwd_space, color)) {
44 team_moves.Append(Move{space, fwd_space});
45 }
46
47 if (not space.IsInHomelandOf(color)) {
48 for (auto side_vector : kSideDirections) {
49 auto side_space = space + side_vector;
50 if (ExistsAndPassesColorTest(board_map, side_space, color)) {
51 team_moves.Append(Move{space, side_space});
52 }
53 }
54 }
55}
56
58 const BoardMap_t &board_map,
59 PieceColor color,
60 const BoardSpace &space,
61 MoveCollection &team_moves
62) {
63 for (auto direction : kAllOrthogonalDirections) {
64 auto next_step = space + direction;
65 while (next_step.IsOnBoard() && (not is_occupied(board_map, next_step))) {
66 team_moves.Append(Move{space, next_step});
67 next_step = next_step + direction;
68 }
69
70 if (next_step.IsOnBoard()) {
71 next_step = next_step + direction;
72 while (next_step.IsOnBoard() && (not is_occupied(board_map, next_step))) {
73 next_step = next_step + direction;
74 }
75 if (next_step.IsOnBoard() &&
76 get_color(board_map, next_step) == opponent_of(color)) {
77 team_moves.Append(Move{space, next_step});
78 }
79 }
80 }
81}
82
84 const BoardMap_t &board_map,
85 PieceColor color,
86 const BoardSpace &space,
87 MoveCollection &team_moves
88) {
89 for (auto direction : kAllOrthogonalDirections) {
90 auto next_step = space + direction;
91 while (next_step.IsOnBoard() && (not is_occupied(board_map, next_step))) {
92 team_moves.Append(Move{space, next_step});
93 next_step = next_step + direction;
94 }
95 if (next_step.IsOnBoard() &&
96 (get_color(board_map, next_step) == opponent_of(color))) {
97 team_moves.Append(Move{space, next_step});
98 }
99 }
100}
101
103 const BoardMap_t &board_map,
104 PieceColor color,
105 const BoardSpace &space,
106 MoveCollection &team_moves
107) {
108 for (auto direction : kHorsePaths) {
109 auto first_step = space + direction.first;
110 if (first_step.IsOnBoard() && (not is_occupied(board_map, first_step))) {
111 for (auto direction : direction.second) {
112 auto second_step = first_step + direction;
113 if (ExistsAndPassesColorTest(board_map, second_step, color))
114
115 {
116 team_moves.Append(Move{space, second_step});
117 }
118 }
119 }
120 }
121}
122
124 const BoardMap_t &board_map,
125 PieceColor color,
126 const BoardSpace &space,
127 MoveCollection &team_moves
128) {
129 for (auto direction : kAllDiagonalDirections) {
130 auto first_step = space + direction;
131 if (first_step.IsOnBoard() && (not is_occupied(board_map, first_step)) &&
132 (first_step.IsInHomelandOf(color))) {
133 auto second_step = first_step + direction;
134 if (ExistsAndPassesColorTest(board_map, second_step, color)) {
135 team_moves.Append(Move{space, second_step});
136 }
137 }
138 }
139}
140
142 const BoardMap_t &board_map,
143 PieceColor color,
144 const BoardSpace &space,
145 MoveCollection &team_moves
146) {
147 for (auto direction : kAllDiagonalDirections) {
148 auto destination = space + direction;
149 if (destination.IsInCastleOf(color) && (get_color(board_map, destination) != color))
150
151 {
152 team_moves.Append(Move{space, destination});
153 }
154 }
155}
156
158 const BoardMap_t &board_map,
159 PieceColor color,
160 const BoardSpace &space,
161 MoveCollection &team_moves
162) {
163
164 auto has_flying_move = true;
165 auto opponent_color = opponent_of(color);
166 auto other_gen_position = get_general_position(board_map, opponent_color);
167 if (space.file != other_gen_position.file) {
168 has_flying_move = false;
169 } else {
170 auto search_start = min(space.rank, other_gen_position.rank) + 1;
171 auto search_end = max(space.rank, other_gen_position.rank) - 1;
172 for (auto rank = search_start; rank <= search_end; rank++) {
173 if (is_occupied(board_map, BoardSpace{rank, space.file})) {
174 has_flying_move = false;
175 }
176 }
177 }
178
179 if (has_flying_move) {
180 team_moves.Append(Move{space, other_gen_position});
181 }
182}
183
185 const BoardMap_t &board_map,
186 PieceColor color,
187 const BoardSpace &space,
188 MoveCollection &team_moves
189) {
190 for (auto direction : kAllOrthogonalDirections) {
191 auto destination = space + direction;
192 if (destination.IsInCastleOf(color) &&
193 (get_color(board_map, destination) != color)) {
194 team_moves.Append(Move{space, destination});
195 }
196 }
197}
198
200 const BoardMap_t &board_map,
201 PieceColor color,
202 const BoardSpace &space,
203 MoveCollection &team_moves
204) {
205 FlyingGeneralMove(board_map, color, space, team_moves);
206 StandardGeneralMoves(board_map, color, space, team_moves);
207}
208}
void ElephantMoves(const BoardMap_t &board_map, PieceColor color, const BoardSpace &space, MoveCollection &team_moves)
static bool ExistsAndPassesColorTest(const BoardMap_t &board_map, const BoardSpace &space, PieceColor moving_piece_color)
Definition: piece_moves.hpp:81
void SoldierMoves(const BoardMap_t &board_map, PieceColor color, const BoardSpace &space, MoveCollection &team_moves)
Definition: piece_moves.cpp:34
void StandardGeneralMoves(const BoardMap_t &board_map, PieceColor color, const BoardSpace &space, MoveCollection &team_moves)
static BoardDirection FwdDirection(PieceColor color)
Definition: piece_moves.hpp:77
void FlyingGeneralMove(const BoardMap_t &board_map, PieceColor color, const BoardSpace &space, MoveCollection &team_moves)
void HorseMoves(const BoardMap_t &board_map, PieceColor color, const BoardSpace &space, MoveCollection &team_moves)
void AdvisorMoves(const BoardMap_t &board_map, PieceColor color, const BoardSpace &space, MoveCollection &team_moves)
void GeneralMoves(const BoardMap_t &board_map, PieceColor color, const BoardSpace &space, MoveCollection &team_moves)
void ChariotMoves(const BoardMap_t &board_map, PieceColor color, const BoardSpace &space, MoveCollection &team_moves)
Definition: piece_moves.cpp:83
void CannonMoves(const BoardMap_t &board_map, PieceColor color, const BoardSpace &space, MoveCollection &team_moves)
Definition: piece_moves.cpp:57
Tracking piece positions and determining legal moves.
BoardSpace get_general_position(const BoardMap_t &board_map, const PieceColor color)
const vector< pair< BoardDirection, vector< BoardDirection > > > kHorsePaths
Definition: piece_moves.cpp:13
const vector< BoardDirection > kAllOrthogonalDirections
Definition: piece_moves.cpp:20
bool is_occupied(const BoardMap_t &board_map, const BoardSpace &space)
const array< BoardDirection, 2 > kSideDirections
Definition: piece_moves.cpp:8
PieceColor opponent_of(PieceColor color)
array< array< GamePiece, kNumFiles >, kNumRanks > BoardMap_t
2-D array of gameboard::GamePiece objects.
PieceColor get_color(const BoardMap_t &board_map, const BoardSpace &space)
const vector< BoardDirection > kAllDiagonalDirections
Definition: piece_moves.cpp:27
Definition of gameboard::PieceMoves and related constants.
Descirbes a direction on a gameboard::GameBoard.board_map_.
A pair of coordinate (rank, and file) with properties determined by comparison with values of gameboa...
bool IsInHomelandOf(const PieceColor color) const
A container for multiple gameboard::Move objects.
A gameboard::BoardSpace pair (start and end).