Проблемы с циклами while, вводом и строками в python

Я изучаю питон и отрабатываю свои навыки, создавая простую текстовую приключенческую игру.

В игре я хочу спросить игрока, готовы ли он начать. Я сделал это, создав функцию begin ():

def begin():

     print(raw_input("Are you ready to begin? > "))

     while raw_input() != "yes":
         if raw_input() == "yes":
            break
            print(start_adventure())
        else: 
            print("Are you ready to begin? > ")

print(begin())

ниже в моем коде есть функция start_adventure ()

def start_adventure():
     print("Test, Test, Test")

Когда я запускаю программу, она запускается, и я дохожу до того, что спрашивает, готов ли я начать. Затем он просто зацикливается бесконечно, и я могу выйти из программы, только если полностью закрою Powershell и перезапущу Powershell. Что я делаю не так? Как я могу остановить цикл после того, как игрок введет «да»?

Если вы дважды используете raw_input (), он будет искать два разных входа. Вам нужно вызвать raw_input () один раз, а затем назначить его переменной.

Zach 10.08.2018 16:40

Почему вы звоните raw_input три раза подряд? А что со всеми лишними звонками print?

melpomene 10.08.2018 16:40

я добавил: x = raw_input () while x! = 'yes': if x == 'yes': break print (start_adventure ()) else: print (raw_input ("Вы готовы начать?>")) Это все еще просто зацикливается бесконечно. Я не уверен, почему он не ломается, когда x == 'yes'

Jacquelynne Heiman 10.08.2018 16:49

@melpomene Я пытаюсь получить ввод от пользователя в виде строки. да или нет. Поэтому мне нужен цикл, чтобы взять эту информацию и использовать ее, чтобы остановить цикл или продолжить цикл. Как только цикл разорван, я хочу перейти к следующей функции.

Jacquelynne Heiman 10.08.2018 16:52

вам не нужен оператор break, уберите его. Изменение условия уже заставит код «вырваться» из цикла while. Вся суть циклов while в том, чтобы не нуждаться в операторе break. Это должно контролироваться условием цикла while, а не явным вызовом прерывания.

Redacted 10.08.2018 16:54

@ Отредактировано Не всегда. Фактически, одним из решений этой проблемы является использование while True: x=input(); if x != "tinsda": break, потому что вам не нужно инициализировать значение чем-то, что гарантированно не выполнит условие.

wizzwizz4 10.08.2018 16:56

Я исправился, но мне показалось, что op хочет иметь инициализированное значение, и для их конкретного потока программы это, похоже, вызывало проблемы. в любом случае лучше научиться инициализировать значения при запуске IMO. но все же ты прав.

Redacted 10.08.2018 16:58
2
7
4 705
3

Ответы 3

Решение Python 3

Вы не должны звонить raw_input() несколько раз. Просто создайте экземпляр x, а затем подождите, пока пользователь не введет Y для вызова вашей функции start_adventure. Это должно помочь вам начать:

def start_adventure():

    print('We have started!')
    #do something here


def begin():

    x = None

    while x!='Y':
        x = input('Are you ready to begin (Y/N)?')
        if x=='Y':
            start_adventure()

begin()

Здесь используется python3 вместо python2 (просто упоминание для op)

Overholt 10.08.2018 16:46
  1. Ваша функция ввода Raw (я предполагаю, что она работает правильно) никогда не назначается переменной. Вместо этого вы вызываете его в своем операторе печати, распечатываете его результат, а затем снова вызываете его в своем условии цикла while.

  2. На самом деле вы никогда не удовлетворяете условию цикла while, потому что ваш ввод не назначен переменной. Назначьте Raw_input («Вы готовы начать?>») Переменной для сохранения ввода. Затем цикл while с переменной. Убедитесь, что в вашем цикле while, когда условие выполнено, вы сбрасываете переменную на что-то еще.

  3. Ваш поток программы тоже неверен, вам нужно вызвать функцию необработанного ввода внутри цикла while. Это изменит условие цикла while, так что при выполнении условия (пользователь набирает «да») цикл не будет бесконечным. Надеюсь это поможет!

Пример того, что вам нужно в виде кода:

//initialize the condition to no value
condition = None;
#check the condition
while condition != "yes"
    #change the condition here based on user input **inside the loop**
    condition = raw_input("are you ready to begin? >")
    if condition == "yes":
        #condition is met do what you need
    else:
        #condition not met loop again 
        #nothing needs to go here to print the message again

Что вы ожидаете от этого? Решение вашей проблемы - попытаться понять, что делает код, а не просто собирать все вместе. (Не волнуйтесь, по крайней мере 80% из нас когда-то были на этой стадии!)

Кстати, я сильно рекомендую использовать Python 3 вместо Python 2; они сделали новую версию Python, потому что Python 2 был полон действительно странных, сбивающих с толку вещей, таких как input, вызывающий уязвимости безопасности, и 10 / 4, равный 2.


Что ты хочешь сделать?

  • Неоднократно спрашивайте пользователя, готовы ли они начать, пока он не ответит на "yes".
  • Позвоните в start_adventure().

Хорошо. Давайте поместим то, что у нас есть, в функцию:

def begin():
    while something:
        raw_input("Are you ready to begin? > ")

    start_adventure()

Здесь много пробелов, но это только начало. В настоящее время мы получаем ввод пользователя и выбрасываем его, потому что мы его нигде не сохраняем. Давай исправим это.

def begin():
    while something:
        answer = raw_input("Are you ready to begin? > ")

    start_adventure()

Это начинает обретать форму. Мы только хотим продолжать зацикливать while answer != "yes" ...

def begin():
    while answer != "yes":
        answer = raw_input("Are you ready to begin? > ")

    start_adventure()

Ура! Посмотрим, работает ли это!

Traceback (most recent call last):
  File "example", line 2, in <module>
    while answer != "yes":
NameError: name 'answer' is not defined

Хм ... Мы еще не установили значение для answer. Чтобы цикл работал, он должен быть чем-то, отличным от "yes". Пойдем с "no":

def begin():
    answer = "no"
    while answer != "yes":
        answer = raw_input("Are you ready to begin? > ")

    start_adventure()

Это будет работать!

Для кого-то вроде OP, который впервые пытается проработать это и понять логику, я подумал, что это отличное пошаговое руководство!

rahlf23 10.08.2018 16:53

@ rahlf23 Я решил начать отвечать на «простые» вопросы с помощью ответов, которые действительно помогут спрашивающему, а не учить их тому, что Stack Overflow - это волшебная маленькая коробочка, которая даст им весь код, который они хотят.

wizzwizz4 10.08.2018 16:54

Огромное спасибо!!! Это действительно поможет мне, и это поможет мне решить другие проблемы в будущем !!! Огромное спасибо!!!

Jacquelynne Heiman 10.08.2018 17:18

@JacquelynneHeiman Если это ответ на ваш вопрос, вы можете щелкнуть серую галочку под кнопками голосования в левом верхнем углу этого ответа. Если он превращается в зеленую галочку, это означает, что он отмечен как принятый ответ. Если вы сделаете это, я получу 15 очков репутации.

wizzwizz4 10.08.2018 17:24

Другие вопросы по теме