mehrere Leben in einem Spiel

  • Hallo Tom,


    es freut mich natürlich immer, wenn meine Videos gefallen. Insbesondere, wenn der Zuschauer etwas jünger ist. Ich hoffe, dass ich das mit den Leben verständlich genug erklärt und nichts vergessen habe. Sonst einfach nachfragen, ein allfälliger Fehler kann schnell korrigiert werden.


    Ich wünsche euch auf jeden Fall viel Spass.


    Gruss

    René

  • Hallo René,

    vielen Danke für die schnelle, umfangreiche Antwort. Das wird wohl ein Vorhaben fürs nächste Wochenende, aber mittlerweile hast du wohl auch bei den 11-jährigen eine Anhängerschaft. :-)
    War wirklich eine coole Idee. Viele Grüße in die Schweiz.

  • Hallo Tom,


    hier ein Vorschlag:

    Die Anzahl Leben sind eine Angelegenheit des Spielers. Also fügen wir in der Spieleklasse eine Variable Leben ein.


    Python
    1. class Spieler(Actor):
    2. def __init__(self, x, y):
    3. super().__init__('run__000')
    4. self.aktiv = False
    5. self.leben = 2 ### Eigenschaft leben erstellen
    6. # Die Grundposition speichern
    7. self.baseX = x
    8. ...

    Beim Start müssen wir jetzt unterscheiden, ob es ein neues Spiel oder nur ein Neustart nach einem Lebensverlust ist. Damit die Methode start() noch wie bisher funktioniert, verwenden wir einen Parameter mit Defaultwert.

    Die Leben werden nur auf 2 gesetzt, wenn es sich um ein vollständig neues Spiel handelt.


    Code
    1. def start(self, restart=False):
    2. # Aufrecht stehender Spieler an der Grundposition
    3. if not restart: self.leben = 2 # Bei einem neuen Spiel auf 2 setzen
    4. self.x = self.baseX
    5. ...


    In kollision() wird ein Leben weggenommen. Dabei muss getestet werden, ob aller Leben aufgebraucht sind.

    Wenn nicht, könnte man hier einen Effekt einbauen. Ich verzichte aber darauf und setze darum nur pass ein.


    Code
    1. def kollision(self):
    2. self.leben -= 1 # Leben wegnehmen
    3. if self.leben:
    4. # Es sind noch Leben vorhanden
    5. pass
    6. else:
    7. # Alle Leben aufgebraucht
    8. self.angle = -90 # Spierler fällt um
    9. self.y = self.baseY # er liegt am Boden
    10. self.stopp()


    Damit hätte der Spieler alle notwendigen Fähigkeiten.

    Der Rest wird im Hauptprogramm erledigt.


    Zuerst müssen wir in zeichne_spielfeld() das Anzeigen der Leben vorbereiten.


    Code
    1. def zeichne_spielfeld(self):
    2. ...
    3. screen.draw.text(str(self.punkte), (WIDTH - 80, 10), fontsize=60, color=farbe_schrift)
    4. screen.draw.text(str(self.spieler.leben), (WIDTH - 80, 80), fontsize=60, color=farbe_schrift) ###
    5. if self.finished:
    6. ...

    Jetzt müssen wir in update() noch den Spielverlauf beeinflussen.

    Wenn eine Kollision erfolgt ist, teilen wird das dem Spieler mit spieler.kollision() mit.

    Danach wird getestet, ob noch Leben vorhanden sind.

    Wenn ja, lassen wir die Hindernisse verschwinden, starten den Spieler neu (mit der Option restart=True) und zeichnen alles neu. Danach brechen wir die Schleife ab, da jetzt alle Hindernisse verschwunden sind.


    Ich hoffe, das war nicht all zu verwirrend.

    Es ist nur eine Minimallösung. Man könnte noch visuelle Effekte oder Töne beim Verlust eines Lebens einbauen.


    Gruss

    René

  • Hallo Community,

    ich fand diese Spieleserie ganz interessant um meinem Sohn die Programmierung ein wenig schmackhaft zu machen. Und ja - es gefiehl ihm. Ein paar kleine Änderungen auszuprobieren machte ihm ebenso Spass. Nun meinte er, dass es eine Bereicherung für das Spiel wäre, wenn der kleine Ninia zwei Leben hätte und nicht gleich bei der ersten Kollision sein Leben lassen müsste. Ok, dachte ich - hört sich gar nicht so schwierig an, also habe ich einfach eine Variable "lebenspunkte" eingebaut, diese beim Start des Spielers auf 2 gesetzt und dann bei einer Kollision einen Wert > 0 abgefragt, um eine Aktion auszuführen bei der die Figur nicht gleich die nächste Kollision hat und den lebpunkte-Zähler um eins reduziert. Dies klappte auch mit dem Spieler, der dann noch nicht umfällt, doch lieder wird das Spiel auch in der "Hindernis-Klasse" gestoppt bzw. die Hindernisse und hier ist die Variable nicht bekannt. Auch die Variable in der Game-Klasse mit global zu deklarieren brachte mich nicht weiter. Vielleicht hat einer von euch einen Lösungsvorschlag. Vielen Dank !