2016-10-03 4 views
0

Моя программа должна угадывать номер пользователя (от 1 до 8), задавая только 3 вопроса. Он правильно печатает первые два вопроса, но затем, когда я нажимаю клавишу ввода для третьего вопроса, он просто печатает последний вход, который я сделал. Как сделать все входы (да или нет) в нижнем регистре?гадание чисел от 1 до 8

# Simple Expert System 
#firstQuestion = prstr(firstQuestion.lower()) 

print("Think of a number between 1 and 8.") 

firstQuestion = (raw_input("Is it an even number? ")) 
secondQuestion = "Is it less than or equal to 4? " 
thirdQuestion = "Is it less than or equal to 3? " 
fourthQuestion = "Is it less than 3? " 
fifthQuestion = "Is it greater than 6? " 
sixthQuestion = "Is it greater than 5? " 
seventhQuestion = "Is it less than 2? " 




if firstQuestion == "yes": 
    print(raw_input(secondQuestion)) 
elif firstQuestion == "no": 
    print(raw_input(thirdQuestion)) 
elif secondQuestion == "yes": 
    print(raw_input(fourthQuestion)) 
elif secondQuestion == "no": 
    print(raw_input(fifthQuestion)) 
elif thirdQuestion == "no": 
    print(raw_input(sixthQuestion)) 
elif thirdQuestion == "yes": 
    print(raw_input(seventhQuestion)) 

elif fourthQuestion == "yes": 
    print("Your number is 2") 
elif fourthQuestion == "no": 
    print("Your number is 4") 

elif fifthQuestion == "yes": 
    print("Your number is 8") 
elif fifthQuestion == "no": 
    print("Your number is 6") 

elif sixthQuestion == "yes": 
    print("Your number is 7") 
elif sixthQuestion == "no": 
    print("Your number is 5")  

elif seventhQuestion == "yes": 
    print("Your number is 1") 
elif seventhQuestion == "no": 
    print("Your number is 3") 
+1

'elif' означает« еще если » – brianpck

+0

@brianpck и? Почему это не работает? Извините, я довольно новичок в python –

ответ

0

Сначала вы запрашиваете ввод по первому вопросу. Это помещает ответ в переменную firstQuestion. Затем вы заходите в if-section. Там вы запрашиваете raw_input для другого вопроса, а затем вы сообщаете программе распечатать это значение. В этот момент один из элитов был успешным, а остальные были пропущены.

Что вы должны сделать для желаемого результата, так это создать отдельную if-группу для каждого нового вопроса, который необходимо задать или создать цикл while.

Например:

# Simple Expert System 
#firstQuestion = prstr(firstQuestion.lower()) 

print("Think of a number between 1 and 8.") 

firstQuestion = (raw_input("Is it an even number? ")) 
secondQuestion = "Is it less than or equal to 4? " 
thirdQuestion = "Is it less than or equal to 3? " 
fourthQuestion = "Is it less than 3? " 
fifthQuestion = "Is it greater than 6? " 
sixthQuestion = "Is it greater than 5? " 
seventhQuestion = "Is it less than 2? " 




if firstQuestion == "yes": 
    secondQuestion = raw_input(secondQuestion) 
elif firstQuestion == "no": 
    thirdQuestion = raw_input(thirdQuestion) 

if secondQuestion == "yes": 
    fourthQuestion = raw_input(fourthQuestion) 
elif secondQuestion == "no": 
    fifthQuestion = raw_input(fifthQuestion) 

if thirdQuestion == "no": 
    sixthQuestion = raw_input(sixthQuestion) 
elif thirdQuestion == "yes": 
    seventhQuestion = raw_input(seventhQuestion) 

if fourthQuestion == "yes": 
    print("Your number is 2") 
elif fourthQuestion == "no": 
    print("Your number is 4") 

if fifthQuestion == "yes": 
    print("Your number is 8") 
elif fifthQuestion == "no": 
    print("Your number is 6") 

if sixthQuestion == "yes": 
    print("Your number is 7") 
elif sixthQuestion == "no": 
    print("Your number is 5")  

if seventhQuestion == "yes": 
    print("Your number is 1") 
elif seventhQuestion == "no": 
    print("Your number is 3") 
+0

спасибо! Я не знаю, почему я об этом не думал! :) –

+0

также как бы вы сделали это так, чтобы независимо от изменений ввода, это будет строчный регистр? так что ДА в конечном итоге будет да? –

+0

'if raw_input (question) .lower() ==" yes "' Вы также можете добавить '.strip()', чтобы избежать проблем с пробелами. – brianpck

0

Действительно ваша программа не может пойти дальше, чем второй вопрос,

if firstQuestion == "yes": 
    print(raw_input(secondQuestion)) 
