input auf ganze Zahlen prüfen

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
andreas--surf
User
Beiträge: 5
Registriert: Sonntag 12. November 2017, 11:20

Wird ausgeführt in Python Schell 3.3.3

Hallo, mit Hilfe eines Buches habe ich ein kleines Programm geschrieben, welches ich jetzt weiter anpasse um zu lernen. Ich bin gestern angefangen zu programmieren. Was ich geschrieben habe, verstehe ich soweit. Ich möchte gerne das die Eingabe geprüft wird, >>>>tuer = input("1,2 oder 3?") ob eine ganze Zahl eingegeben wird, also kein Buchstage oder Sonderzeichen. Und das eine Aufforderung kommt eine Zahl einzugeben bei falscher Eingabe. Wie groß die Zahl ist, soll unerheblich sein, das prüfe ich separat. Mir geht es nur darum zu verstehen wie ich z.B. isdigit() in meinem Programm einsetzten kann. Ich habe mir mehrere Beispiele angeschaut, produziere jedoch immer Fehlermeldungen. Mir geht es mehr um das Verstehen der Prüfung, als um Optimierung des Programmes. Das ist eh nur eine Spielwiese.
Ich danke im voraus. Andreas :D

Code: Alles auswählen

# Geisterspiel
while True:    
    def cls(): print ("\n" * 50)
    cls()
    from random import randint
    ("Geisterspiel")
    du_bist_mutig = True
    score = 0
    while du_bist_mutig:
        geistertuer = randint(1, 3)
        print("Vor dir sind drei Türen.")
        print("Hinter einer ist ein Geist.")
        print("Welche Tür öffnest du")
        tuer = input("1,2 oder 3?")
        tuer_nummer = int(tuer)
        if tuer_nummer == geistertuer:
            print("Geist")
            du_bist_mutig = False
        elif tuer_nummer > 3:
            print ("   Hallo, hallo, Nur 1,2 oder 3")
            print ("\n" *2)
        elif tuer_nummer < 1:
            print ("   HUHU du bist ein schlauer Betrüger")
            print ("\n" *2)
        else:
            print("\n" * 2)
            print("Kein Geist!")
            print("du bist ein Zimmer weiter")
            score = score + 1
            print ("\n" *2)
    print("Laufe Weg")
    print("Spiel vorbei! Deine Punkte:", score)
    print("")
    print("")
    aw = input ("Spiel neu starten (j/n)")
    if aw == "n":
        def clo(): print ("\n" * 40)
        clo()
        print ("\n" *20)
        print ("Bis zum nächsten Spiel. Ich wünsche noch einen schönen Tag")
        break
        
andreas--surf
User
Beiträge: 5
Registriert: Sonntag 12. November 2017, 11:20

Code: Alles auswählen

tuer = input("1,2 oder 3?")[Codebox=python file=Unbenannt.py][/Codebox]
scheint die richtige Zeile zu sein?
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nein, die danach. int(Text) macht eine Ganzzahl aus einem String. Oder wirft eine ValueError-Ausnahme wenn das nicht möglich ist.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@andreas--surf: solch ein langes Programm schreibt man ja nicht in der Python-Shell. Da wäre es also gut, etwas strukturierter zu schreiben, also Funktionen nicht mitten in einer Schleife definieren und alle Importe ganz am Anfang der Datei schreiben. Warum verwendest Du das antike Python 3.3?

Wenn Du `int` auf einen String der keine Zahl enthält anwendest, bekommst Du einen Fehler. Du mußt diesen Fehler einfach nur abfangen und verarbeiten.

Code: Alles auswählen

tuer = input("1, 2 oder 3?")
try:
    tuer_nummer = int(tuer)
except ValueError:
    print("keine Zahl eingegeben")
else:
    if tuer_nummer == geistertuer:
        [...]
andreas--surf
User
Beiträge: 5
Registriert: Sonntag 12. November 2017, 11:20

Code: Alles auswählen

tuer = input("1,2 oder 3?").isdigit()
        tuer_nummer = int(tuer)
