【问题标题】:Breaking out of the nested loop of 'while' and 'for'打破'while'和'for'的嵌套循环
【发布时间】:2020-05-26 03:18:09
【问题描述】:

当我使用game_on= False 时,它应该结束游戏(结束while 循环),但我发现执行第二个for 循环时输出“输入位置”。 当 if 循环被评估为 True 时,我想退出这个嵌套循环(并结束游戏)。我也在 if 循环中使用了 break 语句,但我发现了相同的结果。

game_on=True
while game_on:
    for i in range(1):
        position=int(input("Enter your position"))
        place_marker(game_board,p1_marker,position)
        display_board(game_board)
        if win_check(game_board,p1_marker):
            print("Player 1 wins")
            game_on=False


    for i in range(1):
        position=int(input("Enter your position"))
        place_marker(game_board,p2_marker,position)
        display_board(game_board)
        if win_check(game_board,p2_marker):
           print("Player 2 wins")
           game_on=False

【问题讨论】:

  • 你为什么还要在这里使用for 循环?循环将i 设置为0,运行一次,然后退出。如果您只是删除它们,并在game_on = False 之后添加break,它就可以工作(并且game_on 本身可能会被删除,这取决于您的其他逻辑)。

标签: python loops for-loop nested-loops tic-tac-toe


【解决方案1】:

当您在 if 语句中使用 break 时,您也处于 for 循环中,因此您只是打破了 for 循环。 break 只退出它可以找到的最内层循环(在嵌套循环的情况下)。你需要的是使用break,当你想退出的while循环是你运行它时break会找到的第一个循环。

game_on=True
while game_on:
    for i in range(1):
        ....
        if win_check(game_board,p1_marker):
            print("Player 1 wins")
            game_on=False
    if(not game_on):
        break

    for i in range(1):
        ...

【讨论】:

    【解决方案2】:

    如果你想跳出嵌套的 for 循环,你应该使用 break 语句(特别是如果你在真实代码中使用比 range(1) 更重复的东西),并且如果如果第一个 for 循环设置为 game_on = False,您不希望执行第二个 for 循环,那么您需要在此之前额外中断:

    game_on = True
    while game_on:
        for i in range(1):
            position = int(input("Enter your position"))
            place_marker(game_board,p1_marker,position)
            display_board(game_board)
            if win_check(game_board,p1_marker):
                print("Player 1 wins")
                game_on = False
                break
        if not game_on:
            break
        for i in range(1):
            .
            .
    

    然而,这通常会导致代码难以维护和/或阅读,并且有几种替代策略可能会更好取决于环境和代码的其余部分

    1) 减少循环执行的秒数

    您可以使用一个变量来控制 while 的退出并防止第二个 for 循环执行:

    test_times = 1
    while test_times > 0:
        for i in range(test_times):
            position = int(input("Enter your position"))
            place_marker(game_board,p1_marker,position)
            display_board(game_board)
            if win_check(game_board,p1_marker):
                print("Player 1 wins")
                test_times = 0
                break
        for i in range(test_times):
            .
            .
    

    2) 使用函数并从嵌套循环中返回

    def game():
        while True:
            for i in range(1):
                position = int(input("Enter your position"))
                place_marker(game_board,p1_marker,position)
                display_board(game_board)
                if win_check(game_board, p1_marker):
                    print("Player 1 wins")
                    return
            for i in range(1):
                .
                .
    
    game()
    

    3) 使用函数及其返回值退出外循环:

    def game_on():
        for i in range(1):
            position = int(input("Enter your position"))
            place_marker(game_board,p1_marker, position)
            display_board(game_board)
            if win_check(game_board, p1_marker):
                print("Player 1 wins")
                return False
        for i in range(1):
            position=int(input("Enter your position"))
            place_marker(game_board,p2_marker,position)
            display_board(game_board)
            if win_check(game_board,p2_marker):
                print("Player 2 wins")
                return False
        return True
    
    while game_on():
        pass
    

    4) 引发异常以跳出嵌套循环

    class GameOver(Exception):
        pass
    
    try:
        while True:
            for i in range(1):
                position = int(input("Enter your position"))
                place_marker(game_board,p1_marker,position)
                display_board(game_board)
                if win_check(game_board, p1_marker):
                    raise GameOver(1)
            for i in range(1):
                .
                .
    
    except GameOver as e:
        print(f'Player {e} wins')
    

    您还应该考虑使用一些代码格式化工具(例如black,或我的该工具版本oitnb),因为您的最终if 语句仅缩进3 个位置,并且通常缺少空间使您的代码(IMO)难以阅读。

    【讨论】:

    • 感谢这个美丽的解释。我的一切都在我的轨道上。谢谢
    • @BalabhadraChand 如果这解决了您的问题,请将其视为已接受的答案(单击答案左侧的 v 标记),这样其他人就知道您的问题已解决,以及提供的答案解决方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-10
    • 1970-01-01
    • 1970-01-01
    • 2012-01-19
    • 2012-11-30
    • 2011-10-22
    相关资源
    最近更新 更多