While Schleife

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
KaiH
User
Beiträge: 1
Registriert: Sonntag 16. Dezember 2018, 11:25

Code: Alles auswählen

#by Kai Hampe
#V1
import sys
saettigung=3
Vorräte=2
print("Hallo und Willkommen zu meinem Text Adventure\n\n Du bist in einem Keller eingesperrt und musst hier irgendwie herauskommen!\n WENN DU NICHT BALD ETWAS ISST STIRBST DU!")
print("")
while True:
    print("Du bemerkst dass der Raum in dem du bist vier Türen hat, eine in jede Himmelsrichtung")
    print(" ____")
    print("|DU  |")
    print("|____|")
    print("Die nach Norden sieht bedrohlich aus, da aus dem Raum ein seltsame Flüssigkeit tropft...")
    print()
    print("Aus dem Raum im Süden kommen komische Geräusche")
    print()
    print("Der Raum im Westen sieht ganz Normal aus")
    print()
    print("und aus dem Raum im Osten kommt eine einladene Wärme\n")
    richtung=int(input("ENTSCHEIDE DICH IN WELCHE RICHTUNG GEHST DU?\n1=Norden\n2=Osten\n3=Süden\n4=Westen\n:"))

    if richtung == 1:
        saettigung=saettigung-1
        if saettigung<1:
            print ("du bist verhungert\nfalls du das nächste mal nicht verhungern möchtest finde mehr Essen!")
            sys.exit("")
        print("Du hast dich also für Norden entschieden")
        print(" _____")
        print("|     |")
        print("|  DU |")
        print("|__ __|")
        print(" _| |_")
        print("|     |")
        print("|     |")
        print("|_____|")
        print()
        print("Du siehst plötzlich ein schleimiges Monster, welches gerade ein totes tier frisst...\nmöchtest du gegen es kämpfen(1) oder weglaufen(2)")
        entscheidung=int(input(":"))
        if entscheidung==1:
                    print("DAS MONSTER IST STÄRKER ALS DU\nDU STIRBST")
                    sys.exit("")
            
    elif richtung == 2:
        saettigung=saettigung-1
        if saettigung<1:
            print ("du bist verhungert\nfalls du das nächste mal nicht verhungern möchtest finde mehr Essen!")
            sys.exit("")

        print("Du hast dich also für Osten entschieden")
        print(" _____     _____")
        print("|     |___|     |")
        print("|      ___  DU  |")
        print("|_____|   |_____|")
        print()
        print("Du findest einen fast verhungerten Gefangenen der an einem Lagerfeuer sitzt und sich wärmt\nWenn du ihm etwas von deinen ",2," Vorräten abgibst wird er dich begleiten")
        while True:
            entscheidung=int(input("Möchtest du ihm etwas abgeben?\n1=Ja\n2=Nein\n:"))
            if entscheidung==1:
                Vorräte=Vorräte-1
                print("Deine Vorräte betragen jetzt",Vorräte,)
                print("der Gefangene hat sich dir angeschlossen")
                break
            elif entscheidung==2:
                print("Du lässt den Gefangenen verhungern und ziehst weiter")
                break
            else:
                print("Du hast eine falsche Eingabe getätigt. Bitte versuche es nochmal") 
    elif richtung==3:
        saettigung=saettigung-1
        if saettigung<1:
            print ("du bist verhungert\nfalls du das nächste mal nicht verhungern möchtest finde mehr Essen!")
            sys.exit("")
        print("Du hast dich also für Süden entschieden")
        print(" _____")
        print("|     |")
        print("|     |")
        print("|__ __|")
        print(" _| |_")
        print("|     |")
        print("|  DU |")
        print("|_____|")
        print()
        print("In dem Raum sind 3 Kisten und du hast nur einen Schlüssel")
        while True:
            entscheidung=int(input("Welche öffnest du Kiste 1,2 oder 3?:"))
            if entscheidung==1:
                Vorräte=Vorräte+5
                print("Deine Vorräte betragen jetzt",Vorräte)
                print("Deine Sättigung beträgt jetzt",saettigung)
                while True:
                    kiste=int(input("Möchtest du etwas von deinen Vorräten essen(1) oder nicht(2)"))
                    if kiste==1:
                        Vorräte=Vorräte-1
                        saettigung=saettigung+1
                        print("Deine Vorräte betragen jetzt",Vorräte)
                        print("Deine Sättigung beträgt jetzt",saettigung)
                        break
                    elif kiste==2:
                        print("Du gehst ohne zu essen weiter.")
                        break
                    else:
                        print("Bitte gib nochmal ein")
                
            elif entscheidung==2:
                Vorräte=Vorräte+2
                print("Deine Vorräte betragen jetzt",Vorräte)
                print("Deine Sättigung beträgt jetzt",saettigung)
                while True:
                    kiste=int(input("Möchtest du etwas von deinen Vorräten essen(1) oder nicht(2)"))
                    if kiste==1:
                        Vorräte=Vorräte-1
                        saettigung=saettigung+1
                        print("Deine Vorräte betragen jetzt",Vorräte)
                        print("Deine Sättigung beträgt jetzt",saettigung)
                    elif kiste==2:
                        print("Du gehst ohne zu essen weiter.")
                    else:
                        print("Bitte gib nochmal ein")
                
            elif entscheidung==3:
                
                Vorräte=Vorräte+4
                print("Deine Vorräte betragen jetzt",Vorräte)
                print("Deine Sättigung beträgt jetzt",saettigung)
                while True:
                    kiste=int(input("Möchtest du etwas von deinen Vorräten essen(1) oder nicht(2)"))
                    if kiste==1:
                        Vorräte=Vorräte-1
                        saettigung=saettigung+1
                        print("Deine Vorräte betragen jetzt",Vorräte)
                        print("Deine Sättigung beträgt jetzt",saettigung)
                        break
                    elif kiste==2:
                        print("Du gehst ohne zu essen weiter.")
                        break
                    else:
                        print("Bitte gib nochmal ein")
            break
                    

        print("\nDu hast wieder die Möglichkeit in 4 Räume zu gehen")
        print("entweder\nzurück nach Norden(1)\nnach Osten(2)\nnach Süden(3)\noder nach Westen(4)\n\nWofür entscheidest du dich?")
        while True:
            richtung2=int(input(""))
            if richtung2==2:
                saettigung=saettigung-1
                if saettigung<1:
                    print ("du bist verhungert\nfalls du das nächste mal nicht verhungern möchtest finde mehr Essen!")
                    sys.exit("")
                print("Du gehst also nach Osten...")
                print(" _____")
                print("|     |")
                print("|     |")
                print("|__ __|")
                print(" _| |_    _____")
                print("|     |__|     |")
                print("|      __  DU  |")
                print("|_____|  |_____|")
                print()
                print("Du siehst im Raum ein Krokodil,welches sehr hungrig ist und dich mit hungrigen Augen anstarrt möchtest du\nmit deinen bloßen Händen gegen es kämpfen(1) oder weglaufen(2)?")
                while True:
                    krokodil=int(input("Wie entscheidest du dich?"))
                    if krokodil==1:
                        print("DAS KROKODIL ZERFLEISCHT DICH!")
                        print("GAME OVER")
                        sys.exit()
                    elif krokodil==2:
                        print("Du bist weggelaufen und nun in einem neuen Raum.")
                        print("         _____")
                        print("        |     |")
                        print("        |     |")
                        print("        |__ __|")
                        print(" ____    _| |_    _____")
                        print("|    |__|     |__|     |")
                        print("| DU  __       __      |")
                        print("|____|  |_____|  |_____|")
                        print()
                        print("Du siehst einen Schlüssel auf dem Boden liegen und hebst ihn auf")
                        #weiter programmieren
                        break
                    else:
                        print("Bitte gib nochmal ein!")
                        
            elif richtung2==1:
                
                print("Du hast dich für Norden entschieden")
                saettigung=saettigung-1
                if saettigung<1:
                    print("du bist verhungert\nfalls du das nächste mal nicht verhungern möchtest finde mehr Essen!")
                    sys.exit("")
    		#continue

