# Schritt 4: Kollisionserkennung und Punkte import pygame import sys import random # Pygame initialisieren pygame.init() # Bildschirmgröße festlegen BREITE = 400 HOEHE = 600 # Farben definieren HIMMEL_BLAU = (135, 206, 250) GELB = (255, 255, 0) ORANGE = (255, 165, 0) GRUEN = (0, 200, 0) DUNKELGRUEN = (0, 150, 0) WEISS = (255, 255, 255) ROT = (255, 0, 0) # Fenster erstellen bildschirm = pygame.display.set_mode((BREITE, HOEHE)) pygame.display.set_caption("Flappy Bird") # Schriftart für Punkte schrift = pygame.font.Font(None, 50) kleine_schrift = pygame.font.Font(None, 30) # Spieluhr für FPS-Kontrolle uhr = pygame.time.Clock() # Vogel-Klasse class Vogel: def __init__(self): self.x = 50 self.y = HOEHE // 2 self.radius = 20 self.geschwindigkeit_y = 0 self.schwerkraft = 0.5 self.sprungkraft = -8 def springen(self): self.geschwindigkeit_y = self.sprungkraft def bewegen(self): self.geschwindigkeit_y += self.schwerkraft self.y += self.geschwindigkeit_y if self.y < self.radius: self.y = self.radius self.geschwindigkeit_y = 0 elif self.y > HOEHE - self.radius: self.y = HOEHE - self.radius self.geschwindigkeit_y = 0 def zeichnen(self): pygame.draw.circle(bildschirm, GELB, (int(self.x), int(self.y)), self.radius) schnabel = [ (self.x + 15, self.y), (self.x + 25, self.y - 5), (self.x + 25, self.y + 5), ] pygame.draw.polygon(bildschirm, ORANGE, schnabel) pygame.draw.circle(bildschirm, (0, 0, 0), (int(self.x + 5), int(self.y - 5)), 3) def get_rect(self): return pygame.Rect( self.x - self.radius, self.y - self.radius, self.radius * 2, self.radius * 2 ) # Rohr-Klasse class Rohr: def __init__(self, x): self.x = x self.breite = 60 self.luecke = 150 self.luecke_y = random.randint(150, HOEHE - 150) self.geschwindigkeit = 3 self.vorbei = False def bewegen(self): self.x -= self.geschwindigkeit def zeichnen(self): # Oberes Rohr pygame.draw.rect( bildschirm, GRUEN, (self.x, 0, self.breite, self.luecke_y - self.luecke // 2), ) pygame.draw.rect( bildschirm, DUNKELGRUEN, (self.x - 5, self.luecke_y - self.luecke // 2 - 30, self.breite + 10, 30), ) # Unteres Rohr pygame.draw.rect( bildschirm, GRUEN, (self.x, self.luecke_y + self.luecke // 2, self.breite, HOEHE), ) pygame.draw.rect( bildschirm, DUNKELGRUEN, (self.x - 5, self.luecke_y + self.luecke // 2, self.breite + 10, 30), ) def ist_ausserhalb(self): return self.x + self.breite < 0 def kollision(self, vogel): vogel_rect = vogel.get_rect() # Oberes Rohr oberes_rohr = pygame.Rect( self.x, 0, self.breite, self.luecke_y - self.luecke // 2 ) # Unteres Rohr unteres_rohr = pygame.Rect( self.x, self.luecke_y + self.luecke // 2, self.breite, HOEHE ) return vogel_rect.colliderect(oberes_rohr) or vogel_rect.colliderect( unteres_rohr ) def punkt_erzielt(self, vogel): if not self.vorbei and vogel.x > self.x + self.breite: self.vorbei = True return True return False # Spielvariablen vogel = Vogel() rohre = [] rohr_timer = 0 punkte = 0 game_over = False # Hauptspielschleife laeuft = True while laeuft: # Events verarbeiten for ereignis in pygame.event.get(): if ereignis.type == pygame.QUIT: laeuft = False elif ereignis.type == pygame.KEYDOWN: if ereignis.key == pygame.K_SPACE: if not game_over: vogel.springen() else: # Neustart vogel = Vogel() rohre = [] rohr_timer = 0 punkte = 0 game_over = False if not game_over: # Spiellogik vogel.bewegen() # Neue Rohre erstellen rohr_timer += 1 if rohr_timer > 90: rohre.append(Rohr(BREITE)) rohr_timer = 0 # Rohre bewegen, Kollision prüfen und Punkte zählen for rohr in rohre[:]: rohr.bewegen() if rohr.ist_ausserhalb(): rohre.remove(rohr) if rohr.kollision(vogel): game_over = True if rohr.punkt_erzielt(vogel): punkte += 1 # Zeichnen bildschirm.fill(HIMMEL_BLAU) for rohr in rohre: rohr.zeichnen() vogel.zeichnen() # Punkte anzeigen punkte_text = schrift.render(str(punkte), True, WEISS) punkte_rect = punkte_text.get_rect(center=(BREITE // 2, 50)) bildschirm.blit(punkte_text, punkte_rect) # Game Over Nachricht if game_over: game_over_text = schrift.render("GAME OVER", True, ROT) game_over_rect = game_over_text.get_rect(center=(BREITE // 2, HOEHE // 2 - 50)) bildschirm.blit(game_over_text, game_over_rect) restart_text = kleine_schrift.render("Leertaste für Neustart", True, WEISS) restart_rect = restart_text.get_rect(center=(BREITE // 2, HOEHE // 2 + 20)) bildschirm.blit(restart_text, restart_rect) # Bildschirm aktualisieren pygame.display.flip() uhr.tick(60) pygame.quit() sys.exit()