#include "repl.hpp" #include "board.hpp" #include "bot.hpp" #include "moves.hpp" #include #include #include #include #include #include #include bool isValidChessRank(char rank) { if (rank >= '1' && rank <= '8') { return true; } else { return false; } } bool isValidChessFile(char rank) { if (rank >= 'A' && rank <= 'H') { return true; } else { return false; } } int startREPL(Board *b) { printBoard(b); while (true) { GetLegalMoves(b); if (b->state == STALEMATE) { printBoard(b); std::println(); std::cout << "\033[1mStalemate\033[0m" << "\n"; std::println(); return 0; } if (b->state == DRAW) { printBoard(b); std::println(); std::cout << "\033[1mDraw\033[0m" << "\n"; std::println(); return 0; } if (b->state == WHITE_WON) { printBoard(b); std::cout << "\033[1mChechmate White won\033[0m" << "\n"; return 0; } if (b->state == BLACK_WON) { printBoard(b); std::cout << "\033[1mCheckmate Black won\033[0m" << "\n"; return 0; } if (b->state == TURN) { if (true) { Move move = EngineGetBestMove(b); PlayMove(move, b); printBoard(b); continue; } } std::cout << "> "; std::string command; if (!(std::cin >> command)) { std::println(); std::cout << "Exiting...\n"; return EXIT_SUCCESS; } std::transform(command.begin(), command.end(), command.begin(), ::toupper); std::cout << command << "\n"; if (command == "EXIT") { std::println(); std::cout << "Exiting...\n"; return EXIT_SUCCESS; } if (command == "RESING") { std::cout << "\033[1mOK\033[0m" << "\n"; if (b->turn) { b->state = BLACK_WON; } else { b->state = WHITE_WON; } continue; } if (command == "BOARD") { printBoard(b); continue; } if (command == "MOVES" || command == "MOVE") { auto moves = GetLegalMoves(b); PrintMoves(moves); continue; } if (command.length() != 4) { std::cout << "Unknown Command, use EXIT to exit"; std::println(); continue; } if (b->state == TURN) { if (!isValidChessFile(command[0])) { std::cout << "ERROR: Expected valid file at first place"; std::println(); continue; } if (!isValidChessRank(command[1])) { std::cout << "ERROR: Expected valid rank at second place"; std::println(); continue; } if (!isValidChessFile(command[2])) { std::cout << "ERROR: Expected valid file at third place"; std::println(); continue; } if (!isValidChessRank(command[3])) { std::cout << "ERROR: Expected valid rank at four place"; std::println(); continue; } // we know its a valid chess pos int fromFile = command[0] - 'A'; int fromRank = '8' - command[1]; int toFile = command[2] - 'A'; int toRank = '8' - command[3]; std::cout << fromFile << "\n"; std::cout << fromRank << "\n"; std::cout << toFile << "\n"; std::cout << toRank << "\n"; Move move = { {static_cast(fromRank), static_cast(fromFile)}, {static_cast(toRank), static_cast(toFile)}}; auto moves = GetLegalMoves(b); if (!(std::ranges::find(moves, move) != moves.end())) { std::cout << "Invalid move!"; std::println(); PrintMoves(moves); continue; } std::println(); PlayMove(move, b); printBoard(b); } } } void PrintMoves(const std::vector &moves) { std::cout << "Moves (" << moves.size() << "):\n"; for (const Move &move : moves) { std::cout << (char)((int)move.From.file + 'A') << 8 - (int)move.From.rank << " -> " << (char)((int)move.To.file + 'A') << 8 - (int)move.To.rank << "\n"; } }