Hallo Deets, wenn die Eingabe ein Buchstabe ist,(ohne .Isdigit()) erzeugt doch die Zeile darunter eine Fehlermeldung, weil es kein Zahl sondern ein Buchstabe ist?
Jedenfalls bekomme ich dann in der Shell eine Fehlermeldung von der zweiten Zeile.
Also müsste .isdigit() zu spät in der zweiten Zeile sein? Weil ein Buchstabe wird ja nicht so einfach eine Zahl werden?

Außerdem bekomme ich eine Fehlermeldung in IDLE wenn .isdigit() in der zweiten Zeile steht: AttributeError: 'int' object has no attribute 'isdigit'

Steht .isdigit() in der ersten Zeile, so müßte nach meinen Verständniss
der Wert False ausgebeben werden bei der Eingabe/Input von einen Buchstaben.
Kann es sein das False gleich den Wert null erzeugt? Jedenfalls geht es dann weiter in der Codezeile elif mit dem Wert < 1 weiter.

Zur Info: Mein Sohn 11 hat schon ein bisschen mit Scratch gespielt, mit einem Buch welches ich Ihm geschenkt habe. Er hat mich gefragt ob ich Ihn bei Python helfen kann einen Einstieg zu finden.
Wir haben das Buch "Programieren supereasy in Scratch und Pyton. Sieht toll für Kinder aus. Jedoch fehlt was zum gezielten umfangreicheren Nachschlagen.
Haben Sie eventuell eine Buchempfehlung am besten "noch" in Deutsch und eventuell ein in Englisch. Adrian ist erst in der 6 Klasse und hat erst seit drei Jahre Englisch
andreas--surf
User
Beiträge: 5
Registriert: Sonntag 12. November 2017, 11:20

Hallo Sirius3, danke das werde ich ausprobieren, ich bin erst gestern damit angefangen und will hauptsächlich erstmal überhaupt etwas Code kennenlernen.
Von GUI weiss ich noch nichts, Wie gesagt erst der zweite Tag. Siehe Text an DEETS.
3.3.3 weil wir ein Buch davon haben.
Ich werde es ausprobieren, somit vielen Dank
Andreas und Adrian
andreas--surf
User
Beiträge: 5
Registriert: Sonntag 12. November 2017, 11:20

Danke an euch! Wenn Ihr jetzt noch eine Buch-Empfehlung habt! Wir haben heute viel übers Einrücken gelernt!
Nochmals Danke Andreas & Adrian

Code: Alles auswählen

# Geisterspiel
while True:    
    def cls(): print ("\n" * 50)
    cls()
    from random import randint
    ("Geisterspiel")
    du_bist_mutig = True
    score = 0
    while du_bist_mutig:
        geistertuer = randint(1, 3)
        print("Vor dir sind drei Türen.")
        print("Hinter einer ist ein Geist.")
        print("Welche Tür öffnest du")
        tuer = input("1,2 oder 3?")
        try:
            tuer_nummer = int(tuer)
        except ValueError:
            print ("\n" *2)
            print("Na, na, na, keine Zahl eingegeben")
            print ("\n" *2)
        else:    
            if tuer_nummer == geistertuer:
                print ("\n" *2)
                print("Geist")
                du_bist_mutig = False
            elif tuer_nummer > 3:
                print ("\n" *2)
                print ("   Hallo, hallo, Nur 1,2 oder 3")
                print ("\n" *2)
            elif tuer_nummer < 1:
                print ("\n" *2)
                print ("   HUHU du bist ein schlauer Betrüger")
                print ("\n" *2)
            elif tuer_nummer == 1:
                print("\n" * 2)
                print("Kein Geist!")
                print("du bist ein Zimmer weiter")
                score = score + 1
                print ("\n" *2)
            elif tuer_nummer == 2:
                print("\n" * 2)
                print("Kein Geist!")
                print("du bist ein Zimmer weiter")
                score = score + 1
                print ("\n" *2)
            elif tuer_nummer == 3:
                print("\n" * 2)
                print("Kein Geist!")
                print("du bist ein Zimmer weiter")
                score = score + 1
    print ("\n" *2)
    print("Laufe Weg")
    print("Spiel vorbei! Deine Punkte:", score)
    print("\n *2")
    aw = input ("Spiel neu starten (j/n)")
    if aw == "n":
        print ("\n" * 40)
        print ("\n" * 20)
        print ("Bis zum nächsten Spiel. Ich wünsche noch einen schönen Tag")
        break        
Antworten