Der Code ohne Kommentar
from random import choice, uniform
from enum import Enum
import pgzrun
from pgzblasterutils import sinus_oszillator, dreieck_oszillator, entscheide

WIDTH, HEIGHT = 500, 700
W, H = WIDTH, HEIGHT
WH, HH = W/2, H/2

UFO_SPRITES = ['ufo01', 'ufo02', 'ufo03', 'ufo04', 'ufo05']


class Zustand(Enum):
    BEREIT = 0
    SPIEL = 1
    GETROFFEN = 2
    SPIEL_VORBEI = 3


class UFO(Actor):
    def __init__(self, y_linear, x1_freq, x2_freq, y_freq, zeit_versatz, abwurf_rate):
        Actor.__init__(self, choice(UFO_SPRITES))
        self.aktiv = True
        self.y_linear = y_linear
        self.y = y_linear
        self.y_vel = 1
        self.x1_freq = x1_freq
        self.x2_freq = x2_freq
        self.y_freq = y_freq
        self.zeit_versatz = zeit_versatz
        self.abwurf_rate = abwurf_rate

    def aktualisiere(self):
        x1_oszillator = dreieck_oszillator(self.x1_freq, 0, WH, self.zeit_versatz)
        x2_oszillator = dreieck_oszillator(self.x2_freq, 0, WH, self.zeit_versatz)
        y_oszillator = dreieck_oszillator(self.y_freq, -50, 50, self.zeit_versatz)

        self.x = x1_oszillator + x2_oszillator
        self.y_linear += self.y_vel
        self.y = self.y_linear + y_oszillator

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


class UfoFabrik():
    def __init__(self):
        self.anzahl_ufos = 7
        self.x1_freq = 0.1
        self.x2_freq = 0.1
        self.y_freq = 0.1
        self.zeit_versatz = 0.3
        self.abwurf_rate = 0.002

    def erzeuge_ufo_geschwader(self):
        geschwader = [UFO((i*-40) - H / 4,
                      self.x1_freq,
                      self.x2_freq,
                      self.y_freq,
                      i * self.zeit_versatz,
                      self.abwurf_rate)
                  for i in range(0, self.anzahl_ufos)]
        self.erhoehe_schwierigkeit()
        return geschwader

    def erhoehe_schwierigkeit(self):
        self.anzahl_ufos += 1
        self.x1_freq += uniform(0, 0.05)
        self.x2_freq += uniform(0, 0.05)
        self.y_freq += uniform(0, 0.05)
        self.zeit_versatz += uniform(0, 0.2)
        self.abwurf_rate += 0.0005


class Spiel:
    def __init__(self):
        self.zustand = Zustand.BEREIT
        self.ufos = []
        self.ufo_fabrik = UfoFabrik()

    def initialisiere_spielobjekte(self):
        self.ufos = []

    def aktualisiere(self):
        for spielobjekte in self.ufos:
            spielobjekte.aktualisiere()

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

        if len(spiel.ufos) == 0:
            self.ufos = self.ufo_fabrik.erzeuge_ufo_geschwader()


def textnachricht(text):
    screen.draw.text(text,
                    center=(WH, HH),
                    color="black",
                    fontsize=40)


def on_key_down():
    if spiel.zustand == Zustand.BEREIT:
        spiel.zustand = Zustand.SPIEL
        return


def update():
    if spiel.zustand == Zustand.SPIEL:
        spiel.aktualisiere()


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

    if spiel.zustand == Zustand.BEREIT:
        textnachricht("PRESS ANY KEY TO START")

    if spiel.zustand == Zustand.SPIEL:
        for actor in spiel.ufos:
            actor.draw()


spiel = Spiel()
pgzrun.go()
Der Code mit Kommentar
from random import choice, uniform
from enum import Enum
import pgzrun
from pgzblasterutils import sinus_oszillator, dreieck_oszillator, entscheide

WIDTH, HEIGHT = 500, 700
W, H = WIDTH, HEIGHT
WH, HH = W/2, H/2

# NEU: Mehrere Ufo-Sprites zur Auswahl:
UFO_SPRITES = ['ufo01', 'ufo02', 'ufo03', 'ufo04', 'ufo05']


