繁体   English   中英

打破'while'和'for'的嵌套循环

[英]Breaking out of the nested loop of 'while' and 'for'

当我使用game_on= False时,它应该结束游戏(结束 while 循环),但我发现第二个 for 循环是使用“输入位置”的 output 执行的。 当 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

当你在 if 语句中使用break时,你也在一个 for 循环中,所以你只是打破了 for 循环。 break只退出它可以找到的最内层循环(在嵌套循环的情况下)。 当您要退出的while循环是您运行它时会发现的第一个循环break时,您需要使用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):
        ...

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

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):
        .
        .

然而,这通常会导致代码难以维护和/或阅读,并且根据情况和代码的 rest,有几种替代策略可能会更好:

1)减少第二个for循环执行

您可以使用一个变量来控制 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)使用 function 并从嵌套循环返回

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)使用 function 及其返回值退出外循环:

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) 难以阅读。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM