Added other sliding pieces

This commit is contained in:
Mattia Giambirtone 2023-10-16 23:02:58 +02:00
parent eb77cf4b89
commit 942f195ddc
1 changed files with 51 additions and 20 deletions

View File

@ -85,9 +85,8 @@ type
enPassantSquare*: Move
# Locations of all pieces
pieces: tuple[white: Pieces, black: Pieces]
# Locations of all attacked squares and their
# respective attackers
attacked: tuple[white: seq[tuple[attacker: Piece, loc: Location]], black: seq[tuple[attacker: Piece, loc: Location]]]
# Potential attacking moves for black and white
attacked: tuple[white: seq[Move], black: seq[Move]]
# Initialized only once, copied every time
@ -108,8 +107,12 @@ proc generateMoves(self: ChessBoard, location: Location): seq[Move]
func topLeftDiagonal(piece: Piece): Location {.inline.} = (if piece.color == White: (-1, -1) else: (1, 1))
func topRightDiagonal(piece: Piece): Location {.inline.} = (if piece.color == White: (-1, 1) else: (1, -1))
func bottomLeftDiagonal(piece: Piece): Location {.inline.} = (if piece.color == White: (-1, -1) else: (1, 1))
func bottomLeftDiagonal(piece: Piece): Location {.inline.} = (if piece.color == White: (-1, 1) else: (1, -1))
func bottomRightDiagonal(piece: Piece): Location {.inline.} = (if piece.color == White: (1, 1) else: (-1, -1))
func leftSide(piece: Piece): Location {.inline.} = (if piece.color == White: (0, -1) else: (0, 1))
func rightSide(piece: Piece): Location {.inline.} = (if piece.color == White: (0, 1) else: (0, -1))
func topSide(piece: Piece): Location {.inline.} = (if piece.color == White: (-1, 0) else: (1, 0))
func bottomSide(piece: Piece): Location {.inline.} = (if piece.color == White: (1, 0) else: (-1, 0))
func forward(piece: Piece): Location {.inline.} = (if piece.color == Black: (1, 0) else: (-1, 0))
func doublePush(piece: Piece): Location {.inline.} = (if piece.color == Black: (2, 0) else: (-2, 0))
proc testMoveOffsets(self: ChessBoard, move: Move): bool
@ -480,7 +483,18 @@ proc generateSlidingMoves(self: ChessBoard, location: Location): seq[Move] =
var
piece = self.grid[location.row, location.col]
doAssert piece.kind in [Bishop, Rook, Queen], &"generateSlidingMoves called on a {piece.kind}"
var directions: seq[Location] = @[piece.topRightDiagonal(), piece.topLeftDiagonal(), piece.bottomLeftDiagonal(), piece.bottomRightDiagonal()]
var directions: seq[Location] = @[]
# Only check in the right directions for the chosen piece
if piece.kind in [Bishop, Queen]:
directions.add(piece.topLeftDiagonal())
directions.add(piece.topRightDiagonal())
directions.add(piece.bottomLeftDiagonal())
directions.add(piece.bottomRightDiagonal())
if piece.kind in [Queen, Rook]:
directions.add(piece.topSide())
directions.add(piece.bottomSide())
directions.add(piece.rightSide())
directions.add(piece.leftSide())
for direction in directions:
# Slide in this direction as long as it's possible
var
@ -553,19 +567,36 @@ proc updateAttackedSquares(self: ChessBoard) =
# White pawns
for loc in self.pieces.white.pawns:
for move in self.generateMoves(loc):
self.attacked.white.add((move.piece, move.targetSquare))
self.attacked.white.add(move)
# Black pawns
for loc in self.pieces.black.pawns:
for move in self.generateMoves(loc):
self.attacked.black.add((move.piece, move.targetSquare))
self.attacked.black.add(move)
# White bishops
for loc in self.pieces.white.bishops:
for move in self.generateMoves(loc):
self.attacked.white.add((move.piece, move.targetSquare))
self.attacked.white.add(move)
# Black bishops
for loc in self.pieces.black.bishops:
for move in self.generateMoves(loc):
self.attacked.black.add((move.piece, move.targetSquare))
self.attacked.black.add(move)
# White rooks
for loc in self.pieces.white.rooks:
for move in self.generateMoves(loc):
self.attacked.white.add(move)
# Black rooks
for loc in self.pieces.black.rooks:
for move in self.generateMoves(loc):
self.attacked.black.add(move)
# White queens
for loc in self.pieces.white.queens:
for move in self.generateMoves(loc):
self.attacked.white.add(move)
# Black Queens
for loc in self.pieces.black.queens:
for move in self.generateMoves(loc):
self.attacked.black.add(move)
proc getAttackers*(self: ChessBoard, square: string): seq[Piece] =
@ -575,13 +606,13 @@ proc getAttackers*(self: ChessBoard, square: string): seq[Piece] =
let loc = square.algebraicToPosition()
case self.turn:
of White:
for (attacker, location) in self.attacked.black:
if location == loc:
result.add(attacker)
for move in self.attacked.black:
if move.targetSquare == loc:
result.add(move.piece)
of Black:
for (attacker, location) in self.attacked.white:
if location == loc:
result.add(attacker)
for move in self.attacked.white:
if move.targetSquare == loc:
result.add(move.piece)
else:
return @[]
@ -593,13 +624,13 @@ proc isAttacked*(self: ChessBoard, loc: Location): bool =
## by the current inactive color
case self.turn:
of White:
for (attacker, location) in self.attacked.black:
if location == loc:
for move in self.attacked.black:
if move.targetSquare == loc:
return true
return false
of Black:
for (attacker, location) in self.attacked.white:
if location == loc:
for move in self.attacked.white:
if move.targetSquare == loc:
return true
return false
else:
@ -705,7 +736,7 @@ proc updatePositions(self: ChessBoard, move: Move) =
self.pieces.black.rooks.add(move.targetSquare)
of Queen:
self.pieces.black.queens.delete(self.pieces.black.queens.find(move.startSquare))
self.pieces.white.queens.add(move.targetSquare)
self.pieces.black.queens.add(move.targetSquare)
of King:
self.pieces.black.king = move.targetSquare
else: