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) :wink:

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.

Code: Alles auswählen

antwort = int(raw_input("zahl:"))

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:

Code: Alles auswählen

antwort = int(raw_input(tipp))
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"