Ufos und Bomben
Abschlussbedingungen
Code ohne Kommentar
import random, time, sys
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
self.abwurf_rate = 0.007
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
if entscheide(self.abwurf_rate) and self.top > 0:
self.bombe_abwerfen()
def bombe_abwerfen(self):
spiel.bomben.append(Bombe(self.center))
class Bombe(Actor):
def __init__(self, center):
Actor.__init__(self, 'bombe')
self.aktiv = True
self.center = center
self.geschwindigkeit = 5
def aktualisiere(self):
self.y += self.geschwindigkeit
if self.top > HEIGHT:
self.aktiv= False
class Spiel:
def __init__(self):
self.ufos = []
self.bomben = []
def erzeuge_ufo_geschwader(anzahl_ufos):
return [UFO(i*40, -i*40) for i in range(0, anzahl_ufos)]
def entscheide(wahrscheinlichkeit):
return random.random() < wahrscheinlichkeit
def update():
for actor in spiel.ufos + spiel.bomben:
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 draw():
screen.fill((255, 255, 255))
for actor in spiel.ufos + spiel.bomben:
actor.draw()
spiel = Spiel()
pgzrun.go()
Code mit Kommentar
# NEU: Importe für Zufallszahlen, Zeit und Systemfunktionen:
import random, time, sys
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
# NEU: Die Wahrscheinlichkeit, dass bei Aktualisierung eine Bombe abgeworfen wird:
self.abwurf_rate = 0.007
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
# NEU: Entscheiden, ob eine Bombe abgeworfen wird:
if entscheide(self.abwurf_rate) and self.top > 0:
self.bombe_abwerfen()
# Die Funktion erzeugt die Bombe und fügt sie direkt der Liste hinzu:
def bombe_abwerfen(self):
spiel.bomben.append(Bombe(self.center))
# Neu, aber wie gehabt:
class Bombe(Actor):
def __init__(self, center):
Actor.__init__(self, 'bombe')
self.aktiv = True
self.center = center
self.geschwindigkeit = 5
def aktualisiere(self):
self.y += self.geschwindigkeit
if self.top > HEIGHT:
self.aktiv= False
class Spiel:
def __init__(self):
self.ufos = []
self.bomben = []
def erzeuge_ufo_geschwader(anzahl_ufos):
return [UFO(i*40, -i*40) for i in range(0, anzahl_ufos)]
# NEU: Diese Funktion liefert True oder False.
# Wenn wahrscheinlichkeit gleich 0 ist, dann immer False.
# Wenn wahrscheinlichkeit gleich 1 ist, dann immer True.
# Bei zum Beispiel wahrscheinlichkeit 0.25 in einem Viertel aller Fälle True, sonst False
def entscheide(wahrscheinlichkeit):
return random.random() < wahrscheinlichkeit
def update():
for actor in spiel.ufos + spiel.bomben:
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 draw():
screen.fill((255, 255, 255))
for actor in spiel.ufos + spiel.bomben:
actor.draw()
spiel = Spiel()
pgzrun.go()
Zuletzt geändert: Donnerstag, 20. Februar 2025, 15:35