refactor(core): optimize castling move logic and enhance move notation methods
Build & Test (NowChessSystems) TeamCity build failed

This commit is contained in:
2026-04-05 17:58:09 +02:00
parent 0778882db6
commit 08a8778227
2 changed files with 39 additions and 31 deletions
@@ -241,32 +241,41 @@ class GameEngine(
move.moveType match move.moveType match
case MoveType.CastleKingside => "O-O" case MoveType.CastleKingside => "O-O"
case MoveType.CastleQueenside => "O-O-O" case MoveType.CastleQueenside => "O-O-O"
case MoveType.EnPassant => case MoveType.EnPassant => enPassantNotation(move)
case MoveType.Promotion(pp) => promotionNotation(move, pp)
case MoveType.Normal(isCapture) => normalMoveNotation(move, boardBefore, isCapture)
private def enPassantNotation(move: Move): String =
s"${move.from.file.toString.toLowerCase}x${move.to}" s"${move.from.file.toString.toLowerCase}x${move.to}"
case MoveType.Promotion(pp) =>
val ppChar = pp match private def promotionNotation(move: Move, piece: PromotionPiece): String =
val ppChar = piece match
case PromotionPiece.Queen => "Q" case PromotionPiece.Queen => "Q"
case PromotionPiece.Rook => "R" case PromotionPiece.Rook => "R"
case PromotionPiece.Bishop => "B" case PromotionPiece.Bishop => "B"
case PromotionPiece.Knight => "N" case PromotionPiece.Knight => "N"
s"${move.to}=$ppChar" s"${move.to}=$ppChar"
case MoveType.Normal(isCapture) =>
private def normalMoveNotation(move: Move, boardBefore: Board, isCapture: Boolean): String =
boardBefore.pieceAt(move.from).map(_.pieceType) match boardBefore.pieceAt(move.from).map(_.pieceType) match
case Some(PieceType.Pawn) => case Some(PieceType.Pawn) =>
if isCapture then s"${move.from.file.toString.toLowerCase}x${move.to}" if isCapture then s"${move.from.file.toString.toLowerCase}x${move.to}"
else move.to.toString else move.to.toString
case Some(pt) => case Some(pt) =>
val letter = pt match val letter = pieceNotation(pt)
if isCapture then s"${letter}x${move.to}" else s"$letter${move.to}"
// $COVERAGE-OFF$ unreachable: executeMove is only called after a piece existence check
case None => move.to.toString
// $COVERAGE-ON$
private def pieceNotation(pieceType: PieceType): String =
pieceType match
case PieceType.Knight => "N" case PieceType.Knight => "N"
case PieceType.Bishop => "B" case PieceType.Bishop => "B"
case PieceType.Rook => "R" case PieceType.Rook => "R"
case PieceType.Queen => "Q" case PieceType.Queen => "Q"
case PieceType.King => "K" case PieceType.King => "K"
case _ => "" case _ => ""
if isCapture then s"${letter}x${move.to}" else s"$letter${move.to}"
// $COVERAGE-OFF$ unreachable: executeMove is only called after a piece existence check
case None => move.to.toString
// $COVERAGE-ON$
private def computeCaptured(context: GameContext, move: Move): Option[Piece] = private def computeCaptured(context: GameContext, move: Move): Option[Piece] =
move.moveType match move.moveType match
@@ -139,9 +139,9 @@ object DefaultRules extends RuleSet:
else else
val moves = scala.collection.mutable.ListBuffer[Move]() val moves = scala.collection.mutable.ListBuffer[Move]()
addCastleMove(context, moves, context.castlingRights.whiteKingSide, addCastleMove(context, moves, context.castlingRights.whiteKingSide,
"e1", "g1", "f1", "h1", MoveType.CastleKingside) "e1", "g1", "f1", MoveType.CastleKingside)
addCastleMove(context, moves, context.castlingRights.whiteQueenSide, addCastleMove(context, moves, context.castlingRights.whiteQueenSide,
"e1", "c1", "d1", "a1", MoveType.CastleQueenside) "e1", "c1", "d1", MoveType.CastleQueenside)
moves.toList moves.toList
private def blackCastles(context: GameContext, from: Square): List[Move] = private def blackCastles(context: GameContext, from: Square): List[Move] =
@@ -150,9 +150,9 @@ object DefaultRules extends RuleSet:
else else
val moves = scala.collection.mutable.ListBuffer[Move]() val moves = scala.collection.mutable.ListBuffer[Move]()
addCastleMove(context, moves, context.castlingRights.blackKingSide, addCastleMove(context, moves, context.castlingRights.blackKingSide,
"e8", "g8", "f8", "h8", MoveType.CastleKingside) "e8", "g8", "f8", MoveType.CastleKingside)
addCastleMove(context, moves, context.castlingRights.blackQueenSide, addCastleMove(context, moves, context.castlingRights.blackQueenSide,
"e8", "c8", "d8", "a8", MoveType.CastleQueenside) "e8", "c8", "d8", MoveType.CastleQueenside)
moves.toList moves.toList
private def addCastleMove( private def addCastleMove(
@@ -162,7 +162,6 @@ object DefaultRules extends RuleSet:
kingFromAlg: String, kingFromAlg: String,
kingToAlg: String, kingToAlg: String,
middleAlg: String, middleAlg: String,
rookAlg: String,
moveType: MoveType moveType: MoveType
): Unit = ): Unit =
if castlingRight then if castlingRight then