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