elif firstQuestion == "no": 
    print(raw_input(thirdQuestion)) 

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

Вы должны написать программу думать о всех возможных сценариев и способы их достижения:

if firstQuestion == "yes": 
    #The user answered "yes" to the first question 
    if secondQuestion == "yes": 
     #The user answered "yes" to the first question and "yes" to the second 
    elif secondQuestion == "no": 
     #The user answered "yes" to the first question and "no" to the second 
elif firstQuestion == "no": 
    #The user answered "no" to the first question 
    #etc... 

продолжая этот график на всех уровнях, вы все сценарии вашей игры покрыты

+0

Хотя это ответ на вопрос, это все равно не очень хорошее решение. Рассмотрим это: что, если вам нужно написать программу, которая должна найти число от 1 до 1000? У вас будет лодка-нагрузка вложенных 'if's? Вот за что были изобретены петли! – acdr

+0

Абсолютно, я пытался показать структуру графика проблемы, используя вложенные условия, но это не способ сделать это для любой большой программы – JMat

0

Можете ли вы предоставить вход вы использовали?

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

Например, обратите внимание, как вы пишете:

firstQuestion = (raw_input("Is it an even number? ")) 
secondQuestion = "Is it less than or equal to 4? " 

Поскольку вы не назначена «raw_input ...» в «firstQuestion», «firstQuestion» больше не держит вопрос, но ответ на этот вопрос. Между этими линиями отсутствует согласованность. Это имело бы больше смысла делать что-то вроде:

firstQuestion = "Is it an even number? " 
secondQuestion = "Is it less than or equal to 4? " 
#put your other questions here 

firstAnswer = raw_input(firstQuestion) 
if firstAnswer == "yes": 
... 

Изменяя свою программу таким образом, как это, логика и в результате поведение будет более ясным.

6

Считайте, что ваша программа совсем не масштабируется для больших чисел: если вам нужно угадать число от 1 до 1000, вам придется написать много кода.

Вместо этого рассмотрит цикл через все диапазоны, которые вы можете получить:

lower_limit = 1 
upper_limit = 100 

while lower_limit < upper_limit: 
    middle = int(0.5 * (lower_limit + upper_limit)) 
    check = raw_input("Larger than " + str(middle) + "? ") 
    if check.lower().startswith("y"): # Accept anything that starts with a Y as "yes" 
     lower_limit = middle + 1 
    else: 
     upper_limit = middle 

print(lower_limit) 
0

Что там у вас на самом деле не использовать вход от любого из вопросов, за исключением первого. Например:

secondQuestion = "Is it less than or equal to 4? " 
# other stuff 
elif secondQuestion == "yes": # will never be true 

Calling raw_input(secondQuestion) не изменяет значение secondQuestion, он просто возвращает вклад.Что в вашем случае означает печать его во второй раз.

Кроме того, ваши elif s означает, что она будет проверять только до первого один не выходит так - так что если вы ответили 'yes' на первый вопрос, он печатает и запрашивает ввод второго вопроса, и там останавливается.

Что-то, что будет больше похоже на то, что вы хотите:

questions = [] 
questions.append("Is it an even number? ") 
questions.append("Is it less than or equal to 4? ") 
questions.append("Is it less than or equal to 3? ") 
questions.append("Is it less than 3? ") 
questions.append("Is it greater than 6? ") 
questions.append("Is it greater than 5? ") 
questions.append("Is it less than 2? ") 


answers = [raw_input(q) for q in questions] 
# Make sure to validate input 
while True: 
    if answers[0] == 'yes': 
     is_even = True 
     break 
    elif answers[0] == 'no': 
     is_even = False 
     break 
    else: 
     answers[0] = raw_input("Yes or no, please. ") 

# Now repeat that pattern with later questions 

while True: 
    if answers[1] == 'yes': 
     maximum = 4 
     break 
    elif answers[1] == 'no': 
     minimum = 5 
     break 
    else: 
     answers[1] = raw_input("Yes or no, please. ") 

# Continue collecting data like this for all questions, 
# Then use it at the end to get an answer 

Там, безусловно, более эффективный способ, чтобы сделать это - нет оснований Кодируют все вопросы, к примеру, это просто бинарный поиск - но это ближе к тому, что вы написали, чем тому.

+0

Хорошая идея, но не очень СУХОЙ. Для этого вам нужна функция. – brianpck

+1

@brianpck Ну, да, я сказал это внизу. Вопрос решает жестко кодировать все, проблема не связана с тем, что они все жестко закодировали, поэтому я пытаюсь сделать мое исправление более похожим на то, что они написали, так что связь между рабочим кодом и оригиналом легче увидеть. Я не хочу делать предположения о том, как далеко может произойти скачок интуиции, который они так рано изучают, как кажется. –

Смежные вопросы