🐍 Python Lernen

Kurs 2: FlappyBird programmieren

Setup
Grundgerüst
Vogel
Rohre
Spiellogik
Finish

Einführung

In diesem Kurs programmieren wir gemeinsam ein FlappyBird-Spiel! Du lernst dabei wichtige Konzepte der Spieleprogrammierung kennen:

  • Grafiken und Animationen mit Pygame
  • Spielschleifen und Events
  • Kollisionserkennung
  • Punktezählung und Game Over
Wichtig: Arbeite die Schritte der Reihe nach durch. Jeder Schritt baut auf dem vorherigen auf!

Projekt Setup

1. Projektordner erstellen

Öffne PowerShell und erstelle ein neues Projekt:

cd C:\MeinePythonProjekte
uv init flappybird
cd flappybird

2. Pygame installieren

Wir brauchen die Pygame-Bibliothek für unser Spiel:

uv add pygame

3. Projekt in VS Code öffnen

code .
💡 Details: Wie startet ein Computer ein Programm?

Wenn du ein Python-Programm startest, passiert folgendes:

  1. Der Computer lädt den Python-Interpreter: Das ist ein Programm, das deinen Python-Code versteht und ausführt.
  2. Der Interpreter liest deine Datei: Zeile für Zeile wird dein Code gelesen.
  3. Der Code wird ausgeführt: Der Computer führt die Befehle aus, die du geschrieben hast.

Die Main-Funktion: In vielen Programmiersprachen gibt es eine spezielle "Main"-Funktion. Sie ist der Startpunkt deines Programms – wie die erste Seite in einem Buch. In Python ist das oft der Code, der nicht in einer Funktion steht, oder Code unter if __name__ == "__main__":. Das sagt Python: "Starte hier, wenn jemand dieses Programm direkt ausführt!"

Schritt 1: Grundgerüst erstellen

Erstelle eine neue Datei flappybird.py und füge folgenden Code ein:

📄 Code ansehen: flappybird_schritt1.py

Was macht dieser Code?

  • pygame.init() - Startet Pygame
  • bildschirm - Unser Spielfenster (400x600 Pixel)
  • while laeuft: - Die Hauptspielschleife, die 60x pro Sekunde läuft
  • pygame.QUIT - Prüft, ob das Fenster geschlossen wurde

Teste das Programm

uv run python flappybird.py

Du solltest ein blaues Fenster sehen!

💡 Details: Was ist eine Variable?

Eine Variable ist wie eine Schachtel mit einem Namen drauf, in die du Dinge hineinlegen kannst.

Zum Beispiel: laeuft = True bedeutet "Erstelle eine Schachtel namens 'laeuft' und lege 'True' (Wahr) hinein".

Warum brauchen wir Variablen?

  • Um Werte zu speichern (z.B. die Position des Vogels)
  • Um Werte zu ändern (z.B. die Punktzahl erhöhen)
  • Um Code lesbar zu machen (z.B. bildschirm statt einer langen Erklärung)
💡 Details: Was ist eine Schleife (Loop)?

Eine Schleife wiederholt Code mehrmals automatisch.

Die while-Schleife bedeutet: "Solange diese Bedingung wahr ist, wiederhole den Code darin."

In unserem Spiel haben wir:

while laeuft:
    # Hier steht der Code, der immer wieder läuft

Warum brauchen wir Schleifen?

  • Spiele müssen ständig aktualisiert werden (60x pro Sekunde!)
  • Ohne Schleife würde das Programm sofort enden
  • Die Schleife macht aus einem Bild einen Film
💡 Details: Die Hauptteile eines Spiels

Jedes Spiel besteht aus drei Hauptteilen, die in einer Schleife ablaufen:

  1. Eingabe verarbeiten: Was macht der Spieler? (Tastatur, Maus, Controller)
  2. Spiellogik berechnen: Was passiert im Spiel? (Bewegung, Kollision, Punkte)
  3. Alles zeichnen: Zeige das Ergebnis auf dem Bildschirm

Diese drei Schritte werden 60x pro Sekunde wiederholt – so entsteht flüssiges Gameplay!

while spiel_läuft:
    1. Eingaben lesen
    2. Spiel aktualisieren
    3. Bildschirm zeichnen

Schritt 2: Vogel hinzufügen

Jetzt fügen wir unseren Vogel hinzu, der durch Schwerkraft fällt und springen kann:

📄 Code ansehen: flappybird_schritt2.py

Die Vogel-Klasse

Unser Vogel hat folgende Eigenschaften:

  • x, y - Position auf dem Bildschirm
  • radius - Größe des Vogels
  • geschwindigkeit_y - Wie schnell er fällt/steigt
  • schwerkraft - Zieht den Vogel nach unten
  • sprungkraft - Wie stark der Vogel springt

Methoden verstehen

  • springen() - Wird bei Leertaste aufgerufen
  • bewegen() - Aktualisiert Position (Schwerkraft wirkt)
  • zeichnen() - Malt den Vogel auf den Bildschirm
Teste es: Drücke die Leertaste, um den Vogel springen zu lassen!
💡 Details: Was ist eine Funktion?

Eine Funktion ist wie ein Rezept für den Computer: eine Liste von Anweisungen mit einem Namen.

Zum Beispiel: springen() ist eine Funktion, die den Vogel nach oben bewegt.

Warum brauchen wir Funktionen?

  • Um Code zu organisieren (alles an einem Ort)
  • Um Code wiederzuverwenden (einmal schreiben, oft aufrufen)
  • Um Code lesbar zu machen (Name sagt, was passiert)