Hallo,
Ich soll für die Schule ein Text Adventure Programmieren und will nach der letzten elif Verzweigung wieder ganz an den Anfang zum Schleifenkopf der ersten while Schleife springen
hat jemend eine Idee wie ich das machen kann?

Ich bedanke mich schonmal im Vorraus! :mrgreen:
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@KaiH: Gar nicht. Das ist viel zu unübersichtlich das alles in einem grossen Codeklumpen runter zu schreiben. Überlege Dir eine Datenstruktur für die Räume und schreibe Code in Form von Funktionen der diese Datenstruktur dann ”abarbeitet”. Oder zumindest schreib eine Funktion pro Raum, die als Rückgabewert den Raum hat, der danach besucht werden soll. Funktionen sind in Python auch Werte! Man kann dann relativ einfach eine Hauptschleife schreiben, die das ganze antreibt und immer den nächsten Raum aufruft, welches der Rückgabewert vom gerade besuchten Raum ist.

Der Code enthält auch einige Wiederholungen die man durch eine bessere Strukturierung (zum Beispiel mittels Funktionen) vermeiden kann.

`sys.exit()` sollte man nur verwenden wenn man dem Aufrufer damit tatsächlich einen Rückgabecode übermitteln möchte. Sonst sieht das eher nach einem schmutzigen Hack aus um sich nicht mit einer ordentlichen Strukturierung des Programmablaufs beschäftigen zu müssen.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Du hast Dein ganzes Spiel linear aufgebaut, jede Entscheidung führt in eine andere Schleife Deines Codes. Und damit stößt Du an eine Grenze, wie Du selbst gemerkt hast. In Raum Ost sind die Vorräte fix auf 2, obwohl man sie im Raum Süd ja auffüllen kann, und nur dort kann man Essen.
Die Lösung ist, in einer großen Datenstruktur (Klasse, Wörterbuch, etc.) den Zustand der ganzen Spielwelt zu speichern, (also ob man das Krokodil schon gesehen hat, ob man die Kiste schon geöffnet hat, ob man den Gefangenen schon gesehen hat und ihm geholfen hat, ...) und in welchem Raum man sich gerade befindet.
In einer einzigen Schleife wird dann abhängig vom Raum und vom Zustand mögliche Aktionen abgefragt und entsprechend reagiert.
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@KaiH: Vielleicht mal als Denkansatz: https://de.wikipedia.org/wiki/Spaghetticode

Das BASIC-Beispiel dort mag nicht ganz zeitgemäß sein, aber der Artikel zählt einige Nachteile von sogenanntem Spaghetti-Code auf. Deinen Code würde ich in diese Kategorie einordnen wollen.

Den Tipp, dass man Code besser in kleinere Häppchen einteilt, die man mehrfach verwenden kann, solltest du beherzigen. Du kannst hier, wie schon angesprochen wurde, am leichtesten mit Funktionen arbeiten. Wobei dabei wichtig ist, kluge Funktionssignaturen (d. h. welche Argumente sollen verarbeitet werden?) sowie sinnvolle Rückgabewerte (siehe return) zu verwenden.
Antworten