Skip to content

Commit b83fc1d

Browse files
committed
Removed Piece.HasMoved
1 parent 520e113 commit b83fc1d

8 files changed

Lines changed: 56 additions & 88 deletions

File tree

UnityChessLib.Test/src/BoardTests.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ public void MovePiece_NormalMove_PieceIsMoved(int expectedFile, int expectedRank
2929
Assert.AreEqual(expectedPosition, pawn.Position);
3030
Assert.AreEqual(board[expectedPosition], pawn);
3131
Assert.AreEqual(board[initialPosition], null);
32-
Assert.True(pawn.HasMoved);
3332
}
3433

3534
[Test]

UnityChessLib.Test/src/CastlingMoveTests.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,7 @@ public void HandleAssociatedPiece_CastlingMove_RookMovedAsExpected(int expected,
2020
CastlingMove mcm = new CastlingMove(new Square(5, 1), new Square(7, 1), rook);
2121

2222
mcm.HandleAssociatedPiece(board);
23-
24-
Assert.True(rook.HasMoved);
23+
2524
Assert.AreEqual(expected, rook.Position.File);
2625
}
2726
}

UnityChessLib.Test/src/RulesTests.cs

Lines changed: 2 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -483,11 +483,6 @@ private static void AnandVsKramnikStalemate(Board board, Side side) {
483483
blunderPawn2 = new Pawn(new Square(7, 2), side.Complement());
484484
}
485485

486-
stalematedKing.HasMoved = true;
487-
stalematedPawn.HasMoved = true;
488-
blunderKing.HasMoved = true;
489-
blunderPawn1.HasMoved = true;
490-
491486
PlacePieces(board, stalematedKing, stalematedPawn, blunderKing, blunderPawn1, blunderPawn2);
492487

493488
board.InitKings();
@@ -514,13 +509,7 @@ private static void KorchnoiVsKarpovStalemate(Board board, Side side) {
514509
blunderBishop = new Bishop(new Square(7, 7), side.Complement());
515510
blunderPawn = new Pawn(new Square(1, 3), side.Complement());
516511
}
517-
518-
stalematedKing.HasMoved = true;
519-
stalematedPawn.HasMoved = true;
520-
blunderKing.HasMoved = true;
521-
blunderBishop.HasMoved = true;
522-
blunderPawn.HasMoved = true;
523-
512+
524513
PlacePieces(board, stalematedKing, stalematedPawn, blunderKing, blunderBishop, blunderPawn);
525514

526515
board.InitKings();
@@ -590,21 +579,7 @@ private static void GelfandVsKramnikStalemate(Board board, Side side) {
590579
blunderPawns[4] = new Pawn(new Square(7, 4), side.Complement());
591580
blunderPawns[5] = new Pawn(new Square(8, 5), side.Complement());
592581
}
593-
594-
stalematedKing.HasMoved = true;
595-
stalematedPawns[0].HasMoved = true;
596-
stalematedPawns[1].HasMoved = true;
597-
stalematedPawns[3].HasMoved = true;
598-
blunderKing.HasMoved = true;
599-
blunderRook.HasMoved = true;
600-
blunderQueen.HasMoved = true;
601-
blunderPawns[0].HasMoved = true;
602-
blunderPawns[1].HasMoved = true;
603-
blunderPawns[2].HasMoved = true;
604-
blunderPawns[3].HasMoved = true;
605-
blunderPawns[4].HasMoved = true;
606-
blunderPawns[5].HasMoved = true;
607-
582+
608583
PlacePieces(board, stalematedKing, blunderKing, blunderRook, blunderQueen);
609584

