chore: Refactor chess logic to MVC pattern and enhance board representation

This commit is contained in:
2026-03-21 20:37:33 +01:00
parent 9c2456e928
commit 1f1d3b670f
18 changed files with 168 additions and 146 deletions
@@ -0,0 +1,31 @@
package de.nowchess.api.board
opaque type Board = Map[Square, Piece]
object Board:
def apply(pieces: Map[Square, Piece]): Board = pieces
extension (b: Board)
def pieceAt(sq: Square): Option[Piece] = b.get(sq)
def withMove(from: Square, to: Square): (Board, Option[Piece]) =
val captured = b.get(to)
val updated = b.removed(from).updated(to, b(from))
(updated, captured)
def pieces: Map[Square, Piece] = b
val initial: Board =
val backRank: Vector[PieceType] = Vector(
PieceType.Rook, PieceType.Knight, PieceType.Bishop, PieceType.Queen,
PieceType.King, PieceType.Bishop, PieceType.Knight, PieceType.Rook
)
val entries = for
fileIdx <- 0 until 8
(color, rank, pieceType) <- Seq(
(Color.White, Rank.R1, backRank(fileIdx)),
(Color.White, Rank.R2, PieceType.Pawn),
(Color.Black, Rank.R8, backRank(fileIdx)),
(Color.Black, Rank.R7, PieceType.Pawn)
)
yield Square(File.values(fileIdx), rank) -> Piece(color, pieceType)
Board(entries.toMap)
@@ -6,3 +6,7 @@ enum Color:
def opposite: Color = this match
case White => Black
case Black => White
def label: String = this match
case White => "White"
case Black => "Black"
@@ -2,3 +2,11 @@ package de.nowchess.api.board
enum PieceType:
case Pawn, Knight, Bishop, Rook, Queen, King
def label: String = this match
case Pawn => "Pawn"
case Knight => "Knight"
case Bishop => "Bishop"
case Rook => "Rook"
case Queen => "Queen"
case King => "King"