Funktion in while Schleife Problem

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
ll9
User
Beiträge: 34
Registriert: Samstag 9. Februar 2013, 15:13

Hallo liebes Forum,

ich hab gerade an ein kleines Textspiel programmiert, bis mir ein Fehler unter laufen ist. Ich weiß jedoch nicht, wieso der code funktioniert. ich poste ihn einfach mal einen vereinfachten teil hier.

Code: Alles auswählen

x = True
health = 100

def dead():
    if health <= 0:
        print "GAME OVER!"
        x = False
        
        
while x:
    health -= 20
    print health
    dead()    
Ich hätte gern, dass der code dann so abläuft

Code: Alles auswählen

80
60
40
20
0
GAME OVER!
Das funktioniert leider nicht so ganz. Stattdessen geht er immer weiter, auch wenn "health" bereits kleiner 0 ist, wie man hier eben sehen kann.

Code: Alles auswählen

-20
GAME OVER!
-40 
GAME OVER!
-60
GAME OVER
...
Wieso geht das nicht, so wie ich mir das vorstelle? Das "GAME OVER!" erscheint ja zum richtigen Zeitpunkt, wieso übernimmt er dann nicht auch das x = False, damit die while-Schleife sich auflöst??
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Das x in der Funktion dead ist nicht das gleiche x wie das auf Modulebene. Man könnte es in der Funktion als global deklarieren, allerdings ist das kein besonders guter Programmierstil da er viel zu viele Abhängigkeiten schafft.

Ich würde einfach eine andere Bedingung für die while-Schleife wählen.

Code: Alles auswählen

while health > 0:
BlackJack

@ll9: Weil das `x` in der Funktion ein anderes ist als das auf Modulebene. Aus einer Funktion heraus solltest Du auch keine Namen ausserhalb der Funktion an neue Werte binden wollen. Und auch nicht einfach so auf `health` zugreifen. Werte sollten Funktionen als Argumente betreten und falls nötig als Rückgabewert verlassen. Nur dann hat man tatsächlich eine Funktion so wie sie gedacht ist.

Code: Alles auswählen

def is_dead(health):
    return health <= 0
        

def main():
    health = 100
    while True:
        health -= 20
        print health
        if is_dead(health):
            break
    print 'GAME OVER!'


if __name__ == '__main__':
    main()
ll9
User
Beiträge: 34
Registriert: Samstag 9. Februar 2013, 15:13

Danke schonmal für eure beiden schnellen Antworten.
@BlackJack, mein Wissenstand ist leider noch nicht ganz auf den Niveau deiner Lösung, ich werde mich mit dieser Lösung weiter beschäftigen, wenn ich mehr gelernt habe.
@/me ok deine Lösung kann ich schon gut nachvollziehen.

Wenn ich jetzt also eine Variable x innerhalb von Funktionen einnbaue, dann funktioniert diese Variable nur bei dieser Funktion und für andere Funktionen ist x eine nicht definierte Variable?
BlackJack

@ll9: Wenn Du einen Namen innerhalb einer Funktion an einen Wert bindest, dann ist das ein lokaler Name, der nur innerhalb der Funktion sichtbar ist, und auch nur so lange existiert wie die Funktion abgearbeitet wird. Wenn die Namen in Funktionen auch ausserhalb sichtbar wären, dann müsste man sich ja für jede Funktion andere Namen ausdenken.
Antworten