From 8335db588810a636762fbbcc6af038b91803145f Mon Sep 17 00:00:00 2001 From: cdricms <36056008+cdricms@users.noreply.github.com> Date: Mon, 1 Jul 2024 17:18:10 +0200 Subject: [PATCH] Pawn moves --- Sources/Engine/Board.swift | 2 +- Sources/Engine/Pieces/Bishop.swift | 15 +++++++++++++-- Sources/Engine/Pieces/Pawn.swift | 24 ++++++++++++++++++++++-- Sources/Engine/Pieces/Piece.swift | 1 - Sources/Engine/Pieces/Queen.swift | 15 +++++++++++++-- Sources/Engine/Pieces/Rook.swift | 15 +++++++++++++-- 6 files changed, 62 insertions(+), 10 deletions(-) diff --git a/Sources/Engine/Board.swift b/Sources/Engine/Board.swift index 8096f47..9b2cb88 100644 --- a/Sources/Engine/Board.swift +++ b/Sources/Engine/Board.swift @@ -75,7 +75,7 @@ public class Board: CustomStringConvertible, EventDelegate { } func notify(_ event: Event) { - + #warning("Not implemented") } internal func addPieceToTarget(_ piece: Piece, target: Square.Position) { diff --git a/Sources/Engine/Pieces/Bishop.swift b/Sources/Engine/Pieces/Bishop.swift index 79a40bb..a2c7ab7 100644 --- a/Sources/Engine/Pieces/Bishop.swift +++ b/Sources/Engine/Pieces/Bishop.swift @@ -26,7 +26,13 @@ final class Bishop: Piece, DiagonalMoves { let piece = square.piece { if piece.color != color { - delegate?.notify(.piecePinned(from: self, on: piece)) + if let king = piece as? King { + delegate?.notify(.kingInCheck(self, on: king)) + legalPositions.removeLast() + } else { + delegate?.notify( + .piecePinned(from: self, on: piece)) + } last = position } } @@ -35,7 +41,12 @@ final class Bishop: Piece, DiagonalMoves { } override func isLegal(on pos: Square.Position) -> Bool { - super.isLegal(on: pos) + if let s = delegate?.getSquareInfo(on: pos), let p = s.piece, + p.color == color + { + return false + } + return true } init(with color: Color, on position: Square.Position) { diff --git a/Sources/Engine/Pieces/Pawn.swift b/Sources/Engine/Pieces/Pawn.swift index fa2d50b..483c8bc 100644 --- a/Sources/Engine/Pieces/Pawn.swift +++ b/Sources/Engine/Pieces/Pawn.swift @@ -1,6 +1,8 @@ final class Pawn: Piece { + private var sign: Int8 { + color == .Black ? -1 : 1 + } override var pseudoLegalPositions: [Square.Position] { - let sign: Int8 = color == .Black ? -1 : 1 return [ position + (1 * sign, 0), position + (2 * sign, 0), @@ -14,7 +16,25 @@ final class Pawn: Piece { } override func isLegal(on pos: Square.Position) -> Bool { - super.isLegal(on: pos) + #warning("Handle en-passant") + if pos == position + (2 * sign, 0) && halfMoveCount > 0 { + return false + } + if (pos == position + (1 * sign, 0) || pos == position + (2 * sign, 0)) + && delegate?.getSquareInfo(on: pos)?.piece != nil + { + return false + } + guard super.isLegal(on: pos) else { + return false + } + if (pos == position + (1 * sign, 1) || pos == position + (1 * sign, -1)) + && delegate?.getSquareInfo(on: pos)?.piece == nil + { + return false + } + + return true } init(with color: Color, on position: Square.Position) { diff --git a/Sources/Engine/Pieces/Piece.swift b/Sources/Engine/Pieces/Piece.swift index efe19a0..982da6b 100644 --- a/Sources/Engine/Pieces/Piece.swift +++ b/Sources/Engine/Pieces/Piece.swift @@ -85,7 +85,6 @@ public class Piece: Hashable { if let p = s.piece { if p.color == color { return false } if let king = p as? King { - #warning("It could be in check or behind another piece.") delegate?.notify(.kingInCheck(self, on: king)) return false } diff --git a/Sources/Engine/Pieces/Queen.swift b/Sources/Engine/Pieces/Queen.swift index 4bd5faa..7532420 100644 --- a/Sources/Engine/Pieces/Queen.swift +++ b/Sources/Engine/Pieces/Queen.swift @@ -28,7 +28,13 @@ final class Queen: Piece, LinearMoves, DiagonalMoves { let piece = square.piece { if piece.color != color { - delegate?.notify(.piecePinned(from: self, on: piece)) + if let king = piece as? King { + delegate?.notify(.kingInCheck(self, on: king)) + legalPositions.removeLast() + } else { + delegate?.notify( + .piecePinned(from: self, on: piece)) + } last = position } } @@ -37,7 +43,12 @@ final class Queen: Piece, LinearMoves, DiagonalMoves { } override func isLegal(on pos: Square.Position) -> Bool { - super.isLegal(on: pos) + if let s = delegate?.getSquareInfo(on: pos), let p = s.piece, + p.color == color + { + return false + } + return true } init(with color: Color, on position: Square.Position) { diff --git a/Sources/Engine/Pieces/Rook.swift b/Sources/Engine/Pieces/Rook.swift index a7e9199..2bef96e 100644 --- a/Sources/Engine/Pieces/Rook.swift +++ b/Sources/Engine/Pieces/Rook.swift @@ -26,7 +26,13 @@ final class Rook: Piece, LinearMoves { let piece = square.piece { if piece.color != color { - delegate?.notify(.piecePinned(from: self, on: piece)) + if let king = piece as? King { + delegate?.notify(.kingInCheck(self, on: king)) + legalPositions.removeLast() + } else { + delegate?.notify( + .piecePinned(from: self, on: piece)) + } last = position } } @@ -35,7 +41,12 @@ final class Rook: Piece, LinearMoves { } override func isLegal(on pos: Square.Position) -> Bool { - super.isLegal(on: pos) + if let s = delegate?.getSquareInfo(on: pos), let p = s.piece, + p.color == color + { + return false + } + return true } init(with color: Color, on position: Square.Position) {