def possible_moves(self, pieces): possible_moves = [] possible_moves += self.step_possible(pieces, 1, 0, 1) possible_moves += self.step_possible(pieces, -1, 0, 1) possible_moves += self.step_possible(pieces, 0, 1, 1) possible_moves += self.step_possible(pieces, 0, -1, 1) possible_moves += self.step_possible(pieces, 1, 1, 1) possible_moves += self.step_possible(pieces, 1, -1, 1) possible_moves += self.step_possible(pieces, -1, 1, 1) possible_moves += self.step_possible(pieces, -1, -1, 1) if not self.has_moved: castle_rooks = [] row = 0 if self.color == PieceColor.BLACK else 7 for piece in pieces: if piece.color == self.color and piece.piece_type == PieceType.ROOK and not piece.has_moved: castle_rooks.append(piece) for rook in castle_rooks: lowest_column = min(rook.column + 1, self.column + 1) highest_column = max(rook.column, self.column) possible = True for column in range(lowest_column, highest_column): piece = board.get_piece(pieces, board.get_box(row, column)) if piece: possible = False break if board.is_chess( board.pieces_after_move( pieces, board.get_move(self, board.get_box(row, column), None, None)), self.color): possible = False break if possible: direction = 1 if self.column < rook.column else -1 extra_move = board.get_move( rook, board.get_box( row, self.column + direction * 2 + direction * -1), None, None) move = board.get_move( self, board.get_box(row, self.column + direction * 2), None, extra_move) possible_moves.append(move) return possible_moves
def step_possible(self, pieces, column_step_multiplier, row_step_multiplier, step_limit=None, allow_capture=True, allow_non_capture=True): moves = [] while True: try_steps = len(moves) + 1 column = self.column + try_steps * column_step_multiplier row = self.row + try_steps * row_step_multiplier box = board.get_box(row, column) capture = board.get_piece(pieces, box) move = board.get_move(self, box, capture, None) if not (0 <= row <= 7) or not (0 <= column <= 7): break piece = board.get_piece(pieces, box) if piece and piece.color != self.color and allow_capture: moves.append(move) break if not piece and allow_non_capture: moves.append(move) if step_limit and len(moves) >= step_limit: break else: break return moves
def run(self): while True: text = input('Click a box: ') if len(text) != 2 or not text[0] in columns or not int( text[1]) in list(range(1, 9)): print('Invalid box!') continue row = 8 - int(text[1]) column = columns.index(text[0]) box = board.get_box(row, column) self.callback(box)
def possible_moves(self, pieces): direction = -1 if self.color == PieceColor.WHITE else 1 steps = 2 if not self.has_moved else 1 moves = [] moves += self.step_possible(pieces, 0, direction, steps, False) moves += self.step_possible(pieces, 1, direction, 1, True, False) moves += self.step_possible(pieces, -1, direction, 1, True, False) if self.row == (3 if direction == -1 else 4): to_right = board.get_piece( pieces, board.get_box(self.row, self.column + 1)) if to_right and to_right.color != self.color and to_right.piece_type == PieceType.PAWN and to_right.can_be_en_passented: move = self.step_possible(pieces, 1, direction, 1, False)[0] move['capture'] = to_right moves.append(move) to_left = board.get_piece(pieces, board.get_box(self.row, self.column - 1)) if to_left and to_left.color != self.color and to_left.piece_type == PieceType.PAWN and to_left.can_be_en_passented: move = self.step_possible(pieces, -1, direction, 1, False)[0] move['capture'] = to_left moves.append(move) return moves
pygame.display.set_icon(screen_icon) clock = pygame.time.Clock() player1 = User(PieceColor.WHITE) player2 = SmartBot(PieceColor.BLACK) game = game.Game([player1, player2], BOX_WIDTH) while True: click = None for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() if event.type == pygame.MOUSEBUTTONDOWN: row = math.floor(event.pos[1] / BOX_WIDTH) column = math.floor(event.pos[0] / BOX_WIDTH) click = board.get_box(row, column) text_click = text_select.get_text_select() if text_click: click = text_click text_select.set_text_select(None) game.handle_turn(game.pieces, click) game.render(display_surface, BOX_WIDTH, colors.BLACK, colors.WHITE, font) pygame.display.update() clock.tick(FPS)