python借助递归思想判断当前黑棋着子时,黑棋是否胜出

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: 黑棋选手赢......
当然,程序像这样写,效率不高,可以写的很简洁,不过我这也是写给别人看的,要求低,尽量简单。
                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值