2016-10-03 2 views
0

Mein Programm muss die Nummer des Benutzers erraten (von 1 bis 8), indem nur 3 Fragen gestellt werden. Es druckt die ersten zwei Fragen richtig, aber wenn ich dann für die dritte Frage die Eingabetaste drücke, druckt es nur die letzte Eingabe, die ich gemacht habe. Wie werden alle Eingaben (ja oder nein) in Kleinbuchstaben gemacht?Erraten von Zahlen von 1 bis 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' bedeutet" sonst wenn " – brianpck

+0

@brianpck und? Warum funktioniert es nicht? Entschuldigung, ich bin ziemlich neu zu Python –

Antwort

0

Zuerst fragen Sie nach der Eingabe der ersten Frage. Dies bringt die Antwort in die firstQuestion-Variable. Dann gehst du in die Wenn-Sektion. Dort fragen Sie nach dem raw_input für eine andere Frage und dann sagen Sie dem Programm, diesen Wert zu drucken. An diesem Punkt war einer der Elifs erfolgreich und die anderen wurden übersprungen.

Was Sie für das gewünschte Ergebnis tun sollten, ist eine separate If-Gruppe für jede neue Frage zu erstellen, die gestellt werden sollte, oder eine While-Schleife zu erstellen.

Zum Beispiel:

# 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

danke! Ich weiß nicht, warum ich nicht daran gedacht habe! :) –

+0

auch wie würden Sie es so machen, dass, was auch immer die Variationen der Eingabe sind, wird es Kleinbuchstaben sein? also würde JA am ​​Ende ja sein? –

+0

'if raw_input (question) .lower() ==" yes "' Sie können auch '.strip()' hinzufügen, um nachfolgende Leerzeichen zu vermeiden. – brianpck

0

Tat Ihr Programm nicht weiter als die zweite Frage gehen,

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

ob ich ja oder nein antworten auf die erste Frage, der Code wird in einem dieser beiden Fälle gehen, und Daher kann ich nicht zum Rest Ihres Programms gehen.

Sie haben Ihr Programm Denken aller möglichen Szenarien zu schreiben und wie sie zu erreichen:

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... 

durch diese Grafik auf allen Ebenen fortgesetzt, Sie haben alle Szenarien des Spiels abgedeckt

+0

Während dies eine Antwort auf die Frage ist, ist es immer noch nicht eine nette Lösung. Bedenken Sie Folgendes: Was ist, wenn Sie ein Programm schreiben müssen, das eine Zahl zwischen 1 und 1000 finden soll? Werden Sie eine Bootsladung von verschachtelten 'if's haben? Dafür wurden Loops erfunden! – acdr

+0

Absolut, ich habe versucht, die Graphenstruktur des Problems durch verschachtelte Bedingungen zu zeigen, aber es ist nicht die Art, es für jedes große Programm zu tun – JMat

0

Können Sie die Eingabe, die Sie verwendet?

Es ist nicht notwendig, obwohl, wie ich denke, Verbesserung der Struktur dieses Programms würde dazu beitragen, Ihre Frage zu beantworten.

Zum Beispiel darauf, wie Sie schreiben:

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

Da Sie vergeben die „raw_input ...“ bis „firstQuestion“, „firstQuestion“ nicht mehr die Frage, hält aber die Antwort auf die Frage. Es besteht ein Mangel an Übereinstimmung zwischen diesen Zeilen. Es würde mehr Sinn machen, etwas zu tun wie:

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": 
... 

Durch Ihr Programm in einer Weise, wie dies zu ändern, die Logik und die daraus resultierende Verhalten wird klarer sein.

6

Beachten Sie, dass Ihr Programm bei größeren Zahlen nicht gut skaliert: Wenn Sie eine Zahl zwischen 1 und 1000 erraten müssen, müssen Sie eine Menge Code schreiben.

Stattdessen betrachten durch alle Bereiche Looping, die Sie erhalten könnten:

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

Was du hast es tatsächlich nicht die Eingabe von einem der Fragen mit Ausnahme der ersten verwenden. Zum Beispiel:

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

raw_input(secondQuestion) Aufruf nicht den Wert von secondQuestion ändern, es gibt nur die Eingabe.Was in Ihrem Fall bedeutet, es ein zweites Mal zu drucken.

Auch Ihre elif s bedeuten, dass es nur überprüfen wird, bis die erste wahr kommt - also, wenn Sie die erste Frage beantwortet , es druckt und fordert die Eingabe für die zweite Frage, und stoppt dort.

Etwas, das mehr sein würde wie das, was Sie wollen:

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 

Es ist auf jeden Fall eine effizientere Art und Weise, es zu tun - keinen Grund, alle Fragen zu codieren, zum Beispiel, es ist nur eine binäre Suche - aber die ist näher an dem, was Sie geschrieben haben.

+0

Gute Idee, aber nicht sehr trocken. Sie würden eine Funktion dafür wünschen. – brianpck

+1

@brianpck Nun, ja, das habe ich ganz unten gesagt. Der Fragesteller beschließt, alles hart zu kodieren, das Problem hängt nicht wirklich damit zusammen, dass sie alles fest codierten, also versuche ich, meinen Fix so zu machen, wie es geschrieben wurde, damit die Beziehung zwischen dem Arbeitscode und dem Original leichter zu sehen ist. Ich möchte keine Vermutungen darüber anstellen, inwieweit jemand einen Sprung in die Intuition machen kann, wenn er so früh lernt, wie es scheint. –

Verwandte Themen