# NEU: Zustände für den Zustandsautomaten:
class Zustand(Enum):
    BEREIT = 0
    SPIEL = 1
    GETROFFEN = 2
    SPIEL_VORBEI = 3


class UFO(Actor):
    def __init__(self, y_linear, x1_freq, x2_freq, y_freq, zeit_versatz, abwurf_rate):
        Actor.__init__(self, choice(UFO_SPRITES))
        self.aktiv = True
        # NEU: Die nächsten 7 Eigegenschaften steuern das Bewegungsmuster des Ufos:
        self.y_linear = y_linear
        self.y = y_linear
        self.y_vel = 1
        self.x1_freq = x1_freq
        self.x2_freq = x2_freq
        self.y_freq = y_freq
        self.zeit_versatz = zeit_versatz
        self.abwurf_rate = abwurf_rate

    # NEU: Aktualisierung der Position mittels dreier Oszillationen.
    # x steht für waagerechte, y für senkrechte Oszillation:
    def aktualisiere(self):
        x1_oszillator = dreieck_oszillator(self.x1_freq, 0, WH, self.zeit_versatz)
        x2_oszillator = dreieck_oszillator(self.x2_freq, 0, WH, self.zeit_versatz)
        y_oszillator = dreieck_oszillator(self.y_freq, -50, 50, self.zeit_versatz)

        self.x = x1_oszillator + x2_oszillator
        self.y_linear += self.y_vel
        self.y = self.y_linear + y_oszillator

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


# NEU: Die Ufo-Fabrik erzeugt Ufo-Geschwader.
class UfoFabrik():
    def __init__(self):
        # Diese Eigenschaften der Ufo-Fabrik steuern die Bewegungsmuster
        # der erzeugten Ufos:
        self.anzahl_ufos = 7
        self.x1_freq = 0.1
        self.x2_freq = 0.1
        self.y_freq = 0.1
        self.zeit_versatz = 0.3
        self.abwurf_rate = 0.002

     
    def erzeuge_ufo_geschwader(self):
        # Erzeugung des Geschwaders mittels Listenabstraktion:
        geschwader = [UFO((i*-40) - H / 4,
                                                self.x1_freq,
                                                self.x2_freq,
                                                self.y_freq,
                                                i * self.zeit_versatz,
                                                self.abwurf_rate)
                                     for i in range(0, self.anzahl_ufos)]
        # Danach: Erhöhung der Schwierigkeit!:
        self.erhoehe_schwierigkeit()
        return geschwader

    # Die Schwierigkeit wird erhöht, indem die Anzahl der Ufos pro Geschwader,
    # die Frequenzen der Oszillatoren und die Abwurfrate erhöht wird:
    def erhoehe_schwierigkeit(self):
        self.anzahl_ufos += 1
        self.x1_freq += uniform(0, 0.05)
        self.x2_freq += uniform(0, 0.05)
        self.y_freq += uniform(0, 0.05)
        self.zeit_versatz += uniform(0, 0.2)
        self.abwurf_rate += 0.0005


# NEU: Zu Beginn ist das Spiel im Zustand bereit.
# Neben der Liste für die Ufos wird die Ufo-Fabrik erzeugt:
class Spiel:
    def __init__(self):
        self.zustand = Zustand.BEREIT
        self.ufos = []
        self.ufo_fabrik = UfoFabrik()

    def initialisiere_spielobjekte(self):
        self.ufos = []

    def aktualisiere(self):
        for spielobjekte in self.ufos:
            spielobjekte.aktualisiere()

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

        if len(spiel.ufos) == 0:
            self.ufos = self.ufo_fabrik.erzeuge_ufo_geschwader()


def textnachricht(text):
    screen.draw.text(text,
                    center=(WH, HH),
                    color="black",
                    fontsize=40)


def on_key_down():
    if spiel.zustand == Zustand.BEREIT:
        spiel.zustand = Zustand.SPIEL
        return


def update():
    if spiel.zustand == Zustand.SPIEL:
        spiel.aktualisiere()


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

    if spiel.zustand == Zustand.BEREIT:
        textnachricht("PRESS ANY KEY TO START")

    if spiel.zustand == Zustand.SPIEL:
        for actor in spiel.ufos:
            actor.draw()


spiel = Spiel()
pgzrun.go()
Zuletzt geändert: Donnerstag, 27. März 2025, 06:58