Zahlenspiel funktioniert nur in PyScripter!

Code-Stücke können hier veröffentlicht werden.
Antworten
Lou Cifer
User
Beiträge: 4
Registriert: Donnerstag 19. Dezember 2013, 20:19

Moin!

Ich bin noch ganz neu in diesem Forum und auch noch ein totaler Anfänger was das Thema Python angeht.
Ich habe gestern angefangen mit Python zu "experimentieren", habe mir ein kleines Maß an Grundwissen angelesen und mir einige hilfreiche Tutorials angeschaut.

Nun zu meinem Problem:
Ich benutze Python 3.3, habe bis jetzt aber alles in PyScripter geschrieben und anschließend mit Pythons Command Line aufgerufen.
Nun habe ich ein kleines "Ratespiel" geschrieben, bei dem sich der Computer eine Zahl zwischen 1 und 20 ausdenkt und man diese erraten muss. Typisches Anfängerzeug eben.
Das Spiel funktioniert in PyScripter bestens, in Command Line allerdings nur so lange, bis ich die richtige Zahl erraten habe, dann beendet sich das Programm einfach.
Meiner Ansicht nach muss sich das Problem also in den letzten 6 Zeilen befinden, denn bis dahin funktioniert alles prima.

Code: Alles auswählen

# Dies ist ein Zahlenspiel---

import random

guessesTaken = 0

print('Hallo! Wie lautet dein Name?')
myName = input()

number = random.randint(1, 20)
print('Also, '+ myName + ', ich denke an eine Zahl zwischen 1 und 20.')

while guessesTaken < 6:
    print('Rate mal!')
    guess = input()
    guess = int(guess)

    guessesTaken = guessesTaken + 1

    if guess < number:
        print('Deine Zahl ist zu niedrig.')

    if guess > number:
        print('Deine Zahl ist zu hoch.')

    if guess == number:
        break

if guess == number:
    guessesTaken = str(guessesTaken)
    print('Gut gemacht, '+ myName + '! Du hast meine Zahl in  '+ guessesTaken +' Versuchen erraten!')
Könnt ihr mir sagen was ich hier falsch gemacht habe oder warum es bloß in PyScripter funktioniert? Weder die Suchfunktion noch Google hat dazu etwas brauchbares ausgepuckt. :?
BlackJack

@Lou Cifer: Das was Du beschreibst ist genau das Verhalten welches man erwarten würde. Wenn das Programm bis zum Ende durchläuft ist es zuende.
Lou Cifer
User
Beiträge: 4
Registriert: Donnerstag 19. Dezember 2013, 20:19

Danke, BlackJack für den Gedankenanstoß! Ich habe jetzt einfach noch das "time module" importiert und an das Ende ein time.sleep(20) gehangen, jetzt funktioniert alles einwandfrei. :lol: Aller Anfang ist ja bekanntlich schwer.
BlackJack

@Lou Cifer: Und was soll der Sinn von dieser unnötigen Warterei sein? Das nervt doch am Ende nur die Benutzer das sie dann 20 Sekunden lang das Terminal nicht verwenden können.
Lou Cifer
User
Beiträge: 4
Registriert: Donnerstag 19. Dezember 2013, 20:19

Ist ja erstmal nur als Übergangslösung gedacht, bis ich herausgefunden habe wie es besser umgesetzt werden kann. :|
peddy
User
Beiträge: 121
Registriert: Montag 30. Juni 2008, 13:51

Ich verstehe das Problem nicht. Was ist denn deine Absicht? Soll das Spiel von vorne beginnen, wenn die Zahl erraten wurde, oder was schwebt dir vor?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Darüber hinaus: Wieso gibt es keine abschließende Meldung für den Fall, dass man die Zahl nicht erraten konnte? ;-)

Einige kleine Anmerkungen:

- Die Zeilen 15 & 16 kann man doch prima zusammenfassen: ``guess = int(input())``. Man könnte sogar das ``print`` davor einsparen und den Text durch ``input`` ausgeben lassen.

- Aus den drei ``if``s könnte man ein ``if...elif...else`` machen. Denn eine Zahl kann ja nur kleiner, größer oder gleich sein als eine andere ;-) Damit hätte man die ganze Auswertungslogik imho schöner miteinander verknüpft.

- ``guessesTaken`` sieht nach Java / C# o.ä. aus. Laut PEP8 sollte es ``guesses_taken`` heißen.

- Strings konkateniert man in Python besser nicht mittels ``+`-Operator, sondern mit der ``format``-Methode auf Strings oder dem ``%`` Operator. Damit kannst Du Dir am Ende auch das Umwandeln der Versuchsanzahl in einen String sparen, denn mit beiden Methoden nimmt Python eine Umwandlung automatisch vor.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Lou Cifer
User
Beiträge: 4
Registriert: Donnerstag 19. Dezember 2013, 20:19

Ursprünglich lag der Kern meiner Verwirrung dadrin, dass das Spiel in PyScripter ohne Probleme funktionierte, in Command Line allerdings nicht. Ich habe nicht dadran gedacht, dass ich kein richtiges "Ende" geschrieben habe, somit wurde es also logischerweise sofort nach dem Raten der ausgedachten Zahl beendet.

Ich habe mir heute noch ein paar Gedanken über Verbesserungen gemacht und werde logischerweise eine Meldung einfügen für den Fall, dass man die Zahl nicht innerhalb der gegebenen Versuche erraten hat.
Da ich erst vorgestern mit Python angefangen habe, lag mein Hauptaugenmerk auf der Ausführbarkeit des Spiels.
Dass man die Zeilen 15&16 auf diese Art zusammenfassen kann und ich aus den drei ''if''s "if..elif..else" machen kann, hilft mir aber ungemein. Danke für den Tipp!

Wie müsste ich denn an die Sache herangehen, wenn ich das Spiel von neu beginnen lassen will, nachdem man die Zahl erraten oder nicht erraten hat?
Ich würde gerne die Frage "Möchtest du noch einmal spielen? j / n" mit print einfügen und danach dem Benutzer die Möglichkeit geben mittels Eingabe von j oder n das Spiel erneut zu starten oder es zu beenden.
Kann ich das Spiel mit sys.exit beenden lassen? Und wie lasse ich es erneut starten?

Fragen über Fragen.. :o

Nochmals vielen Dank für die Antworten!
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Lou Cifer hat geschrieben: Wie müsste ich denn an die Sache herangehen, wenn ich das Spiel von neu beginnen lassen will, nachdem man die Zahl erraten oder nicht erraten hat?
Du brauchst eine Endlosschleife, in der ein Abbruch (``break``) stattfindet, sofern der Benutzer aufhören möchte. Überlicher Weise baut man die mit ``while true``. Sinnvoller Weise solltest Du Dich bald mit Funktionen befassen; denn ansonsten musst Du das Raten *und* den Ablauf drum Herum verschachteln - und das wird dann langsam unübersichtlich.

``sys.exit`` brauchst Du eigentlich hier nicht explizit!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten