Code ohne Kommentar
import pgzrun

WIDTH, HEIGHT = 500, 700


class UFO(Actor):
    def __init__(self, x, y):
        Actor.__init__(self, 'ufo')
        self.aktiv = True
        self.x = x
        self.y = y
        self.x_geschwindigkeit = 2
        self.y_geschwindigkeit = 1

    def aktualisiere(self):
        self.x += self.x_geschwindigkeit
        self.y += self.y_geschwindigkeit

        if self.left < 0 and self.x_geschwindigkeit < 0:
            self.x_geschwindigkeit *= -1

        if self.right > WIDTH and self.x_geschwindigkeit > 0:
            self.x_geschwindigkeit *= -1

        if self.top > HEIGHT:
            self.aktiv = False


class Spiel:
    def __init__(self):
        self.ufos = []


def update():
    for actor in spiel.ufos:
        actor.aktualisiere()

    spiel.ufos = [u for u in spiel.ufos if u.aktiv]

    if len(spiel.ufos) == 0:
        spiel.ufos = erzeuge_ufo_geschwader(12)


def erzeuge_ufo_geschwader(anzahl_ufos):
    return [UFO(i*40, -i*40) for i in range(0, anzahl_ufos)]


def draw():
    screen.fill((255, 255, 255))

    for actor in spiel.ufos:
        actor.draw()


spiel = Spiel()
pgzrun.go()

Code mit Kommentar

import pgzrun

WIDTH, HEIGHT = 500, 700


class UFO(Actor):
    def __init__(self, x, y):
        Actor.__init__(self, 'ufo')
        self.aktiv = True
        self.x = x
        self.y = y
        # Das Ufo hat eine horizontale (x) und eine vertikale (y) Geschwindigkeit:
        self.x_geschwindigkeit = 2
        self.y_geschwindigkeit = 1

    def aktualisiere(self):
        # Ensprechend werden die x- und die y-Positionen aktualisiert:
        self.x += self.x_geschwindigkeit
        self.y += self.y_geschwindigkeit
        
        # Wenn das Ufo links anstößt, wird die x-Geschwindigkeit umgekehrt:
        if self.left < 0 and self.x_geschwindigkeit < 0:
            self.x_geschwindigkeit *= -1

        # Wenn das Ufo rechts anstößt, wird ebenfalls die x-Geschwindigkeit umgekehrt:
        if self.right > WIDTH and self.x_geschwindigkeit > 0:
            self.x_geschwindigkeit *= -1
        
        # Wenn die Oberkante des Ufos unter der Unterkante des Fensters ist,
        # hat das Ufo das Fenster durchquert und wird deaktiviert:
        if self.top > HEIGHT:
            self.aktiv = False


class Spiel:
    def __init__(self):
        self.ufos = []


def update():
    for actor in spiel.ufos:
        actor.aktualisiere()

    # Ufos, die nicht mehr aktiv sind, werden aus der Ufo Liste entfernt.
    # Genauer: Es wird eine neue Liste erzeugt, in der nur die aktiven Ufos landen.
    spiel.ufos = [u for u in spiel.ufos if u.aktiv]
    
    # Wenn die Ufo-Liste leer ist, werden neue Ufos erzeugt:
    if len(spiel.ufos) == 0:
        spiel.ufos = erzeuge_ufo_geschwader(12)

# Diese Funktion liefert einen neuen Schwung Ufos:
def erzeuge_ufo_geschwader(anzahl_ufos):
    return [UFO(i*40, -i*40) for i in range(0, anzahl_ufos)]


def draw():
    screen.fill((255, 255, 255))

    for actor in spiel.ufos:
        actor.draw()


spiel = Spiel()
pgzrun.go()

Zuletzt geändert: Donnerstag, 27. Februar 2025, 17:43