Selber Raten vom Computer

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Thyestes
User
Beiträge: 23
Registriert: Dienstag 10. Januar 2006, 22:38

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()
Zuletzt geändert von Thyestes am Dienstag 24. Januar 2006, 14:30, insgesamt 1-mal geändert.
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

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.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Jup. Such mal im Forum nach raw_input und int :)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Thyestes
User
Beiträge: 23
Registriert: Dienstag 10. Januar 2006, 22:38

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()
Zuletzt geändert von Thyestes am Dienstag 24. Januar 2006, 15:29, insgesamt 1-mal geändert.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Thyestes
User
Beiträge: 23
Registriert: Dienstag 10. Januar 2006, 22:38

Habe meinen Beitrag ediert, ohne es zu vermerken- sorry
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Thyestes
User
Beiträge: 23
Registriert: Dienstag 10. Januar 2006, 22:38

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()


mr.hide
User
Beiträge: 108
Registriert: Montag 29. August 2005, 14:02

Über die Kommandozeile Eingelesenes wird immer als string betrachtet.

Mach doch einfach einen typecast.

Code: Alles auswählen

antwort = int(raw_input("zahl:"))
Grüße
Matthias

- Fluchen befreit von Kummer und Leid -
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Thyestes
User
Beiträge: 23
Registriert: Dienstag 10. Januar 2006, 22:38

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()


Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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ß"

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Thyestes
User
Beiträge: 23
Registriert: Dienstag 10. Januar 2006, 22:38

danke. habe es eben geändert. Sieht viel besser aus.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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!

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

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.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Thyestes
User
Beiträge: 23
Registriert: Dienstag 10. Januar 2006, 22:38

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"
Antworten