Xiangiqgame
AI engine for Xiangqi
Loading...
Searching...
No Matches
game_piece.hpp
Go to the documentation of this file.
1
3
4#pragma once
5
6#include <cmath>
7#include <string>
8#include <unordered_map>
9
10using namespace std;
11
12namespace gameboard {
13enum PieceType : int {
14 kNnn = 0,
15 kGen = 1,
16 kAdv = 2,
17 kEle = 3,
18 kHor = 4,
19 kCha = 5,
20 kCan = 6,
21 kSol = 7
22};
23const int kNumPieceTypeVals = 8;
24
25const unordered_map<string, PieceType> kPieceTypeStringToEnum = [] {
26 unordered_map<string, PieceType> temp;
27 temp.insert(make_pair("null", PieceType::kNnn));
28 temp.insert(make_pair("general", PieceType::kGen));
29 temp.insert(make_pair("advisor", PieceType::kAdv));
30 temp.insert(make_pair("elephant", PieceType::kEle));
31 temp.insert(make_pair("chariot", PieceType::kCha));
32 temp.insert(make_pair("horse", PieceType::kHor));
33 temp.insert(make_pair("cannon", PieceType::kCan));
34 temp.insert(make_pair("soldier", PieceType::kSol));
35 return temp;
36}();
37
38enum PieceColor : int { kRed = -1, kNul = 0, kBlk = 1 };
39const int kNumPieceColorVals = 3;
40
42struct GamePiece {
45
49 }
50
51 GamePiece(int int_piece) {
52 piece_type = static_cast<PieceType>(abs(int_piece));
53 piece_color = (int_piece == 0) ? PieceColor::kNul
54 : static_cast<PieceColor>(copysign(1, int_piece));
55 }
56
58 piece_type = type;
59 piece_color = color;
60 }
61
62 bool operator==(const GamePiece &other) const {
63 return (piece_type == other.piece_type) && (piece_color == other.piece_color);
64 }
65};
66
67// Use lambda function because hpp2plantuml can't parse {{
68const unordered_map<string, PieceColor> kPieceColorStringToEnum = [] {
69 unordered_map<string, PieceColor> temp;
70 temp.insert(make_pair("red", PieceColor::kRed));
71 temp.insert(make_pair("null", PieceColor::kNul));
72 temp.insert(make_pair("black", PieceColor::kBlk));
73 return temp;
74}();
75
76// converts red/black: -1/1 of PieceColor enum to 0/1 used in some arrays
77inline size_t GetZColorIndexOf(PieceColor color) {
78 return (size_t)(color + (int)(color < 0));
79}
80// converts red/black: 0/1 to PieceColor -1/1 enum
81inline PieceColor GetPieceColorOf(size_t zcolor_index) {
82 int piece_color_val = (int)(zcolor_index - (size_t)(zcolor_index == 0));
83 return static_cast<PieceColor>(piece_color_val);
84}
85
86} // namespace gameboard
Tracking piece positions and determining legal moves.
size_t GetZColorIndexOf(PieceColor color)
Definition: game_piece.hpp:77
PieceColor GetPieceColorOf(size_t zcolor_index)
Definition: game_piece.hpp:81
const int kNumPieceColorVals
Definition: game_piece.hpp:39
const unordered_map< string, PieceType > kPieceTypeStringToEnum
Definition: game_piece.hpp:25
const int kNumPieceTypeVals
Definition: game_piece.hpp:23
const unordered_map< string, PieceColor > kPieceColorStringToEnum
Definition: game_piece.hpp:68
A Xiangqi game piece described by its gameboard::PieceType and its gameboard::PieceColor.
Definition: game_piece.hpp:42
GamePiece(PieceType type, PieceColor color)
Definition: game_piece.hpp:57
PieceColor piece_color
Definition: game_piece.hpp:44
GamePiece(int int_piece)
Definition: game_piece.hpp:51
bool operator==(const GamePiece &other) const
Definition: game_piece.hpp:62