Seite 1 von 1
Selber Raten vom Computer
Verfasst: Dienstag 24. Januar 2006, 14:25
von Thyestes
Hallo,
ich habe eine kleine (für mich irgendwie schwere) Aufgabe:
Wie muss ich das untenstehende Programm ändern, damit der Computer eine Zahl randomiert und der Nutzer diese Zahl rät. Angeblich soll man nur 2-3 Zeilen ändern müssen, aber ich komme einfach nicht drauf.
Danke im Voraus
Code: Alles auswählen
import random
def intro():
print """
Denke dir eine Zahl zwischen 1 und 100 aus.
Ich werde versuchen, diese Zahl zu erraten.
Gib ein:
+ , wenn mein Tipp zu klein ist.
- , wenn mein Tipp zu groß ist.
= , wenn mein Tipp stimmt.
Hast du deine Zahl? Dann drücke die Eingabetaste!
"""
irgendwas = raw_input()
def cspiel():
intro()
unten, oben = 1, 100
erraten = 0
versuche = 0
while not erraten:
versuche = versuche + 1
tipp = random.randint(unten,oben)
frage = "Ist deine Zahl %d? " % tipp
antwort = raw_input(frage)
if antwort == "+":
unten = tipp+1
elif antwort == "-":
oben = tipp-1
elif antwort == "=":
erraten = 1
else:
print "Das ist eine ungültige Antwort!"
print "Antworte mit +/=/-"
versuche = versuche - 1
if unten == oben:
tipp = unten
erraten = 1
print
print "Deine Zahl ist %d!" % tipp
print ("Ich habe mit %d Fragen herausgefunden,welche Zahl du dir überlegt hast. Dies ist: "
% versuche)
if versuche==1:
print("Super")
if versuche==2:
print("Super")
if versuche==3:
print("Sehr gut")
if versuche==4:
print("Sehr gut")
if versuche==5:
print("Gute Leistung")
if versuche==6:
print("Mittelmäßige Leistung")
if versuche==7:
print("Mittelmäßige Leistung")
if versuche==8:
print("Mittelmäßige Leistung")
if versuche>8:
print("Schwache Leistung")
print
def zahlenraten():
print " Z A H L E N R A T E N"
print " ====================="
print
weiterspielen = True
while weiterspielen:
cspiel()
if raw_input("Wiederholen Ja/Nein ?") != 'Ja':
weiterspielen = False
print
print "Ich hoffe, du hattest Spaß mit mir!"
if __name__ == "__main__":
zahlenraten()
Verfasst: Dienstag 24. Januar 2006, 14:27
von modelnine
Ganz so einfach ist es nicht... Du mußt vor allen Dingen vorsehen dass der Benutzer eine Zahl eingibt und nicht "+", "-" und "=", und dann diese Zahl entsprechend interpretieren.
--- Heiko.
Verfasst: Dienstag 24. Januar 2006, 14:38
von jens
Jup. Such mal im Forum nach raw_input und int