Statt jedes Mal alle Zeilen zu schreiben, rufst du einfach vogel.springen() auf!

Schritt 3: Rohre hinzufügen

Zeit für Hindernisse! Wir fügen die grünen Rohre hinzu:

📄 Code ansehen: flappybird_schritt3.py

Die Rohr-Klasse

Jedes Rohr besteht aus:

  • Einem oberen Teil (von oben)
  • Einem unteren Teil (von unten)
  • Einer Lücke dazwischen (wo der Vogel durchfliegen kann)

Rohr-Verwaltung

# Neue Rohre alle 1.5 Sekunden
if rohr_timer > 90:  # 90 Frames bei 60 FPS = 1.5 Sekunden
    rohre.append(Rohr(BREITE))
    rohr_timer = 0
Cool! Die Rohre bewegen sich automatisch von rechts nach links!

Schritt 4: Kollision und Punkte

Jetzt wird es spannend - wir fügen Kollisionserkennung und Punktezählung hinzu:

📄 Code ansehen: flappybird_schritt4.py

Kollisionserkennung

Wir prüfen, ob der Vogel ein Rohr berührt:

def kollision(self, vogel):
    vogel_rect = vogel.get_rect()
    oberes_rohr = pygame.Rect(...)
    unteres_rohr = pygame.Rect(...)
    return vogel_rect.colliderect(oberes_rohr) or vogel_rect.colliderect(unteres_rohr)

Punkte zählen

Ein Punkt wird vergeben, wenn der Vogel ein Rohr erfolgreich passiert:

if rohr.punkt_erzielt(vogel):
    punkte += 1

Game Over und Neustart

  • Bei Kollision: game_over = True
  • Leertaste drücken für Neustart
  • Alle Variablen werden zurückgesetzt
💡 Details: Was ist der Unterschied zwischen synchron und asynchron?

Synchron (Sync) bedeutet: Eine Sache nach der anderen, Schritt für Schritt.

Unser Spiel läuft synchron: Erst werden Eingaben verarbeitet, dann bewegt sich alles, dann wird gezeichnet. Alles in fester Reihenfolge.

Asynchron (Async) bedeutet: Mehrere Dinge können gleichzeitig passieren.

Zum Beispiel: Ein Spiel lädt im Hintergrund neue Level, während du das aktuelle Level spielst. Oder eine Website lädt Bilder, während du schon den Text lesen kannst.

In unserem Spiel:

  • Die Hauptschleife ist synchron – alles läuft der Reihe nach
  • Wenn wir Sounds abspielen würden, wären diese asynchron – sie laufen parallel zum Spiel

Das finale Spiel

Die finale Version enthält viele Verbesserungen:

📄 Code ansehen: flappybird_final.py

Neue Features

  • 🎨 Verbesserte Grafik mit Schatten
  • ☁️ Animierte Wolken im Hintergrund
  • 🏆 Highscore-System
  • 🎮 Startbildschirm
  • 🦅 Flügelanimation beim Springen
  • 🌱 Boden mit Gras
  • 📐 Vogel neigt sich beim Fliegen

🎉 Geschafft!

Du hast dein eigenes FlappyBird-Spiel programmiert! Probiere es aus und versuche deinen Highscore zu schlagen!

Eigene Ideen umsetzen

Herausforderungen für dich:

  • 🎨 Ändere die Farben des Vogels
  • ⚡ Mache das Spiel schneller (erhöhe self.geschwindigkeit)
  • 🕳️ Verändere die Lückengröße (self.luecke)
  • 🌟 Füge Power-Ups hinzu (z.B. Unverwundbarkeit)
  • 🎵 Füge Soundeffekte hinzu (mit pygame.mixer)
  • 🖼️ Lade echte Bilder statt Formen zu zeichnen

Sounds hinzufügen (Beispiel)

# Am Anfang
pygame.mixer.init()
sprung_sound = pygame.mixer.Sound("sprung.wav")
punkt_sound = pygame.mixer.Sound("punkt.wav")

# Beim Springen
def springen(self):
    self.geschwindigkeit_y = self.sprungkraft
    sprung_sound.play()

# Bei Punkt
if rohr.punkt_erzielt(vogel):
    punkte += 1
    punkt_sound.play()

Tipps und Tricks

Probleme lösen

Das Spiel läuft zu langsam:

  • Stelle sicher, dass uhr.tick(60) vorhanden ist
  • Reduziere die Anzahl der Wolken

Der Vogel bewegt sich komisch:

  • Überprüfe die Werte für schwerkraft und sprungkraft
  • Kleinere Werte = langsamere Bewegung

Pygame findet die Module nicht:

uv sync
uv run python flappybird.py

Was hast du gelernt?

Programmierkonzepte

  • Klassen und Objekte: Vogel und Rohr sind Klassen
  • Spielschleife: Update → Zeichnen → Wiederholen
  • Event-Handling: Tastatureingaben verarbeiten
  • Kollisionserkennung: Rechteck-Überschneidungen prüfen
  • Listen: Mehrere Rohre verwalten
  • Zufallszahlen: Rohrhöhen zufällig generieren
  • Animation: Bewegung durch Position-Updates

Bereit für den nächsten Schritt?

Super! Im nächsten Kurs bringen wir dein Spiel ins Internet, damit deine Freunde es spielen können!

Weiter zu Kurs 3: Web-Export →