Xiangiqgame
AI engine for Xiangqi
Loading...
Searching...
No Matches
terminal_output.cpp
Go to the documentation of this file.
1#include <cstdlib>
5#include <string>
7
8namespace terminalout {
9
10// PlayerReporter implementation
11const std::unordered_map<game::EvaluatorType, std::string>
16};
17
18const std::unordered_map<game::EvaluatorType, std::string>
23};
24
25const std::unordered_map<game::ZobristKeyType, std::string>
30};
31
33 : player_spec_{player_spec} {}
34
36 return "Player type = " + evaluator_to_player_type_.at(player_spec_.evaluator_type);
37}
38
40 return "Move Evaluator = " + evaluator_names_.at(player_spec_.evaluator_type);
41}
42
44 return "Max Search Depth = " + std::to_string(player_spec_.minimax_search_depth);
45}
46
48 // return "Zobrist Key Size = " +
49 // key_type_strings_.at(player_spec_.zobrist_key_type);
50
51 return "Zobrist Key Size = " + std::to_string(player_spec_.zobrist_key_size_bits);
52}
53
55 std::string result;
56
58 return PlayerTypeStr() + ", " + EvaluatorTypeStr() + ", " + SearchDepthStr() + ", " +
60 }
62 result = PlayerTypeStr();
63 }
64
66 result = PlayerTypeStr() + ", " + EvaluatorTypeStr();
67 }
68 return result;
69}
70
71// MoveReporter implementation
72
74 const std::vector<gameboard::ExecutedMove> &move_log
75) {
76 std::string result;
77 if (move_log.size() == 0) {
78 result = "None";
79 } else {
80 auto algebraic_move = movetranslation::AlgebraicMove::Create(move_log.back().spaces);
81 auto algebraic_start = algebraic_move.start();
82 auto algebraic_end = algebraic_move.end();
83 result = algebraic_start.value() + ", " + algebraic_end.value();
84 }
85 return result;
86}
87
88const std::string GamePieceEncoder::RED_TEXT_WHITE_BG = "\033[1;37;41m";
89const std::string GamePieceEncoder::BLACK_TEXT_WHITE_BG = "\033[1;30;47m";
90const std::string GamePieceEncoder::RESET_FORMAT = "\033[0m";
91
92const unordered_map<gameboard::PieceColor, std::string> GamePieceEncoder::disp_format_ =
93 {{gameboard::PieceColor::kRed, RED_TEXT_WHITE_BG},
94 {gameboard::PieceColor::kBlk, BLACK_TEXT_WHITE_BG},
95 {gameboard::PieceColor::kNul, RESET_FORMAT}};
96
97const unordered_map<gameboard::PieceColor, std::string>
102};
103const unordered_map<gameboard::PieceType, std::string>
113};
114
116 const gameboard::GamePiece &game_piece
117) {
118 return disp_format_.at(game_piece.piece_color) +
119 piece_type_to_code_.at(game_piece.piece_type) +
121}
122
124 std::ostringstream board_output;
125
126 board_output << "\t";
127 for (char file = 'a'; file <= 'i'; ++file) {
128 board_output << " " << file << " ";
129 }
130 board_output << "\n\n\n";
131 // Board rows
132 for (size_t row = 0; row < board_map.size(); ++row) {
133 board_output << " " << 10 - row << "\t"; // Row labels (10 to 1)
134
135 for (const auto &piece : board_map[row]) {
136 board_output << " " << game_piece_encoder_.EncodeGamePiece(piece) << " ";
137 }
138
139 board_output << "\n\n";
140 }
141
142 return board_output.str();
143}
144
146 const game::PlayerSpec &player_spec_red,
147 const game::PlayerSpec &player_spec_black
148)
149 : red_player_reporter_{PlayerReporter{player_spec_red}}
150 , black_player_reporter_{PlayerReporter{player_spec_black}}
151 , move_reporter_{}
152 , board_map_encoder_{} {}
153
154const unordered_map<gameboard::PieceColor, std::string>
158};
159
160const unordered_map<game::GameState, std::string>
162 {game::GameState::kRedWon, "Red won the game."},
163 {game::GameState::kBlkWon, "Black won the game."},
164 {game::GameState::kDraw, "Game ended in a draw."}
165};
166
168#ifdef _WIN32
169 system("cls");
170#else
171 system("clear");
172#endif
173}
174
176 if (game_status.is_in_check) {
177 std::cout << disp_team_name_.at(game_status.whose_turn) << " is in check"
178 << std::endl;
179 }
180}
181
183) {
184 std::cout << board_map_encoder_.EncodeBoardMap(game_status.board_map) << "\n"
185 << disp_team_name_.at(gameboard::PieceColor::kRed) << " Player:" << "\n"
186 << red_player_reporter_.SummaryStr() << "\n\n"
187 << disp_team_name_.at(gameboard::PieceColor::kBlk) << " Player:" << "\n"
189 << "Move count: " << std::to_string(game_status.move_log.size()) << "\n"
190 << std::endl;
191}
192
194) {
195 std::cout << "Most recent move: "
196 << move_reporter_.MostRecentMoveStr(game_status.move_log) << " ("
197 << disp_team_name_.at(gameboard::opponent_of(game_status.whose_turn)) << ")"
198 << "\n\n"
199 << "Whose turn: " << disp_team_name_.at(game_status.whose_turn) << "\n"
200 << std::endl;
201 DisplayIfInCheck(game_status);
202}
203
205) {
206 std::cout << "Final move: " << move_reporter_.MostRecentMoveStr(game_status.move_log)
207 << " (" << disp_team_name_.at(gameboard::opponent_of(game_status.whose_turn))
208 << ")"
209 << "\n\n"
210 << game_result_str_.at(game_status.game_state) << std::endl;
211}
212
214 ClearScreen();
215 DisplayInfoNeededEveryMove(game_status);
216 if (game_status.game_state == game::GameState::kUnfinished) {
217 DisplayInfoNeededMidGame(game_status);
218 } else {
219 DisplayInfoNeededEndGame(game_status);
220 }
221}
222
223} // namespace terminalout
static const AlgebraicMove Create(const std::vector< AlgebraicBoardSpace > &algebraic_board_spaces)
GamePieceEncoder game_piece_encoder_
std::string EncodeBoardMap(const gameboard::BoardMap_t &board_map)
static const std::string RESET_FORMAT
static const std::string BLACK_TEXT_WHITE_BG
static const std::string RED_TEXT_WHITE_BG
const std::string EncodeGamePiece(const gameboard::GamePiece &game_piece)
static const unordered_map< gameboard::PieceColor, std::string > piece_color_to_code_
static const unordered_map< gameboard::PieceType, std::string > piece_type_to_code_
static const unordered_map< gameboard::PieceColor, std::string > disp_format_
std::string MostRecentMoveStr(const std::vector< gameboard::ExecutedMove > &move_log)
static const std::unordered_map< game::ZobristKeyType, std::string > key_type_strings_
static const std::unordered_map< game::EvaluatorType, std::string > evaluator_names_
static const std::unordered_map< game::EvaluatorType, std::string > evaluator_to_player_type_
PlayerReporter(const game::PlayerSpec &player_spec)
const game::PlayerSpec & player_spec_
void ReportGameInfo(const game::GameStatus &game_status)
void DisplayInfoNeededEveryMove(const game::GameStatus &game_status)
static const unordered_map< game::GameState, std::string > game_result_str_
static const unordered_map< gameboard::PieceColor, std::string > disp_team_name_
void DisplayInfoNeededMidGame(const game::GameStatus &game_status)
void DisplayIfInCheck(const game::GameStatus &game_status)
TerminalGameReporter(const game::PlayerSpec &player_spec_red, const game::PlayerSpec &player_spec_black)
void DisplayInfoNeededEndGame(const game::GameStatus &game_status)
Defines GamePiece and supporting constants and free functions.
PieceColor opponent_of(PieceColor color)
array< array< GamePiece, kNumFiles >, kNumRanks > BoardMap_t
2-D array of gameboard::GamePiece objects.
const gameboard::BoardMap_t & board_map
const std::vector< gameboard::ExecutedMove > & move_log
game::GameState game_state
gameboard::PieceColor whose_turn
EvaluatorType evaluator_type
DepthType minimax_search_depth
A Xiangqi game piece described by its gameboard::PieceType and its gameboard::PieceColor.
Definition: game_piece.hpp:42
PieceColor piece_color
Definition: game_piece.hpp:44