Der Code ohne Kommentar
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)
        

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
            

class Spiel:
    def __init__(self):
        self.schiff = Schiff()
        self.raketen = []


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:
        actor.aktualisiere()
    spiel.schiff.aktualisiere()

    spiel.raketen = [r for r in spiel.raketen if r.aktiv]

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

    for actor in spiel.raketen:
        actor.draw()
    spiel.schiff.draw()


spiel = Spiel()
pgzrun.go()
Der Code mit Kommentar
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)

    # NEU: Funktion zum Starten von Raketen:
    def rakete_abfeuern(self):
        # Neue Rakete wird erzeugt, Startposition ist die Position des Raumschiffs
        rakete = Rakete(self.x, self.y - 50)
        # Die Rakete wird der Liste mit den Raketen hinzugefügt
        spiel.raketen.append(rakete)
        

# NEU: Klasse Rakete
class Rakete(Actor):
    def __init__(self, x, y):
        # Wie beim Schiff:
        Actor.__init__(self, 'rakete')
        # Ist die Rakete "lebendig"?
        self.aktiv = True
        self.x = x
        self.y = y
        # Die Geschwindigkeit, mit der die Rakete sich nach oben bewegt.
        self.geschwindigkeit = 10

    # NEU: Aktualisierung der Rakete:
    def aktualisiere(self):
        # Die Geschwindigkeit wird zur aktuellen y-Position hinzugefügt:
        self.y -= self.geschwindigkeit
        # Wenn die Rakete den Bildschirm durchquert hat, wird sie deaktiviert:
        if(self.top < 0):
            self.aktiv = False
            

class Spiel:
    def __init__(self):
        self.schiff = Schiff()
        # NEU: Liste für die Raketen
        self.raketen = []

# NEU: Die Funktion on_key_down wird automatisch vom System ausgeführt,
# wenn eine Taste gedrückt wurde:
def on_key_down():
    # Wenn die gedrückte Taste die Leertaste war...
    if keyboard.space:
        # ... dann wird eine Rakete abgefeuert:
        spiel.schiff.rakete_abfeuern()


def update():
    # NEU: Alle Raketen werden aktualisiert:
    for actor in spiel.raketen:
        actor.aktualisiere()
    spiel.schiff.aktualisiere()

    # NEU: nach dieser Zeile enthält spiel.raketen nur Raketen, die noch aktiv sind!
    # Genaueres hierzu unter "Wichtige Python Elemente 3: Listenabstraktionen"!
    spiel.raketen = [r for r in spiel.raketen if r.aktiv]

def draw():
    screen.fill((255, 255, 255))
    
    # NEU: Alle Raketen werden aktualisiert:
    for actor in spiel.raketen:
        actor.draw()
    spiel.schiff.draw()


spiel = Spiel()
pgzrun.go()
Zuletzt geändert: Donnerstag, 20. Februar 2025, 15:35