Code verbessern möglich ? + ein Fehler in Zahlenraten

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
knabber
User
Beiträge: 2
Registriert: Dienstag 18. November 2014, 17:07

hallo zusammen,
ich habe mir ein Einstieg in Python Buch gekauft und wollte nun ein einfaches Programm programmieren, das ich auch schon in Pascal programmiert habe, jedoch nicht so umfangreich.
Das ist mir auch ganz gut gelungen, jetzt wollte ich aber mal fragen, da der Code nicht so ordentlich aussieht, und ich glaube, das der viel einfacher ginge, wie ich den Code verbessern könnte.
Hier mal der Code:

Code: Alles auswählen

"""Zahlenraten.
Mann muss eine mit random.randint ermittelte zahl herausfinden.
Der PC sagt einem, ob die Zahl größer/kleiner als die ist, die man geraten hat.
So kommt man der Zahl immer näher.
1. Bereich der Zufallszahl (zzahl) kann selbst ausgewählt werden.
2. Versuche werden gezählt.
"""

import random                   #Modul importieren
random.seed()                   #modul initialisieren

fortsetzen = 1                                                                      #Variable für Schleife1 definieren
while fortsetzen == 1:                                                              #schleife1 zum wiederholen des ges. programms
    print()
    print("Zahlenraten")
    print()
    print("Bitte gib den Bereich an, in dem sich die zu erratene "
          "Zufallszahl befinden soll."
          "Gib dazu zuerst die kleinste "
          "Zahl ein, die die Zufallszahl sein können soll:")
    zahl1 = 3.2                                                                     #Variable schleife2 definieren
    while zahl1 != int(zahl1):
        try:                                                                        #Ausnahme überprüfung
            zahl1=int(input())  
        except:
            print("Bitte gib eine ganze Zahl ein:")
            continue
    print("Bitte gib die größte Zahl ein, die die Zufallszahl sein können soll:")
    zahl2 = 3.5                 #Variable schleife 3 definieren
    while zahl2 != int(zahl2) or zahl2 < zahl1:                                     #erst weiter wenn zahl2 == int UND zahl1 > zahl2
        try:                                                                        #Ausnahme überprüfung           
            zahl2 = int(input())
        except:
            if zahl1 > zahl2:                                                       #wenn nötig eingabe wiederholen
                print("Bitte gib eine Zahl ein, die größer als die erste Zahl"
                      " ist")
                continue
            print("Bitte gib eine ganze Zahl ein:")
            continue
    zzahl = random.randint(zahl1,zahl2)                                             #zzahl wird ermittelt       
    eingabe = 'a'                                                                   #variable eingabe wird vordefiniert
    while eingabe != zzahl:
        print("Bitte gib eine Zahl zwischen",zahl1,"und",zahl2,"ein:")
        fehler = 0                                                                  #variable fehler definieren
        versuch = 0                                                                 #variable versuch definieren
        while fehler == 0:                                                          #schleife ermittelt ob eingabe == im gültigen bereich und ob sie integer ist
            try:
                eingabe = int(input())                                              #ob eingabe == integer überprüfung
                versuch = versuch + 1                                               #Versuchanzahl ermitteln
                print("Versuch:",versuch)                                           #aktuelle versuchnummer ausgeben
                if eingabe < zahl1 or eingabe > zahl2:                              #eingabe im gültigem bereich überprüfung
                    print("Bitte gib eine Zahl zwischen",zahl1,"und",zahl2,"ein:")
            except:
                if eingabe > zzahl:                                                 #überprüfung ob eingabe == zzhal oder > oder < zzahl
                        print("Die Zufallszahl ist kleiner als",eingabe,"!")
                elif eingabe < zzahl:
                        print("Die Zufallszahl ist größer als",eingabe,"!")
                elif eingabe == zzahl:
                        print("Richtig!!! Die Zufallszahl ist",eingabe,"!!!")
                        print("Benötigte Versuche:",versuch)                        #versuche werden angegeben
                        print()
                        fehler = 1                                                  #schleife wird nic ht wiederholt wenn fehler == 1
    
    print("Willst du noch ein Spiel spielen?")                                      #frage ob wiederholen          
    print("Drücke 'J' um eine weitere Runde zu spielen.")
    antwort = input()                   
    if antwort == 'j' or antwort == 'J':                                            #wenn 'J' erste schleife fängt vorne an
        fortsetzen = 1
    else:
        fortsetzen = 0                                                              #wenn fortsetzen == 0 programm zu ende
    
Außerdem, muss ich nach der Eingabe einer Zahl und der Versuchsnummeranzeige noch mal Enter drücken, bevor angezeigt wird, ob die zzahl nun größer, kleiner oder die eingabe ist. Ich wüsste nicht, wie ich diesen Fehler beheben könnte. :K

Code: Alles auswählen

Zahlenraten

