| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 | #include "ChessGame.h"#include <sstream>#include <stdexcept>using namespace chessy;ChessGame::ChessGame(void){    board.resetBoard();}ChessGame::ChessGame(const std::string& fenString){    loadFromFen(fenString);}bool ChessGame::isValidMove(const Move& move) const{    return false;}std::vector<Move> ChessGame::getValidMoves(void) const{    std::vector<Move> ret;    return ret;}void ChessGame::move(Move move){    board.move(move);    if (turn == BLACK_SIDE) {        moveCount++;    }    turn = turn == WHITE_SIDE ? BLACK_SIDE : WHITE_SIDE;}void ChessGame::loadFromFen(const std::string& fenString){    using namespace std;    stringstream tokenizer (fenString);    string board;    string turn;    string castling;    string enPassant;    string halfmoves;    string moveCount;    tokenizer >> board;    tokenizer >> turn;    tokenizer >> castling;    tokenizer >> enPassant;    tokenizer >> halfmoves;    tokenizer >> moveCount;    this->board.setBoard(board);    this->enPassant = Index {enPassant};    if (turn == "w"s) this->turn = WHITE_SIDE;    else if (turn == "b"s) this->turn = BLACK_SIDE;    else throw runtime_error("invalid turn "s + turn);    canCastleQueenSide[WHITE_SIDE] = false;    canCastleKingSide[WHITE_SIDE] = false;    canCastleQueenSide[BLACK_SIDE] = false;    canCastleKingSide[BLACK_SIDE] = false;    if (castling != "-")        for (auto character : castling) {            switch (character) {                case 'k':                    canCastleKingSide[WHITE_SIDE] = true;                    break;                case 'q':                    canCastleQueenSide[WHITE_SIDE] = true;                    break;                case 'K':                    canCastleKingSide[BLACK_SIDE] = true;                    break;                case 'Q':                    canCastleQueenSide[BLACK_SIDE] = true;                    break;                default:                    throw runtime_error("invalid castling right: "s + character);            }        }    if (enPassant == "-"s) {        this->enPassant = -1;    }    else {        if (enPassant.size() != 2 || (enPassant[1] != '3' && enPassant[1] != '6'))            throw runtime_error("invalid en passant string: "s + enPassant);        this->enPassant = Index{ enPassant };    }    try {        reversibleHalfMoves = stoi(halfmoves);    }    catch(...) {        throw runtime_error("invalid number of halfmoves: "s + halfmoves);    }    try {        this->moveCount = stoi(moveCount);    }    catch(...) {        throw runtime_error("invalid number of moves: "s + halfmoves);    }}std::string ChessGame::generateFen(void) const{    using namespace std;    string board = this->board.getFenBoard();    string turn = this->turn == WHITE_SIDE ? "w"s : "b"s;    string castlingRights =        (canCastleKingSide[BLACK_SIDE] ? "K"s : ""s) +        (canCastleQueenSide[BLACK_SIDE] ? "Q"s : ""s) +        (canCastleKingSide[WHITE_SIDE] ? "k"s : ""s) +        (canCastleQueenSide[WHITE_SIDE] ? "q"s : ""s);    if (castlingRights.empty())        castlingRights = "-"s;    string enPassant;    if (this->enPassant == -1) {        enPassant = "-"s;    }    else {        enPassant = this->enPassant.getName();    }    string halfmoves = to_string(reversibleHalfMoves);    string mCount = to_string(moveCount);    return board + " " + turn + " " + castlingRights + " " + enPassant + " " + halfmoves +       " " + mCount;}UndoInfo ChessGame::doMove(const MoveInfo& mi){    UndoInfo ui;    ui.before = board;    board.move(mi.move);    turn = otherSide(turn);    moveCount++;    if(mi.movedPiece != PAWN &&            board.getAtPosition(mi.move.destination) != EMPTY) {        reversibleHalfMoves++;        ui.decrementReversibleHalfMoves = true;    }    return ui;}void ChessGame::undoMove(const UndoInfo& ui){    board = ui.before;    turn = otherSide(turn);    moveCount--;    if (ui.decrementReversibleHalfMoves)        reversibleHalfMoves--;}
 |