Funktion abrufen

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
nuhakan
User
Beiträge: 51
Registriert: Donnerstag 11. August 2016, 11:42

Hallo,

ich bitte wieder um Hilfe. Ich möchte in dieser Struktur die Funktion 'blue_room' in 'way_1' aus den zweiten 'if' in 'way_2' abrufen.

Anmerkung: mir ist bekannt, die zwei 'if' da unten ist keine gute Sache und der Code ist wahrscheinlich nicht gut. :oops:

Code: Alles auswählen

def way_1():

    def red_room():

        choice = input("> ")

        if "fight" in choice:
            dead()
        elif "flee" in choice:
            blue_room()
        else:
            dead("You are stupid.")

--> def blue_room():

        choice = input("> ")

        if "coat" in choice:
            dead(" ")
        elif "door" in choice:
            home("You flee.")
        else:
            dead("You are stupid.")

    choice = input("> ")

    if "red" in choice:
        red_room()
    elif "blue" in choice:
        blue_room()
    else:
        way_1()


def way_2():

    def white_room():

        choice = input("> ")

        if "drink" in choice:
            print("""  """)

            choice_drink = input("> ")

            if "break" in choice_drink:
 -->            way_1(blue_room())
            elif "sleep" in choice_drink:
                dead("Sleep you?")
            else:
                way_2()

        elif "flee" in choice:
            
            start()
        else:
            dead("You are Stupid.")
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Das geht so nicht. Die inneren Funktionen gehören zum lokalen Namensraum der äußeren Funktionen und sind daher nur innerhalb dieser bekannt. Zwar lassen sich die Adressen der inneren Funktionen exportieren, was aber üblicherweise für andere Zwecke genutzt wird.
Dein Code ist aber ein gutes Beispiel, warum das Schachteln von Funktionen vermieden werden sollte. Du solltest Dich besser mit Klassen befassen.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Es ist keine gute Idee, die Räume eines Spiels durch direkte Funktionsaufrufe zu designen. Funktionen sind keine Sprungmarken, sondern erledigen eine Aufgabe und kehren danach zum Aufrufer zurück. Daher sollte jeder Weg und jeder Raum eine Funktion sein, die keine anderen Raum-Funktionen aufruft, sondern den Raum oder Weg per `return` an eine Hauptschleife zurückgibt, die dann den nächsten Raum aufruft.

Das ist dann auch noch nicht das perfekte Design, besser wäre es, die Spiellogik ein Datenstrukturen zu speichern (bei Dir ist das ein Wörterbuch, das Räumen, oder allgemeiner Situationen, Verben zuordnet, die Aktionen auslösen). Das Abarbeiten dieser Logik kann dann in einer allgemeinen Funktion programmeirt werden.
nuhakan
User
Beiträge: 51
Registriert: Donnerstag 11. August 2016, 11:42

Das erklärt, warum ich keine Antwort gefunden habe.

Ich bemerke mich Eure Hinweise. Etwas neues gelernt. ;)

Danke sehr!
Antworten