Version 01 komplett
Abschlussbedingungen
Code ohne Kommentar
import random, time, sys
import pgzrun
WIDTH, HEIGHT = 500, 700
class Schiff(Actor):
def __init__(self):
Actor.__init__(self, 'schiff')
self.bottom = HEIGHT
self.centerx = WIDTH / 2
self.geschwindigkeit = 6
def aktualisiere(self):
if keyboard.left:
self.x -= self.geschwindigkeit
if keyboard.right:
self.x += self.geschwindigkeit
self.clamp_ip(0, 0, WIDTH, HEIGHT)
def rakete_abfeuern(self):
rakete = Rakete(self.x, self.y - 50)
spiel.raketen.append(rakete)
def getroffen(self):
time.sleep(3)
sys.exit()
class Rakete(Actor):
def __init__(self, x, y):
Actor.__init__(self, 'rakete')
self.aktiv = True
self.x = x
self.y = y
self.geschwindigkeit = 10
def aktualisiere(self):
self.y -= self.geschwindigkeit
if(self.top < 0):
self.aktiv = False
for ufo in spiel.ufos:
if self.colliderect(ufo):
ufo.getroffen()
self.aktiv = False
return
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()
if self.colliderect(spiel.schiff):
spiel.schiff.getroffen()
def bombe_abwerfen(self):
spiel.bomben.append(Bombe(self.center))
def getroffen(self):
self.aktiv = False
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
if self.colliderect(spiel.schiff):
spiel.schiff.getroffen()
class Spiel:
def __init__(self):
self.schiff = Schiff()
self.raketen = []
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 on_key_down():
if keyboard.space:
spiel.schiff.rakete_abfeuern()
def update():
for actor in spiel.raketen + spiel.bomben + spiel.ufos:
actor.aktualisiere()
spiel.schiff.aktualisiere()
spiel.raketen = [r for r in spiel.raketen if r.aktiv]
spiel.ufos = [u for u in spiel.ufos if u.aktiv]
spiel.bomben = [b for b in spiel.bomben if b.aktiv]
if len(spiel.ufos) == 0:
spiel.ufos = erzeuge_ufo_geschwader(12)
def draw():
screen.fill((255, 255, 255))
for actor in spiel.raketen + spiel.bomben + spiel.ufos:
actor.draw()
spiel.schiff.draw()
spiel = Spiel()
pgzrun.go()
Code mit Kommentar
import random, time, sys
import pgzrun
WIDTH, HEIGHT = 500, 700
class Schiff(Actor):
def __init__(self):
Actor.__init__(self, 'schiff')
self.bottom = HEIGHT
self.centerx = WIDTH / 2
self.geschwindigkeit = 6
def aktualisiere(self):
if keyboard.left:
self.x -= self.geschwindigkeit
if keyboard.right:
self.x += self.geschwindigkeit
self.clamp_ip(0, 0, WIDTH, HEIGHT)
def rakete_abfeuern(self):
rakete = Rakete(self.x, self.y - 50)
spiel.raketen.append(rakete)
# NEU: Funktion, die aufgerufen wird, wenn das Schiff getroffen wurde:
def getroffen(self):
# Drei Sekunden warten:
time.sleep(3)
# Programm beenden:
sys.exit()
class Rakete(Actor):
def __init__(self, x, y):
Actor.__init__(self, 'rakete')
self.aktiv = True
self.x = x
self.y = y
self.geschwindigkeit = 10
def aktualisiere(self):
self.y -= self.geschwindigkeit
if(self.top < 0):
self.aktiv = False
# NEU: Für jedes Ufo überprüfen, ob es mit dieser Rakete kollidiert ist:
for ufo in spiel.ufos:
if self.colliderect(ufo):
# Wenn ja: ufo.getroffen ausführen und Raktete deaktiveren:
ufo.getroffen()
self.aktiv = False
# Eine Rakete kann nicht mehrere Ufos treffen, daher wird hier die Schleife verlassen:
return
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()
# NEU: Wenn das Ufo mit dem Raumschiff kollidiert, ist das Schiff getroffen:
if self.colliderect(spiel.schiff):
spiel.schiff.getroffen()
def bombe_abwerfen(self):
spiel.bomben.append(Bombe(self.center))
# NEU. aber wie gehabt...
def getroffen(self):
self.aktiv = False
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
# NEU, aber wie gehabt:
if self.colliderect(spiel.schiff):
spiel.schiff.getroffen()
class Spiel:
def __init__(self):
self.schiff = Schiff()
self.raketen = []
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 on_key_down():
if keyboard.space:
spiel.schiff.rakete_abfeuern()
def update():
for actor in spiel.raketen + spiel.bomben + spiel.ufos:
actor.aktualisiere()
spiel.schiff.aktualisiere()
spiel.raketen = [r for r in spiel.raketen if r.aktiv]
spiel.ufos = [u for u in spiel.ufos if u.aktiv]
spiel.bomben = [b for b in spiel.bomben if b.aktiv]
if len(spiel.ufos) == 0:
spiel.ufos = erzeuge_ufo_geschwader(12)
def draw():
screen.fill((255, 255, 255))
for actor in spiel.raketen + spiel.bomben + spiel.ufos:
actor.draw()
spiel.schiff.draw()
spiel = Spiel()
pgzrun.go()
Zuletzt geändert: Donnerstag, 20. Februar 2025, 14:07