Xiangiqgame
AI engine for Xiangqi
Loading...
Searching...
No Matches
move_calculator.hpp
Go to the documentation of this file.
1
3
4#pragma once
5
6#include <any>
10
11using namespace std;
12using namespace gameboard;
13
14namespace gameboard {
15
19public:
23
24 bool IsOccupied(const BoardMap_t &board_map, const BoardSpace &space) {
25 return board_map[space.rank][space.file].piece_color != PieceColor::kNul;
26 }
27
29 const BoardSpace space,
30 MoveCollection &team_moves,
31 const BoardMap_t &board_map
32 ) {
33 ImplementCalcMovesFrom(space, team_moves, board_map);
34 }
36 return ImplementCalcAllMovesNoCheckTest(color, board_map);
37 }
38
39private:
42
43 // Helpful links for using pointers to class methods and any_cast:
44 // https://opensource.com/article/21/2/ccc-method-pointers
45 // https://stackoverflow.com/questions/6265851
46 // https://stackoverflow.com/questions/55520876/
47 // https://en.cppreference.com/w/cpp/utility/any/any_cast
48
50 const BoardSpace space,
51 MoveCollection &team_moves,
52 const BoardMap_t &board_map
53 ) {
54 auto piece_type = get_type(board_map, space);
55 auto color = get_color(board_map, space);
56 auto move_func = piece_dispatch_array_[piece_type];
57 auto move_func_ptr = any_cast<MethodPtr_t>(move_func);
58 (piece_moves_.*move_func_ptr)(board_map, color, space, team_moves);
59 }
60
62 PieceColor color,
63 const BoardMap_t &board_map
64 ) {
65 auto untested_moves = MoveCollection(120);
66 auto occ_spaces = get_all_spaces_occupied_by(board_map, color);
67 for (size_t space = 0; space < occ_spaces.size(); space++) {
68 CalcMovesFrom(occ_spaces[space], untested_moves, board_map);
69 }
70 return untested_moves;
71 }
72};
73
74} // namespace gameboard
Constants, typedefs, and simple structs used by gameboard::GameBoard.
Calculates legal gameboard::Move objects for of a gameboard::GameBoard with a particular state.
bool IsOccupied(const BoardMap_t &board_map, const BoardSpace &space)
PieceDispatchArray_t piece_dispatch_array_
void ImplementCalcMovesFrom(const BoardSpace space, MoveCollection &team_moves, const BoardMap_t &board_map)
void CalcMovesFrom(const BoardSpace space, MoveCollection &team_moves, const BoardMap_t &board_map)
MoveCollection ImplementCalcAllMovesNoCheckTest(PieceColor color, const BoardMap_t &board_map)
MoveCollection CalcAllMovesNoCheckTest(PieceColor color, const BoardMap_t &board_map)
Implements piece type dependent move rules; used by gameboard::MoveCalculator.
Definition: piece_moves.hpp:19
Typedefs and data struct used by gameboard::MoveCalculator to select appropriate method from gameboar...
Tracking piece positions and determining legal moves.
array< MethodPtr_t, kNumPieceTypeVals > PieceDispatchArray_t
vector< BoardSpace > get_all_spaces_occupied_by(const BoardMap_t &board_map, const 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)
constexpr PieceDispatchArray_t build_piece_dispatch_array()
PieceType get_type(const BoardMap_t &board_map, const BoardSpace &space)
Definition of gameboard::PieceMoves and related constants.
A pair of coordinate (rank, and file) with properties determined by comparison with values of gameboa...
A container for multiple gameboard::Move objects.