Bitte gib den Bereich an, in dem sich die zu erratene Zufallszahl befinden soll.Gib dazu zuerst die kleinste Zahl ein, die die Zufallszahl sein können soll:
0
Bitte gib die größte Zahl ein, die die Zufallszahl sein können soll:
50
Bitte gib eine Zahl zwischen 0 und 50 ein:
25
Versuch: 1

Die Zufallszahl ist größer als 25 !
35
Versuch: 2

Die Zufallszahl ist größer als 35 !
40
Versuch: 3

Die Zufallszahl ist kleiner als 40 !
37
Versuch: 4

Richtig!!! Die Zufallszahl ist 37 !!!
Benötigte Versuche: 4

Willst du noch ein Spiel spielen?
Drücke 'J' um eine weitere Runde zu spielen.
j

Zahlenraten

Bitte gib den Bereich an, in dem sich die zu erratene Zufallszahl befinden soll.Gib dazu zuerst die kleinste Zahl ein, die die Zufallszahl sein können soll:
kann mir jmd. helfen ? :?:

danke
MfG
BlackJack

Der `seed()`-Aufruf ist unnötig, das passiert schon beim ersten Import des `random`-Moduls.

Diese ganzen `while`-Schleifen wo vorher ein Wert auf einen (teilweise absichtlich unsinnigen) Wert gesetzt wird sollte man ohne diesen unnötigen Namen schreiben in dem man eine Endlosschleife (``while True:``) schreibt, die gegebenfalls durch ein ``break`` oder ein ``return`` verlassen wird. ``return`` weil der sich wiederholende Code in Funktionen stehen sollte. Zum Beispiel eine zur Eingabe einer Zahl, statt den nahezu gleichen Code mehrfach im Quelltext zu stehen haben.

Von ``continue`` lasse ich persönlich die Finger weil das ein unbedingter Sprung an den Schleifenanfang ist, der sich nicht in der Einrückung wiederspiegelt, also leicht übersehen werden kann. Am *Ende* einer Schleife ist ``continue`` sinnfrei.

Bei einem ``except:`` sollte(n) immer die konkrete(n) Ausnahmen(n) angegeben werden die behandelt werden sollen. Sonst kann die Fehlersuche echt schwierig werden wenn da Ausnahmen ”behandelt” die so gar nicht sinnvoll behandelt werden können, die der Programmierer dann aber auch nie zu Gesicht bekommt.

Bei Flags sollte man `True` und `False` verwenden statt 1 und 0 dafür zu missbrauchen.

`zahl1`, `zahl2`, `zzahl` sind alles ziemlich nichtssagende Namen. Der Leser möchte doch ganz gerne wissen was die Zahlen *bedeuten*, und nicht das es Zahlen sind.

Die Kommentare sind furchtbar unübersichtlich wenn nach 80 Zeichen umgebrochen wird. Länger sollten Zeilen möglichst nicht sein. Ausserdem sind die meisten Kommentare unnütz weil sie einfach nur noch mal das sagen was offensichtlich im Code schon da steht. Kommentare sollten einen *Mehrwert* bieten, und in der Regel nicht beschreiben *was* passiert — das steht schon als Code da — sondern warum. Also in den Fällen wo das nicht aus dem Code ersichtlich wird.

Das ganze würde ich mehr in Funktionen aufteilen statt so einen grossen Haufen Code am Stück runter zu schreiben.

Das Hauptprogramm steck üblicherweise in einer Funktion die `main()` heisst, und mit folgendem Idiom aufgerufen wird:

Code: Alles auswählen

if __name__ == '__main__':
    main()
Dann kann man das Modul importieren ohne dass das Hauptprogramm abläuft. Zum Beispiel um einzelne Funktionen zu testen (manuell in der Python-Shell oder automatisiert mit Unittests), oder wiederverwenden, und einige Werkzeuge, zum Beispiel zur Dokumentation, erwarten ebenfalls das man ein Modul ohne Seiteneffekte importieren kann.
knabber
User
Beiträge: 2
Registriert: Dienstag 18. November 2014, 17:07

erstmal danke für die antwort
ich überarbeite dann mal den ganzen code
das mit true/false hatte ich in python noch gar nicht, kuck ich mir dann mal an
und ich pack alles in funktionen

mfg
Benutzeravatar
HarteWare
User
Beiträge: 69
Registriert: Samstag 23. Februar 2013, 21:16
Wohnort: localhost

Hi ich will noch auf eine Kleinigkeit hinweisen, undzwar kannst du ein paar Zeilen sparen,
indem du statt einer leeren print() Funktion für eine neue Zeile einfach ein '\n' benutzt.

Code: Alles auswählen

print("foo")
print()
# wird zu
print("foo\n")
Ob das jetzt schöner ist, ist natürlich geschmackssache, aber ich wollte dich darauf hinweisen.
Es gibt auch noch weitere dieser so genannten Escape-Sequenzen (kann man einfach googeln)
Antworten