def en_passant(self): if self.file_pinned() or self.rank_pinned(): return [] m = [] c = 1 if self.is_white() else -1 p_x, p_y = self.position if self.board.is_en_passant_rank(self.color, self.position): last_move = self.board.get_last_move() if last_move and last_move.piece.is_pawn() and last_move.piece.color != self.color and \ abs(last_move.origin[1] - last_move.destination[1]) > 1: left = (p_x - 1 * c, p_y) right = (p_x + 1 * c, p_y) if last_move.piece.position == left: m.append( moves.Capture(self, (p_x, p_y), (left[0], left[1] + 1 * c), self.board.pieces[left])) elif last_move.piece.position == right: m.append( moves.Capture(self, (p_x, p_y), (right[0], right[1] + 1 * c), self.board.pieces[right])) return m
def pawn_attacks(self): if self.file_pinned() or self.rank_pinned(): return [] m = [] squares = self.influenced_squares() p_x, p_y = self.position pining_piece = self.diagonal_pin_piece() for s in squares: if s in self.board.pieces: if self.board.pieces[s].color != self.color: if self.board.pieces[s] == self.board.get_enemy_king( self.color): m.append(moves.Attack(self, (p_x, p_y), s)) elif self.board.is_last_rank(self.color, s): m += self.generate_all_promotions((p_x, p_y), s, self.board.pieces[s]) else: if pining_piece and pining_piece == self.board.pieces[ s]: m.append( moves.Capture(self, (p_x, p_y), s, self.board.pieces[s])) elif not pining_piece: m.append( moves.Capture(self, (p_x, p_y), s, self.board.pieces[s])) return m
def get_moves(self): m = [] squares = self.influenced_squares() p_x, p_y = self.position for s in squares: if self.protected_square(s): continue if s in self.board.pieces: if self.board.pieces[s].color != self.color: m.append( moves.Capture(self, (p_x, p_y), s, self.board.pieces[s])) else: m.append(moves.Move(self, (p_x, p_y), s)) castle_short = self.short_castle() castle_long = self.long_castle() if castle_short: m.append(castle_short) if castle_long: m.append(castle_long) return m
def get_moves(self): if self.file_pinned() or self.rank_pinned(): return [] m = [] p_x, p_y = self.position pining_piece = self.diagonal_pin_piece() if pining_piece and self.same_rising_diagonal(self, pining_piece): squares = self.get_rising_diagonal_squares() elif pining_piece and self.same_falling_diagonal(self, pining_piece): squares = self.get_falling_diagonal_squares() else: squares = self.influenced_squares() for s in squares: if s in self.board.pieces: if self.board.pieces[s].color != self.color: if self.board.pieces[s] == self.board.get_enemy_king( self.color): m.append(moves.Attack(self, (p_x, p_y), s)) else: m.append( moves.Capture(self, (p_x, p_y), s, self.board.pieces[s])) else: m.append(moves.Move(self, (p_x, p_y), s)) return m
def get_moves(self): if self.diagonally_pinned(): return [] m = [] p_x, p_y = self.position if self.file_pinned(): squares = self.get_file_squares() elif self.rank_pinned(): squares = self.get_rank_squares() else: squares = self.influenced_squares() for s in squares: if s in self.board.pieces: if self.board.pieces[s].color != self.color: if self.board.pieces[s] == self.board.get_enemy_king( self.color): m.append(moves.Attack(self, (p_x, p_y), s)) else: m.append( moves.Capture(self, (p_x, p_y), s, self.board.pieces[s])) else: m.append(moves.Move(self, (p_x, p_y), s)) return m