Выход из вложенных l oop из 'while' и 'for' - PullRequest
0 голосов
/ 26 мая 2020

Когда я использую game_on= False, он должен завершить игру (завершить while l oop), но я обнаружил, что 2-й для l oop выполняется с выводом «Введите позицию» . Я хочу выйти из этого вложенного l oop (и завершить игру), когда if l oop оценивается как True. Я также использовал оператор break в if l oop, но нашел тот же результат.

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

Ответы [ 2 ]

1 голос
/ 26 мая 2020

Когда вы используете break внутри оператора if, вы также находитесь внутри for-l oop, так что вы просто нарушаете for-l oop. break выходит только из самого внутреннего l oop (в случае вложенных циклов), которое он может найти. Что вам нужно, так это использовать break, когда это while-l oop, из которого вы хотите выйти, является первым l oop 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 голосов
/ 26 мая 2020

Если вы хотите выйти из вложенного for l oop, вы должны использовать оператор break (особенно если вы используете что-то более повторяющееся, чем range(1) в вашем реальном коде), и если вы не хотите, чтобы второй для l oop выполнялся, если первый для l oop устанавливает 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):
        .
        .

Однако это часто приводит к коду, который трудно поддерживать и / или читать, и есть несколько альтернативных стратегий, которые могут быть лучше в зависимости от обстоятельств и остальной части кода :

1) уменьшить секунду для l oop выполнение

Вы можете использовать одну переменную как для управления выходом из while, так и для предотвращения выполнения второй для l oop:

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) использовать функцию и ее возвращаемое значение для выхода из внешнего l oop:

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')

Также следует учитывать э-э, используя какой-либо инструмент форматирования кода (например, черный или мою версию этого инструмента oitnb ), так как ваш последний оператор if имеет отступ только на 3 позиции, и в целом не хватает места, делает ваш код (IMO) трудным для чтения.

...