610585
foreach (Pawn stalematedPawn in stalematedPawns) {

src/Base/Board.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,6 @@ public void MovePiece(Movement move) {
105105
this[move.Start] = null;
106106
this[move.End] = pieceToMove;
107107

108-
pieceToMove.HasMoved = true;
109108
pieceToMove.Position = move.End;
110109

111110
(move as SpecialMove)?.HandleAssociatedPiece(this);

src/Base/PromotionUtil.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,7 @@ public static Piece GeneratePromotionPiece(ElectedPiece election, Square positio
1515
Piece piece = ElectedPieceGeneratorMap[election](position, side);
1616

1717
if (piece == null) return null;
18-
19-
piece.HasMoved = true;
18+
2019
return piece;
2120
}
2221
}

src/GameSerialization/GameConditions.cs

Lines changed: 29 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -42,62 +42,47 @@ int turnNumber
4242
HalfMoveClock = halfMoveClock;
4343
TurnNumber = turnNumber;
4444
}
45-
46-
public GameConditions CalculateEndingConditions(Board endingBoard, IList<HalfMove> halfMovesFromStart) {
47-
if (halfMovesFromStart.Count == 0) return this;
48-
49-
bool whiteEligibleForCastling = endingBoard.WhiteKing.Position.Equals(5, 1) && !endingBoard.WhiteKing.HasMoved;
50-
bool blackEligibleForCastling = endingBoard.BlackKing.Position.Equals(5, 8) && !endingBoard.BlackKing.HasMoved;
51-
int turnNumberAddend = SideToMove == Side.White
52-
? halfMovesFromStart.Count / 2
53-
: (halfMovesFromStart.Count + 1) / 2;
45+
46+
public GameConditions CalculateEndingConditions(Board resultingBoard, HalfMove lastHalfMove) {
47+
bool whiteKingMoved = lastHalfMove.Piece is King { OwningSide: Side.White };
48+
bool whiteQueensideRookMoved = lastHalfMove is {
49+
Piece: Rook { OwningSide: Side.White },
50+
Move: { Start: { File: 1, Rank: 1 } }
51+
};
52+
bool whiteKingsideRookMoved = lastHalfMove is {
53+
Piece: Rook { OwningSide: Side.White },
54+
Move: { Start: { File: 8, Rank: 1 } }
55+
};
5456

55-
return new GameConditions(
56-
sideToMove: halfMovesFromStart.Count % 2 == 0 ? SideToMove : SideToMove.Complement(),
57-
whiteCanCastleKingside: whiteEligibleForCastling && endingBoard[8, 1] is Rook { HasMoved: false },
58-
whiteCanCastleQueenside: whiteEligibleForCastling && endingBoard[1, 1] is Rook { HasMoved: false },
59-
blackCanCastleKingside: blackEligibleForCastling && endingBoard[8, 8] is Rook { HasMoved: false },
60-
blackCanCastleQueenside: blackEligibleForCastling && endingBoard[1, 8] is Rook { HasMoved: false },
61-
enPassantSquare: GetEndingEnPassantSquare(halfMovesFromStart[^1]),
62-
halfMoveClock: GetEndingHalfMoveClock(halfMovesFromStart),
63-
turnNumber: TurnNumber + turnNumberAddend
64-
);
65-
}
66-
67-
public GameConditions CalculateEndingConditions(Board endingBoard, HalfMove lastHalfMove) {
68-
bool whiteEligibleForCastling = endingBoard.WhiteKing.Position.Equals(5, 1) && !endingBoard.WhiteKing.HasMoved;
69-
bool blackEligibleForCastling = endingBoard.BlackKing.Position.Equals(5, 8) && !endingBoard.BlackKing.HasMoved;
57+
bool blackKingMoved = lastHalfMove.Piece is King { OwningSide: Side.Black };
58+
bool blackQueensideRookMoved = lastHalfMove is {
59+
Piece: Rook { OwningSide: Side.Black },
60+
Move: { Start: { File: 1, Rank: 8 } }
61+
};
62+
bool blackKingsideRookMoved = lastHalfMove is {
63+
Piece: Rook { OwningSide: Side.Black },
64+
Move: { Start: { File: 8, Rank: 8 } }
65+
};
7066

7167
return new GameConditions(
7268
sideToMove: SideToMove.Complement(),
73-
whiteCanCastleKingside: whiteEligibleForCastling && endingBoard[8, 1] is Rook { HasMoved: false },
74-
whiteCanCastleQueenside: whiteEligibleForCastling && endingBoard[1, 1] is Rook { HasMoved: false },
75-
blackCanCastleKingside: blackEligibleForCastling && endingBoard[8, 8] is Rook { HasMoved: false },
76-
blackCanCastleQueenside: blackEligibleForCastling && endingBoard[1, 8] is Rook { HasMoved: false },
77-
enPassantSquare: GetEndingEnPassantSquare(lastHalfMove),
69+
whiteCanCastleKingside: WhiteCanCastleKingside && !whiteKingMoved && !whiteKingsideRookMoved,
70+
whiteCanCastleQueenside: WhiteCanCastleKingside && !whiteKingMoved && !whiteQueensideRookMoved,
71+
blackCanCastleKingside: BlackCanCastleKingside && !blackKingMoved && !blackKingsideRookMoved,
72+
blackCanCastleQueenside: BlackCanCastleKingside && !blackKingMoved && !blackQueensideRookMoved,
73+
enPassantSquare: GetNextEnPassantSquare(lastHalfMove),
7874
halfMoveClock: GetNextHalfMoveClock(lastHalfMove, HalfMoveClock),
7975
turnNumber: TurnNumber + (SideToMove == Side.White ? 0 : 1)
8076
);
8177
}
8278

83-
private int GetEndingHalfMoveClock(IEnumerable<HalfMove> movesFromStart) {
84-
int endingHalfMoveClock = HalfMoveClock;
85-
86-
foreach (HalfMove halfMove in movesFromStart) {
87-
endingHalfMoveClock = GetNextHalfMoveClock(halfMove, endingHalfMoveClock);
88-
}
89-
90-
return endingHalfMoveClock;
91-
}
92-
93-
private static int GetNextHalfMoveClock(HalfMove halfMove, int endingHalfMoveClock) {
94-
return halfMove.Piece is Pawn || halfMove.CapturedPiece
79+
private static int GetNextHalfMoveClock(HalfMove lastHalfMove, int endingHalfMoveClock) {
80+
return lastHalfMove.Piece is Pawn || lastHalfMove.CapturedPiece
9581
? 0
9682
: endingHalfMoveClock + 1;
9783
}
98-
99-
// NOTE ending en passant square can be determined from simply the last half move made.
100-
private static Square GetEndingEnPassantSquare(HalfMove lastHalfMove) {
84+
85+
private static Square GetNextEnPassantSquare(HalfMove lastHalfMove) {
10186
Side lastTurnPieceColor = lastHalfMove.Piece.OwningSide;
10287
int pawnStartingRank = lastTurnPieceColor == Side.White ? 2 : 7;
10388
int pawnEndingRank = lastTurnPieceColor == Side.White ? 4 : 5;

src/Pieces/King.cs

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,20 @@ public King(King kingCopy) : base(kingCopy) {}
77

88
public override void UpdateLegalMoves(Board board, GameConditions gameConditions) {
99
CheckSurroundingSquares(board);
10-
CheckCastlingMoves(board);
10+
11+
if (OwningSide == Side.White) {
12+
CheckCastlingMoves(
13+
board,
14+
gameConditions.WhiteCanCastleKingside,
15+
gameConditions.WhiteCanCastleQueenside
16+
);
17+
} else {
18+
CheckCastlingMoves(
19+
board,
20+
gameConditions.BlackCanCastleKingside,
21+
gameConditions.BlackCanCastleQueenside
22+
);
23+
}
1124
}
1225

1326
private void CheckSurroundingSquares(Board board) {
@@ -28,22 +41,24 @@ private void CheckSurroundingSquares(Board board) {
2841
}
2942
}
3043

31-
private void CheckCastlingMoves(Board board) {
32-
if (HasMoved || Rules.IsPlayerInCheck(board, OwningSide)) {
33-
return;
34-
}
44+
private void CheckCastlingMoves(Board board, bool canCastleKingSide, bool canCastleQueenside) {
45+
if (Rules.IsPlayerInCheck(board, OwningSide)
46+
|| !canCastleKingSide && !canCastleQueenside
47+
) { return; }
3548

3649
int castlingRank = OwningSide.CastlingRank();
3750

3851
foreach (int rookFile in rookFiles) {
52+
bool checkingQueenside = rookFile == 1;
53+
3954
if (board[rookFile, castlingRank] is not Rook rook
4055
|| rook.OwningSide != OwningSide
41-
|| rook.HasMoved
56+
|| checkingQueenside && !canCastleQueenside
57+
|| !checkingQueenside && !canCastleKingSide
4258
) {
4359
continue;
4460
}
45-
46-
bool checkingQueenside = rookFile == 1;
61+
4762
Square inBetweenSquare0 = new Square(checkingQueenside ? 4 : 6, castlingRank);
4863
Square inBetweenSquare1 = new Square(checkingQueenside ? 3 : 7, castlingRank);
4964
Square inBetweenSquare2 = new Square(2, castlingRank);

src/Pieces/Piece.cs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,15 @@ public abstract class Piece {
66
public readonly Side OwningSide;
77
public readonly LegalMovesList LegalMoves;
88
public Square Position;
9-
public bool HasMoved;
109

1110
protected Piece(Square startPosition, Side owningSide) {
1211
OwningSide = owningSide;
13-
HasMoved = false;
1412
Position = startPosition;
1513
LegalMoves = new LegalMovesList();
1614
}
1715

1816
protected Piece(Piece pieceCopy) {
1917
OwningSide = pieceCopy.OwningSide;
20-
HasMoved = pieceCopy.HasMoved;
2118
Position = pieceCopy.Position;
2219
LegalMoves = pieceCopy.LegalMoves.DeepCopy();
2320
}

0 commit comments

Comments
 (0)