突破了“ while”和“ for”的嵌套循环

问题描述 投票:0回答:2

[当我使用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
python loops for-loop nested-loops tic-tac-toe
2个回答
1
投票

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


0
投票

如果您想脱离嵌套的for循环,则应使用break语句(尤其是在实际代码中使用比range(1)更重复的内容时),如果没有,请使用[[and如果第一个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)难以阅读。
© www.soinside.com 2019 - 2024. All rights reserved.