Die Ufos
Abschlussbedingungen
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