python3实现递归与c是一样的,无非就是某个函数自己调用自己而已。我写了个可以随时判断黑白棋手五子棋博弈时,黑棋的某次着子是否会导致黑棋获胜。第一步:采用递归的方式直接找到与当前着子位置有最邻近并且已经被着黑子的位置,然后基于这些位置,再递归的寻找。最后寻找到所有的“链路”。第二步:我们可基于当前黑棋的着子位置,找到可以使得黑棋获胜的所有情况,就8种。第三步:很简单,直接判断就可以了。
代码如下:
def get_closed_positions(board_status, cur_pos, size): """ 得到当前棋子最邻近的位置,并且得到这些位置的着子情况 :param board_status: 当前棋盘状态 :param cur_pos: 当前位置坐标 :param size: 棋盘大小 :return: """ def select(pos): if board_status.get(pos) == 1: # 黑棋 pos_list.append(pos) pos_list = [] pos_x, pos_y = cur_pos # 正上方 if pos_y - 1 >= 0: select((pos_x, pos_y - 1)) # 正下方 if pos_y + 1 < size: select((pos_x, pos_y + 1)) # 左边 if pos_x - 1 >= 0: select((pos_x - 1, pos_y)) # 右边 if pos_x + 1 < size: select((pos_x + 1, pos_y)) print('return pos_list:', pos_list) return pos_list def check_win(size, board_status, start_point): """ :param size: :param board_status: :param start_point: :return: """ pos_list = get_closed_positions(board_status, start_point, size) if len(black_point) == 0: black_point.extend(pos_list) else: pos_list = list(set(pos_list).difference(set(black_point))) # list求差集 black_point.extend(pos_list) print('black_point:', black_point) if len(pos_list) > 0: print('pos_list:', pos_list) for cur_parent_point in pos_list: # 得到已经着过子的父节点 check_win(size, board_status, cur_parent_point) return def create_dtynamic_points(size, start): all_path = [] if start[1] - 4 >= 0: all_path.append([(start[0], start[1] - index) for index in range(1, 5, 1)]) if start[1] + 4 < size: all_path.append([(start[0], start[1] + index) for index in range(1, 5, 1)]) if start[0] + 4 < size: all_path.append([(start[0] + index, start[1]) for index in range(1, 5, 1)]) if start[0] - 4 >= 0: all_path.append([(start[0] - index, start[1]) for index in range(1, 5, 1)]) if (start[1] - 4 >= 0) and (start[0] + 4 < size): all_path.append([(start[0] + index, start[1] - index) for index in range(1, 5, 1)]) if (start[1] - 4 >= 0) and (start[0] - 4 >= 0): all_path.append([(start[0] - index, start[1] - index) for index in range(1, 5, 1)]) if (start[1] + 4 < size) and (start[0] - 4 >= 0): all_path.append([(start[0] - index, start[1] + index) for index in range(1, 5, 1)]) if (start[1] + 4 < size) and (start[0] + 4 < size): all_path.append([(start[0] + index, start[1] + index) for index in range(1, 5, 1)]) return all_path if __name__ == '__main__': global black_point black_point = [] board = dict() size = 15 for row in range(size): for col in range(size): board.update({(row, col): 0}) board.update({(2, 3): 1}) board.update({(2, 2): 1}) board.update({(2, 1): 1}) board.update({(3, 2): 1}) board.update({(2, 0): 1}) board.update({(4, 1): 1}) board.update({(5, 0): 1}) board.update({(3, 3): 1}) board.update({(4, 2): 1}) board.update({(5, 1): 1}) board.update({(6, 0): 1}) check_win(6, board, (2, 4)) # 然后判断是否赢。 dynamic_point = create_dtynamic_points(6, (2, 4)) print('dynamic_point:', dynamic_point) log = '黑棋选手输' for cur_points in dynamic_point: if cur_points[0] in black_point: log = '黑棋选手赢......' break print('log:', log)
结果:
dynamic_point: [[(2, 3), (2, 2), (2, 1), (2, 0)]] log: 黑棋选手赢......当然,程序像这样写,效率不高,可以写的很简洁,不过我这也是写给别人看的,要求低,尽量简单。