Verfasst: Dienstag 24. Januar 2006, 14:58
von Thyestes
Das Prog zeigt jetzt keinen Fehler an, aber jedesmal bekomme ich : " Deine Zahl, die du dir ausgedacht hast ist zu groß"
[
Code: Alles auswählen
import random
def intro():
print """
Eine Zahl zwischen 1 und 100 denke ich mir nun aus. Du musst diese erraten oder auch eben nicht
Bereit? Dann drücke die Eingabetaste!
"""
irgendwas = raw_input()
def cspiel():
intro()
unten, oben = 1, 100
zahl= random.randint(unten,oben)
erraten = 0
versuche = 0
while not erraten:
versuche = versuche + 1
tipp = "Rate nun eine Zahl zwischen 1 und 100 "
antwort = input(tipp)
if tipp == zahl:
erraten = 1
elif tipp < zahl:
print " Deine Zahl, die du dir ausgedacht hast ist zu klein"
elif tipp > zahl:
print " Deine Zahl, die du dir ausgedacht hast ist zu groß"
print
print
print ("Du hast mit %d Fragen herausgefunden,welche Zahl mein Speicher sich randomiert hat. Dies ist: "
% versuche)
if versuche==1:
print("Super")
if versuche==2:
print("Super")
if versuche==3:
print("Sehr gut")
if versuche==4:
print("Sehr gut")
if versuche==5:
print("Gute Leistung")
if versuche==6:
print("Mittelmäßige Leistung")
if versuche==7:
print("Mittelmäßige Leistung")
if versuche==8:
print("Mittelmäßige Leistung")
if versuche>8:
print("Schwache Leistung")
print
def zahlenraten():
print " Z A H L E N R A T E N"
print " ====================="
print
weiterspielen = True
while weiterspielen:
cspiel()
if raw_input("Wiederholen Ja/Nein ?") != 'Ja':
weiterspielen = False
print
print "Ich hoffe, du hattest Spaß mit mir!"
if __name__ == "__main__":
zahlenraten()
Verfasst: Dienstag 24. Januar 2006, 15:24
von jens
Thyestes hat geschrieben:Dateien\Sarah.py", line 16, in cspiel
frage = "Rate nun eine Zahl zwischen 1 und 100 " % tipp
NameError: global name 'tipp' is not defined
Bin ich blind, oder kommt die Zeile überhaupt nicht in deinem Skript vor???
Das "% tipp" macht auch keinen Sinn, weil in dem Skript überhaupt kein String-Operator-Platzhalter ist...
Verfasst: Dienstag 24. Januar 2006, 15:27
von Thyestes
Habe meinen Beitrag ediert, ohne es zu vermerken- sorry
Verfasst: Dienstag 24. Januar 2006, 15:29
von jens
Du machst
antwort = input(tipp) mach darunter mal ein
print type(antwort)
Du brauchst das hier:
http://www.python.org/doc/current/lib/b ... tml#l2h-39
Verfasst: Dienstag 24. Januar 2006, 15:39
von Thyestes
das argument ist doch aber kein String , sondern eine zahl(oder spinn ich?)
habe es eingebaut, bringt aber nichts
Code: Alles auswählen
import random
def intro():
print """
Eine Zahl zwischen 1 und 100 denke ich mir nun aus. Du musst diese erraten oder auch eben nicht
Bereit? Dann drücke die Eingabetaste!
"""
irgendwas = raw_input()
def cspiel():
intro()
zahl= random.randint(1,100)
erraten = 0
versuche = 0
while not erraten:
versuche = versuche + 1
tipp = "Rate nun eine Zahl zwischen 1 und 100 "
antwort = input(tipp)
print type(antwort)
if tipp == zahl:
erraten = 1
elif tipp < zahl:
print " Deine Zahl, die du dir ausgedacht hast ist zu klein"
elif tipp > zahl:
print " Deine Zahl, die du dir ausgedacht hast ist zu groß"
print
print
print ("Du hast mit %d Fragen herausgefunden,welche Zahl mein Speicher sich randomiert hat. Dies ist: "
% versuche)
if versuche==1:
print("Super")
if versuche==2:
print("Super")
if versuche==3:
print("Sehr gut")
if versuche==4:
print("Sehr gut")
if versuche==5:
print("Gute Leistung")
if versuche==6:
print("Mittelmäßige Leistung")
if versuche==7:
print("Mittelmäßige Leistung")
if versuche==8:
print("Mittelmäßige Leistung")
if versuche>8:
print("Schwache Leistung")
print
def zahlenraten():
print " Z A H L E N R A T E N"
print " ====================="
print
weiterspielen = True
while weiterspielen:
cspiel()
if raw_input("Wiederholen Ja/Nein ?") != 'Ja':
weiterspielen = False
print
print "Ich hoffe, du hattest Spaß mit mir!"
if __name__ == "__main__":
zahlenraten()
Verfasst: Dienstag 24. Januar 2006, 15:41
von mr.hide
Über die Kommandozeile Eingelesenes wird immer als string betrachtet.
Mach doch einfach einen typecast.
Verfasst: Dienstag 24. Januar 2006, 15:43
von jens
Du hast recht, es ist eine Zahl.... Aber input scheint mir nicht so brauchbar zu sein (generell nicht) denn
aus der Doku ist zu lesen:
Equivalent to eval(raw_input(prompt)). Warning: This function is not safe from user errors!
Also besser:
Und das ganze noch in eine try-except einschließen, falls keine Zahl eingegebnen wurde...
Verfasst: Dienstag 24. Januar 2006, 15:51
von Thyestes
ging auch ncht. Jetzt habe ich es einfacher gemacht, so wie ich es gelernt habe. Und siehe da, es funktioniert.Danke an alle
Code: Alles auswählen
import random
def intro():
print """
Eine Zahl zwischen 1 und 100 denke ich mir nun aus. Du musst diese erraten oder auch eben nicht
Bereit? Dann drücke die Eingabetaste!
"""
irgendwas = raw_input()
def cspiel():
intro()
zahl= random.randint(1,100)
erraten = 0
versuche = 0
while not erraten:
versuche = versuche + 1
tipp = input ("Rate nun eine Zahl zwischen 1 und 100 ")
if tipp == zahl:
erraten = 1
elif tipp < zahl:
print " Deine Zahl, die du dir ausgedacht hast ist zu klein"
elif tipp > zahl:
print " Deine Zahl, die du dir ausgedacht hast ist zu groß"
print
print
print ("Du hast mit %d Fragen herausgefunden,welche Zahl mein Speicher sich randomiert hat. Dies ist: "
% versuche)
if versuche==1:
print("Super")
if versuche==2:
print("Super")
if versuche==3:
print("Sehr gut")
if versuche==4:
print("Sehr gut")
if versuche==5:
print("Gute Leistung")
if versuche==6:
print("Mittelmäßige Leistung")
if versuche==7:
print("Mittelmäßige Leistung")
if versuche==8:
print("Mittelmäßige Leistung")
if versuche>8:
print("Schwache Leistung")
print
def zahlenraten():
print " Z A H L E N R A T E N"
print " ====================="
print
weiterspielen = True
while weiterspielen:
cspiel()
if raw_input("Wiederholen Ja/Nein ?") != 'Ja':
weiterspielen = False
print
print "Ich hoffe, du hattest Spaß mit mir!"
if __name__ == "__main__":
zahlenraten()
Verfasst: Dienstag 24. Januar 2006, 16:08
von jens
Also ich würde allerdings wirklich kein input nehmen!!!
Tausch doch das mal aus:
Code: Alles auswählen
while not erraten:
versuche = versuche + 1
tipp = input ("Rate nun eine Zahl zwischen 1 und 100 ")
if tipp == zahl:
erraten = 1
elif tipp < zahl:
print " Deine Zahl, die du dir ausgedacht hast ist zu klein"
elif tipp > zahl:
print " Deine Zahl, die du dir ausgedacht hast ist zu groß"
mit
Code: Alles auswählen
while 1:
versuche = versuche + 1
try:
tipp = int(raw_input("Rate nun eine Zahl zwischen 1 und 100 "))
except:
print "Bitte nur Zahlen eingeben!"
else:
if tipp == zahl:
break
elif tipp < zahl:
print " Deine Zahl, die du dir ausgedacht hast ist zu klein"
elif tipp > zahl:
print " Deine Zahl, die du dir ausgedacht hast ist zu groß"
Verfasst: Dienstag 24. Januar 2006, 16:15
von Thyestes
danke. habe es eben geändert. Sieht viel besser aus.
Verfasst: Dienstag 24. Januar 2006, 16:16
von jens
Ach und noch ein Tip... Teile dein Programm in kleinere Häpchen auf Funktionen auf! So das du ganz unten nur noch eine Funktion nach der anderen starten brauchst... So wird alles viel übersichtlicher als es jetzt ist!
Verfasst: Dienstag 24. Januar 2006, 17:46
von modelnine
Hier mal meine "quick and dirty"-Implementierung des ganzen... Vielleicht kannst Du da ja noch was draus lernen.
Code: Alles auswählen
# -*- coding: iso-8859-15 -*-
import random
minzahl = 1
maxzahl = 100
meinezahl = random.randrange(minzahl,maxzahl)
i = 0
while True:
try:
val = int(raw_input("Dein Vorschlag? "))
if not minzahl <= val <= maxzahl:
raise ValueError
i += 1
except ValueError:
print "Bitte einen gültigen Vorschlag eingeben..."
continue
if val < meinezahl:
print "Meine Zahl ist größer..."
elif val > meinezahl:
print "Meine Zahl ist kleiner..."
else:
break
print "Danke für's Raten nach %s Versuchen!" % i
if i in (1,2):
print "Super"
elif i in (3,4):
print "Sehr gut"
elif i == 5:
print "Gute Leistung"
elif i in (6,7,8):
print "Mittelmäßige Leistung"
else:
print "Schwache Leistung"
--- Heiko.
Verfasst: Dienstag 24. Januar 2006, 20:05
von jens
Und hier mal meine Variante verteilt auf ein paar Funktionen:
Code: Alles auswählen
#!/usr/bin/python
# -*- coding: utf-8 -*-
import random
minzahl = 1
maxzahl = 100
meinezahl = random.randrange(minzahl,maxzahl)
def raten():
i = 0
while True:
try:
val = int(raw_input("Dein Vorschlag? "))
if not minzahl <= val <= maxzahl:
raise ValueError
i += 1
except ValueError:
print "Bitte einen gültigen Vorschlag eingeben..."
continue
if val < meinezahl:
print "Meine Zahl ist größer..."
elif val > meinezahl:
print "Meine Zahl ist kleiner..."
else:
break
return i
def ende(i):
print "Danke für's Raten nach %s Versuchen!" % i
if i in (1,2):
print "Super"
elif i in (3,4):
print "Sehr gut"
elif i == 5:
print "Gute Leistung"
elif i in (6,7,8):
print "Mittelmäßige Leistung"
else:
print "Schwache Leistung"
def wiederholen():
try:
i = raw_input("Wiederholen Ja/Nein ?").lower()
except:
return False
if i in ("ja","j","y"):
return True
else:
return False
if __name__ == "__main__":
while True:
versuche = raten()
ende(versuche)
if not wiederholen():
break
Die Ja/Nein Abfrage kann man sicherlich noch ein wenig kürzer gestalten...
Verfasst: Mittwoch 25. Januar 2006, 15:38
von Thyestes
Vielen Dan für die Mühe. Eure programmgefehle sind einleuchent, aber man muss erst mal darauf kommen. Vor allem mit dem :
Code: Alles auswählen
if i in (1,2):
print "Super"
elif i in (3,4):
print "Sehr gut"
elif i == 5:
print "Gute Leistung"
elif i in (6,7,8):
print "Mittelmäßige Leistung"
else:
print "Schwache Leistung"