diff options
| author | Adam <adammegarules1@gmail.com> | 2026-07-29 16:18:52 +0200 |
|---|---|---|
| committer | Adam <adammegarules1@gmail.com> | 2026-07-29 16:18:52 +0200 |
| commit | 1d6a6717ba088c3b89d50021f2bf6656eb564533 (patch) | |
| tree | 83c2ba1c3a89eacf63f8841ccfb93671c5b45bdf /src/board.cpp | |
| parent | 42c1050af70447e935ad1914e57ccecd9f278e7f (diff) | |
implementing castling
Diffstat (limited to 'src/board.cpp')
| -rw-r--r-- | src/board.cpp | 127 |
1 files changed, 88 insertions, 39 deletions
diff --git a/src/board.cpp b/src/board.cpp index cbad8cb..ce116a1 100644 --- a/src/board.cpp +++ b/src/board.cpp @@ -1,13 +1,11 @@ #include "board.hpp" #include "zobrist.hpp" #include <cassert> -#include <string> -Piece createPiece(PieceType type, bool color, bool moved) { +Piece createPiece(PieceType type, bool color) { Piece piece; piece.type = type; piece.color = color; - piece.moved = moved; return piece; } @@ -30,7 +28,11 @@ UndoMove MakeMove(Move move, Game *g) { undo.oldMoveClock = g->MoveClock; undo.oldState = g->state; - undo.oldCaslte = g->castle; + + undo.OldwhiteCastleKing = g->whiteCastleKing; + undo.OldwhiteCastleQueen = g->whiteCastleQueen; + undo.OldblackCastleKing = g->blackCastleKing; + undo.OldblackCastleQueen = g->blackCastleQueen; // play move @@ -42,7 +44,6 @@ UndoMove MakeMove(Move move, Game *g) { assert(false && "capturing friendly piece error"); } } - piece.moved = true; // clock g->MoveClock++; @@ -56,7 +57,7 @@ UndoMove MakeMove(Move move, Game *g) { if (piece.type == PAWN && g->canEnpassant && move.To == g->enPassant) { Position capturedPawn = move.To; capturedPawn.rank += piece.color ? 1 : -1; - g->pieces[PositionToIndex(capturedPawn)] = {false, NONEPIECE, false}; + g->pieces[PositionToIndex(capturedPawn)] = {false, NONEPIECE}; undo.wasEnPassantCapture = true; undo.enPassantCapturedSquare = capturedPawn; @@ -82,42 +83,19 @@ UndoMove MakeMove(Move move, Game *g) { // TODO parse the promote type from uci isntead of ignoreting it piece.type = move.promotion == NONEPIECE ? QUEEN : move.promotion; } - assert(g->castle != ""); // caslte if (piece.type == KING && move.From.rank == (piece.color ? 0 : 7) && - g->castle != "-" && (move.From.file + 2 == move.To.file || move.From.file - 2 == move.To.file)) { - bool caslteSide = - (move.From.file > move.To.file); // 0 queen side, 1 king side - char castleCharacter = - (caslteSide ? (piece.color ? 'K' : 'k') : (piece.color ? 'Q' : 'q')); - std::string newCastleString = ""; - if (g->castle.contains('Q') && 'Q' != castleCharacter) { - newCastleString += 'Q'; - }; - if (g->castle.contains('K') && 'K' != castleCharacter) { - newCastleString += 'K'; - }; - if (g->castle.contains('q') && 'q' != castleCharacter) { - newCastleString += 'q'; - }; - if (g->castle.contains('k') && 'k' != castleCharacter) { - newCastleString += 'k'; - }; - if (newCastleString == "") { - newCastleString = "-"; - }; - g->castle = newCastleString; - + undo.wasCastle = true; + undo.CastledSide = (move.To.file > move.From.file); if (move.From.file + 2 == move.To.file) { Position rook_pos = move.To; rook_pos.file += 1; Piece rook = g->pieces[PositionToIndex(rook_pos)]; - g->pieces[PositionToIndex(rook_pos)] = {false, NONEPIECE, false}; - rook.moved = true; + g->pieces[PositionToIndex(rook_pos)] = {false, NONEPIECE}; rook_pos = move.From; rook_pos.file -= 1; g->pieces[PositionToIndex(rook_pos)] = rook; @@ -126,17 +104,61 @@ UndoMove MakeMove(Move move, Game *g) { Position rook_pos = move.To; rook_pos.file -= 1; Piece rook = g->pieces[PositionToIndex(rook_pos)]; - g->pieces[PositionToIndex(rook_pos)] = {false, NONEPIECE, false}; - rook.moved = true; + g->pieces[PositionToIndex(rook_pos)] = {false, NONEPIECE}; rook_pos = move.From; rook_pos.file += 1; g->pieces[PositionToIndex(rook_pos)] = rook; } }; - // setting the moves + // removing caslte rights + if (piece.type == KING) { + if (piece.color) { + g->whiteCastleKing = false; + g->whiteCastleQueen = false; + } else { + g->blackCastleKing = false; + g->blackCastleQueen = false; + } + } + + // this part was written by ai + if (piece.type == ROOK) { + if (piece.color) { // White + if (move.From.rank == 7 && move.From.file == 0) // a1 + g->whiteCastleQueen = false; + + if (move.From.rank == 7 && move.From.file == 7) // h1 + g->whiteCastleKing = false; + } else { // Black + if (move.From.rank == 0 && move.From.file == 0) // a8 + g->blackCastleQueen = false; + + if (move.From.rank == 0 && move.From.file == 7) // h8 + g->blackCastleKing = false; + } + } + + // this part is also written with ai + if (piece2.type == ROOK) { + if (piece2.color) { // White rook captured + if (move.To.rank == 7 && move.To.file == 0) // a1 + g->whiteCastleQueen = false; + + if (move.To.rank == 7 && move.To.file == 7) // h1 + g->whiteCastleKing = false; + } else { // Black rook captured + if (move.To.rank == 0 && move.To.file == 0) // a8 + g->blackCastleQueen = false; + + if (move.To.rank == 0 && move.To.file == 7) // h8 + g->blackCastleKing = false; + } + } + + // playing the moves g->pieces[PositionToIndex(move.To)] = piece; - g->pieces[PositionToIndex(move.From)] = {false, NONEPIECE, false}; + g->pieces[PositionToIndex(move.From)] = {false, NONEPIECE}; // changing who turn it is g->turn = !g->turn; @@ -178,9 +200,36 @@ void UnMakeMove(UndoMove undo, Game *g) { g->state = undo.oldState; - g->castle = undo.oldCaslte; + g->whiteCastleKing = undo.OldwhiteCastleKing; + g->whiteCastleQueen = undo.OldwhiteCastleQueen; + g->blackCastleKing = undo.OldblackCastleKing; + g->blackCastleQueen = undo.OldblackCastleQueen; - if (--g->ThreeFoldMap[undo.zobristKey] <= 0) { - g->ThreeFoldMap.erase(undo.zobristKey); + if (undo.wasCastle) { + if (undo.CastledSide) { + // rook f-file -> h-file + Position rookFrom = undo.to; + rookFrom.file -= 1; // f1/f8 + + Position rookTo = undo.to; + rookTo.file += 1; // h1/h8 + + g->pieces[PositionToIndex(rookTo)] = g->pieces[PositionToIndex(rookFrom)]; + g->pieces[PositionToIndex(rookFrom)] = {false, NONEPIECE}; + } else { + // rook d-file -> a-file + Position rookFrom = undo.to; + rookFrom.file += 1; // d1/d8 + + Position rookTo = undo.to; + rookTo.file -= 2; // a1/a8 + + g->pieces[PositionToIndex(rookTo)] = g->pieces[PositionToIndex(rookFrom)]; + g->pieces[PositionToIndex(rookFrom)] = {false, NONEPIECE}; + } } + g->ThreeFoldMap[undo.zobristKey] -= 1; + if (g->ThreeFoldMap[undo.zobristKey] <= 0) { + g->ThreeFoldMap.erase(undo.zobristKey); + }; }; |
