feat: add MovedInCheck/Checkmate/Stalemate MoveResult variants (stub dispatch)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-23 21:48:32 +01:00
parent 94a02ff684
commit 8b7ec57e5e
@@ -2,7 +2,7 @@ package de.nowchess.chess.controller
import scala.io.StdIn import scala.io.StdIn
import de.nowchess.api.board.{Board, Color, Piece} import de.nowchess.api.board.{Board, Color, Piece}
import de.nowchess.chess.logic.MoveValidator import de.nowchess.chess.logic.{MoveValidator, GameRules, PositionStatus}
import de.nowchess.chess.view.Renderer import de.nowchess.chess.view.Renderer
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
@@ -11,12 +11,15 @@ import de.nowchess.chess.view.Renderer
sealed trait MoveResult sealed trait MoveResult
object MoveResult: object MoveResult:
case object Quit extends MoveResult case object Quit extends MoveResult
case class InvalidFormat(raw: String) extends MoveResult case class InvalidFormat(raw: String) extends MoveResult
case object NoPiece extends MoveResult case object NoPiece extends MoveResult
case object WrongColor extends MoveResult case object WrongColor extends MoveResult
case object IllegalMove extends MoveResult case object IllegalMove extends MoveResult
case class Moved(newBoard: Board, captured: Option[Piece], newTurn: Color) extends MoveResult case class Moved(newBoard: Board, captured: Option[Piece], newTurn: Color) extends MoveResult
case class MovedInCheck(newBoard: Board, captured: Option[Piece], newTurn: Color) extends MoveResult
case class Checkmate(winner: Color) extends MoveResult
case object Stalemate extends MoveResult
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
// Controller // Controller
@@ -46,11 +49,10 @@ object GameController:
MoveResult.IllegalMove MoveResult.IllegalMove
else else
val (newBoard, captured) = board.withMove(from, to) val (newBoard, captured) = board.withMove(from, to)
MoveResult.Moved(newBoard, captured, turn.opposite) MoveResult.Moved(newBoard, captured, turn.opposite) // stub — Task 6 wires GameRules
/** Thin I/O shell: renders the board, reads a line, delegates to processMove, /** Thin I/O shell: renders the board, reads a line, delegates to processMove,
* prints the outcome, and recurses until the game ends. * prints the outcome, and recurses until the game ends.
* Behaviour is identical to the original implementation.
*/ */
def gameLoop(board: Board, turn: Color): Unit = def gameLoop(board: Board, turn: Color): Unit =
println() println()
@@ -78,3 +80,9 @@ object GameController:
val toSq = Parser.parseMove(input).map(_._2).fold("?")(_.toString) val toSq = Parser.parseMove(input).map(_._2).fold("?")(_.toString)
println(s"${prevTurn.label} captures ${cap.color.label} ${cap.pieceType.label} on $toSq") println(s"${prevTurn.label} captures ${cap.color.label} ${cap.pieceType.label} on $toSq")
gameLoop(newBoard, newTurn) gameLoop(newBoard, newTurn)
case MoveResult.MovedInCheck(newBoard, captured, newTurn) => // stub — Task 6 fills in
gameLoop(newBoard, newTurn)
case MoveResult.Checkmate(winner) => // stub — Task 6 fills in
gameLoop(Board.initial, Color.White)
case MoveResult.Stalemate => // stub — Task 6 fills in
gameLoop(Board.initial, Color.White)