Added other sliding pieces
This commit is contained in:
parent
eb77cf4b89
commit
942f195ddc
|
@ -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:
|
||||
|
|
Loading…
Reference in New Issue