Как остановить пока Loops в питоне? (я пробовал использовать перерыв)

1

Это мой первый пост о программировании! Люди, когда я выполняю этот алгоритм (игра с угадыванием), он не перестает спрашивать меня о большем количестве входов, даже когда я пишу "quit", который должен был оставить слово. Заказ "break" не работает, и я не могу понять, почему. Возможно, он работает, но когда он выходит из цикла, он запускает "startgame()" внизу, но мне нужно, чтобы "startgame()" внизу, чтобы запустить игру в первый раз, поскольку игра находится внутри функцию, и мне нужно вызвать ее, чтобы начать игру.

import random

def startgame():
    a = random.randint (1,10)
    cont = 0

    while True:
        b = input("Guess a number: ")
        if b == 'quit':
            break
        elif int(b) > a:
            print("Too high!")
            cont += 1
            True
        elif int(b) < a:
            print ("Too low!")
            cont += 1
            True
        elif int(b) == a:
            print ("You got it right!")
            print ('You needed ',cont,'guesses!')
            startgame()

startgame()

Любые идеи о том, как это решить?

Теги:
loops
while-loop
break

3 ответа

2

У вашего кода есть несколько небольших проблем, но он действительно работает, вы просто недостаточно тестировали, чтобы найти свою реальную проблему.

Проблемы:

  • что True линии ничего не делать, то не нужно их за while циклы; в while время while будет оценивать True право после него и цикл навсегда.
  • вы смешиваете одиночные и двойные кавычки для своих строк - это становится трудно читать и запутывать быстро, поэтому вам лучше использовать один стиль, желательно, какой бы PEP8 не рекомендовал. https://www.python.org/dev/peps/pep-0008/

Эта проблема:

  • ваш break работает отлично; попробуйте запустить свой скрипт и введите "quit" в первом приглашении, он прекратит работу, как ожидалось.
  • причина, по которой она не работает, заключается в том, что вы перезапустите всю игру, снова startgame функцию startgame после победы в игре. Это вызывает новый, вложенный вызов из игры (подумайте "В начало"), и когда игра прерывается, она заканчивается на предыдущем уровне.

Решение заключалось бы в том, чтобы удалить вызов startgame() и вместо этого обернуть все это за секунду, например, например:

import random


def startgame():
    b = 0
    while b != 'quit':
        a = random.randint(1, 10)
        cont = 0

        while True:
            b = input('Guess a number: ')
            if b == 'quit':
                break
            elif int(b) > a:
                print('Too high!')
                cont += 1
            elif int(b) < a:
                print('Too low!')
                cont += 1
            elif int(b) == a:
                print('You got it right!')
                print('You needed ', cont, 'guesses!')


startgame()
  • 0
    Этот код терпит неудачу в Python 2. Я считаю, что это та же проблема, что и оригинальный постер. Результатом является TypeError: int() argument must be a string or a number, not 'Quitter' .
  • 0
    Я согласен, что startgame вызов должен быть удален.
Показать ещё 2 комментария
0

В такие моменты я обычно использую простую управляющую переменную и запускаю на ней цикл. Например:

right_guess=False
while not right_guess:

а затем просто пойти

if guess=right:
    right_guess=True
    break 
0

просто удалите startgame() из цикла и замените его на разрыв

import random

def startgame():

    a = random.randint (1,10)
    cont = 0

    while True:
        b = input("Guess a number: ")
        if b == 'quit':
            break
        elif int(b) > a:
            print("Too high!")
            cont += 1

        elif int(b) < a:
            print ("Too low!")
            cont += 1

       elif int(b) == a:
            print ("You got it right!")
            print ('You needed ',cont,'guesses!')
            break # remove this break statement if you want to restart it again after winning  

startgame ()
  • 0
    Это несколько помогает, но меняет ход игры, когда он больше не перезапускается после победы.
  • 0
    если он хочет перезапустить его после победы, значит, он может удалить оператор перерыва

Ещё вопросы

Сообщество Overcoder
Наверх
Меню