Xiangiqgame
AI engine for Xiangqi
Loading...
Searching...
No Matches
board_data_structs.hpp
Go to the documentation of this file.
1
3
4#pragma once
5
6#include <array>
7#include <cassert>
10#include <random>
11#include <vector>
12
13using namespace std;
14
15namespace gameboard {
16
19
22
29};
30constexpr CastleEdges kRedCastleEdges = {7, 9, 3, 5};
31constexpr CastleEdges kBlackCastleEdges = {0, 2, 3, 5};
32
36};
37
39 return static_cast<PieceColor>(-1 * color);
40}
41
44typedef array<array<GamePiece, kNumFiles>, kNumRanks> BoardMap_t;
47typedef array<array<int, kNumFiles>, kNumRanks> BoardMapInt_t;
48
51struct BoardSpace {
52
54
55 bool IsOnBoard() const {
56 return ((0 <= rank) && (rank < kNumRanks) && (0 <= file) && (file < kNumFiles));
57 }
58
59 bool IsInHomelandOf(const PieceColor color) const {
60 assert(color != PieceColor::kNul);
61 if (color == PieceColor::kRed) {
62 return rank >= kRedRiverEdge;
63 } else {
64 return rank <= kBlackRiverEdge;
65 }
66 }
67
68 bool IsInCastleOf(const PieceColor color) const {
69 assert(color != PieceColor::kNul);
70 auto castle_edges = color == PieceColor::kRed ? kRedCastleEdges : kBlackCastleEdges;
71 return (castle_edges.min_rank <= rank) && (rank <= castle_edges.max_rank) &&
72 (castle_edges.min_file <= file) && (file <= castle_edges.max_file);
73 }
74
75 BoardSpace operator+(const BoardDirection direction) const {
76 return BoardSpace{rank + direction.rank, file + direction.file};
77 }
78
79 bool operator==(const BoardSpace other) const {
80 return (rank == other.rank) && (file == other.file);
81 }
82
83 bool operator!=(const BoardSpace other) const {
84 return (rank != other.rank) || (file != other.file);
85 }
86};
87
88// Data struct for internal tracking of team's castle spaces as 1-D array
89typedef array<BoardSpace, 9> Castle_t;
90
91// Generates 1-D array of castle spaces from castle edge definitions
92inline constexpr Castle_t calc_castle_spaces(const CastleEdges &edges) {
93 Castle_t spaces{};
94
95 for (auto rank = edges.min_rank; rank <= edges.max_rank; rank++) {
96 for (auto file = edges.min_file; file <= edges.max_file; file++) {
97 spaces[3 * (rank - edges.min_rank) + file - edges.min_file].rank = rank;
98 spaces[3 * (rank - edges.min_rank) + file - edges.min_file].file = file;
99 }
100 }
101 return spaces;
102}
103
105
108}
109
111 BoardMap_t game_piece_board;
112 for (auto rank = 0; rank < kNumRanks; rank++) {
113 for (auto file = 0; file < kNumFiles; file++) {
114 game_piece_board[rank][file] = GamePiece(int_board[rank][file]);
115 }
116 }
117 return game_piece_board;
118}
119
120inline bool is_occupied(const BoardMap_t &board_map, const BoardSpace &space) {
121 return board_map[space.rank][space.file].piece_color != PieceColor::kNul;
122}
123
124inline PieceColor get_color(const BoardMap_t &board_map, const BoardSpace &space) {
125 return board_map[space.rank][space.file].piece_color;
126}
127
128inline PieceType get_type(const BoardMap_t &board_map, const BoardSpace &space) {
129 return board_map[space.rank][space.file].piece_type;
130}
131
133 const BoardMap_t &board_map,
134 const PieceColor color
135) {
136 auto castle =
138
139 BoardSpace found_space;
140
141 for (BoardSpace board_space : castle) {
142 auto piece = board_map[board_space.rank][board_space.file];
143 if (piece.piece_type == PieceType::kGen) {
144 found_space = board_space;
145 }
146 }
147 return found_space;
148}
149
150inline vector<BoardSpace> get_all_spaces_occupied_by(
151 const BoardMap_t &board_map,
152 const PieceColor color
153) {
154 vector<BoardSpace> occupied_spaces;
155 occupied_spaces.reserve(16);
156 for (auto rank = 0; rank < kNumRanks; rank++) {
157 for (auto file = 0; file < kNumFiles; file++) {
158 if (get_color(board_map, BoardSpace{rank, file}) == color) {
159 occupied_spaces.emplace_back(BoardSpace{rank, file});
160 }
161 }
162 }
163 return occupied_spaces;
164}
165} // namespace gameboard
Defines GamePiece and supporting constants and free functions.
int BoardIndexType
Tracking piece positions and determining legal moves.
BoardSpace get_general_position(const BoardMap_t &board_map, const PieceColor color)
array< array< int, kNumFiles >, kNumRanks > BoardMapInt_t
2-D array of integers; can be converted to gameboard::BoardMap_t using gameboard::int_board_to_game_p...
array< BoardSpace, 9 > Castle_t
constexpr Castle_t black_castle_spaces()
constexpr Castle_t red_castle_spaces()
const BoardIndexType kNumFiles
bool is_occupied(const BoardMap_t &board_map, const BoardSpace &space)
constexpr Castle_t calc_castle_spaces(const CastleEdges &edges)
const BoardIndexType kNumRanks
vector< BoardSpace > get_all_spaces_occupied_by(const BoardMap_t &board_map, const PieceColor color)
PieceColor opponent_of(PieceColor color)
BoardMap_t int_board_to_game_pieces(const BoardMapInt_t int_board)
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 BoardIndexType kRedRiverEdge
constexpr CastleEdges kBlackCastleEdges
const BoardIndexType kBlackRiverEdge
PieceType get_type(const BoardMap_t &board_map, const BoardSpace &space)
constexpr CastleEdges kRedCastleEdges
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 IsInCastleOf(const PieceColor color) const
bool operator==(const BoardSpace other) const
bool IsInHomelandOf(const PieceColor color) const
bool operator!=(const BoardSpace other) const
BoardSpace operator+(const BoardDirection direction) const
Defines a castle feature in terms of its min / max rank and file.
A Xiangqi game piece described by its gameboard::PieceType and its gameboard::PieceColor.
Definition: game_piece.hpp:42