TurboSchach/Visualizer/ChessboardVisualizer.cpp

167 lines
5.2 KiB
C++

#include "ChessboardVisualizer.hpp"
size_t ChessboardVisualizer::GetMaxBoardWidth() {
std::string temp;
temp.append(3, ' ');
temp += BaseVisualizer::TOP_LEFT_CORNER;
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 7; j++) {
temp += BaseVisualizer::HORIZONTAL_LINE;
}
}
temp += BaseVisualizer::TOP_RIGHT_CORNER;
return BaseVisualizer::CountVisibleCharacters(temp);
}
void ChessboardVisualizer::GenerateTopBottomBorder(bool top, bool single) {
std::string temp;
temp.append(3, ' '); // ToDo: Padding?
temp += (top)
? ((single)
? BaseVisualizer::TOP_LEFT_CORNER_SINGLE
: BaseVisualizer::TOP_LEFT_CORNER)
: ((single)
? BaseVisualizer::BOTTOM_LEFT_CORNER_SINGLE
: BaseVisualizer::BOTTOM_LEFT_CORNER);
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 7; j++) {
temp += (single) ? BaseVisualizer::HORIZONTAL_LINE_SINGLE : BaseVisualizer::HORIZONTAL_LINE;
}
}
display_vector.push_back({temp + ((top) ? ((single) ? BaseVisualizer::TOP_RIGHT_CORNER_SINGLE : BaseVisualizer::TOP_RIGHT_CORNER) : ((single) ? BaseVisualizer::BOTTOM_RIGHT_CORNER_SINGLE : BaseVisualizer::BOTTOM_RIGHT_CORNER))});
}
void ChessboardVisualizer::GenerateElement() {
BaseVisualizer::ClearTerminal();
GeneratePlayers();
GenerateChessboard();
//GenerateDisplayVector();
}
void ChessboardVisualizer::GeneratePlayers() {
std::string result;
result.append(3, ' ');
display_vector.push_back({result + CHESSBOARD->GetPlayer(ChessPieceColor::White)->GetName()
+ " vs. " + CHESSBOARD->GetPlayer(ChessPieceColor::Black)->GetName()});
}
void ChessboardVisualizer::GenerateChessboard() {
std::vector<std::string> temp;
for (int rank = 8; rank >= 1; rank--) {
if (rank == 8) GenerateTopBottomBorder(true, true);
for (int heightOfField = 0; heightOfField < 3; heightOfField++) {
for (char file = 'A'; file <= 'H'; file++) {
if (file == 'A') {
temp.push_back((heightOfField == 1) ? " " + std::to_string(rank) + " " : std::string(3, ' '));
temp.push_back(BaseVisualizer::VERTICAL_LINE_SINGLE);
}
temp.push_back(GenerateBoardField(file, rank, heightOfField));
if (file == 'H') {
temp.push_back(BaseVisualizer::VERTICAL_LINE_SINGLE);
}
}
display_vector.push_back(temp);
temp.clear();
}
if (rank == 1) {
GenerateTopBottomBorder(false, true);
GenerateFiles();
}
}
}
std::string ChessboardVisualizer::GenerateBoardField(char file, int rank, int height) {
ChessPiecePosition* position = new ChessPiecePosition(file, rank);
if (height == 1 && !CHESSBOARD->IsEmptyField(position)) {
ChessPiece* piece = CHESSBOARD->GetChessPiece(position);
return std::string(3, ' ') + piece->GetUnicode() + std::string(3, ' ');
}
return std::string(7, ' ');
}
void ChessboardVisualizer::GenerateFiles() {
std::string temp;
for (char file = 'A'; file <= 'H'; file++) {
if (file == 'A') {
temp += (std::string(4, ' '));
}
temp += (std::string(3, ' ') + std::string(1, file) + std::string(3, ' '));
if (file == 'H') {
temp += " ";
}
}
display_vector.push_back({temp});
}
// board[2] bis board[25] Feld des Schachbretts
// in vectoren von 2 bis 25 index von 2 bis 9
void ChessboardVisualizer::DisplayElement() {
size_t size;
std::string temp;
for (int row = 0; row < display_vector.size(); ++row) {
for (int column = 0; column < display_vector[row].size(); ++column) {
if (row >= 2 && row <= 25 && column >= 2 && column <= 9) {
bool isSecondRowOfField = (row % 3 == 2);
bool isBlackWhite = (column % 2 == row % 2);
if ((row - 1) % 3 == 0) { // Change after 3 rows
if (isSecondRowOfField) {
this->SetConsoleColor(isBlackWhite ? WHITE : BLACK, isBlackWhite ? BLACK : WHITE);
} else {
this->SetConsoleColor(isBlackWhite ? BLACK : WHITE, isBlackWhite ? WHITE : BLACK);
}
} else {
if (isSecondRowOfField) {
this->SetConsoleColor(isBlackWhite ? BLACK : WHITE, isBlackWhite ? WHITE : BLACK);
} else {
this->SetConsoleColor(isBlackWhite ? WHITE : BLACK, isBlackWhite ? BLACK : WHITE);
}
}
}
std::cout << display_vector[row][column];
this->SetConsoleColor(DEFAULT, DEFAULT);
}
this->SetConsoleColor(DEFAULT, DEFAULT);
std::cout << std::endl;
}
}
/*void ChessboardVisualizer::GenerateDisplayVector() {
std::string temp;
size_t size;
for (auto& row : draw_vector) {
if (row.size() > 1) {
for (const auto& element : row) {
temp += element;
}
display_vector.push_back(FillStringToMaxLength(temp));
temp = "";
} else {
display_vector.push_back(FillStringToMaxLength(row[0]));
}
}
}
std::string ChessboardVisualizer::FillStringToMaxLength(std::string& str) {
size_t size = BaseVisualizer::CountVisibleCharacters(str);
return ((size == MAX_MENU_WIDTH)
? str
: str.append(std::string(MAX_MENU_WIDTH - size, ' ')));
}*/