def getPossibleMoves(self): # Function run to yield a group of all possible legal and illegal # 'Move' objects to the calling function. Does this by running through # a list of movements and testing for valid moves before yielding them. # Also goes through another special algorithm to test if it can also # perform another special type of move, a 'castle'. pos = self.position movements = [ C(0, 1), C(-1, -1), C(1, 0), C(-1, 0), C(1, 1), C(1, -1), C(-1, 1), C(0, -1) ] for movement in movements: newPos = pos + movement if self.board.isValidPos(newPos): pieceAtNewPos = self.board.pieceAtPosition(newPos) if self.board.pieceAtPosition(newPos) is None: yield Move(self, newPos) elif pieceAtNewPos.side != self.side: yield Move(self, newPos, pieceToCapture=pieceAtNewPos) if self.movesMade == 0: # CASTLING, HIGHLY WIP inCheck = False kingSideCastleBlocked = False queenSideCastleBlocked = False kingSideCastleCheck = False queenSideCastleCheck = False kingSideRookMoved = True queenSideRookMoved = True kingSideCastlePositions = [ self.position - C(1, 0), self.position - C(2, 0) ] for position in kingSideCastlePositions: if self.board.pieceAtPosition(position): kingSideCastleBlocked = True queenSideCastlePositions = [ self.position + C(1, 0), self.position + C(2, 0), self.position + C(3, 0) ] for position in queenSideCastlePositions: if self.board.pieceAtPosition(position): queenSideCastleBlocked = True if kingSideCastleBlocked and queenSideCastleBlocked: return opponentMoves = self.board.getAllMovesUnfiltered(not self.side, includeKing=False) for move in opponentMoves: if move.newPos == self.position: inCheck = True break if move.newPos == self.position - C(1, 0) or \ move.newPos == self.position - C(2, 0): kingSideCastleCheck = True if move.newPos == self.position + C(1, 0) or \ move.newPos == self.position + C(2, 0): queenSideCastleCheck = True kingSideRookPos = self.position - C(3, 0) kingSideRook = self.board.pieceAtPosition(kingSideRookPos) \ if self.board.isValidPos(kingSideRookPos) else None if kingSideRook and \ kingSideRook.stringRep == 'R' and \ kingSideRook.movesMade == 0: kingSideRookMoved = False queenSideRookPos = self.position + C(4, 0) queenSideRook = self.board.pieceAtPosition(queenSideRookPos) \ if self.board.isValidPos(kingSideRookPos) else None if queenSideRook and \ queenSideRook.stringRep == 'R' and \ queenSideRook.movesMade == 0: queenSideRookMoved = False if not inCheck: if not kingSideCastleBlocked and \ not kingSideCastleCheck and \ not kingSideRookMoved: move = Move(self, self.position - C(2, 0)) move.specialMovePiece = self.board.pieceAtPosition( kingSideRookPos) rookMove = Move(move.specialMovePiece, self.position - C(1, 0)) move.kingSideCastle = True move.rookMove = rookMove move.castle = True yield move if not queenSideCastleBlocked and \ not queenSideCastleCheck and \ not queenSideRookMoved: move = Move(self, self.position + C(2, 0)) move.specialMovePiece = self.board.pieceAtPosition( queenSideRookPos) rookMove = Move(move.specialMovePiece, self.position + C(1, 0)) move.queenSideCastle = True move.rookMove = rookMove move.castle = True yield move