Der Zombie-Simulator

Survival-Game mit dynamischer KI & State-Logic

Python 3.x Pygame Library Vector Math Mask Collision Game State Management Dynamic Difficulty

Dieses Projekt ist ein Top-Down Survival-Game, entwickelt mit Pygame. Der Spieler muss sich gegen immer größer werdende Horden von Zombies verteidigen. Das Spiel demonstriert wichtige Konzepte der 2D-Spieleentwicklung, darunter Kollisionserkennung, dynamische Schwierigkeit und effektives Sound-Management.

Startbildschirm des Zombie-Simulators

Der Startbildschirm lädt zum Überleben ein.

Game Over Bildschirm

Wenn die Gesundheit auf Null fällt – der Game Over Screen.

Gameplay Eindrücke

Gameplay Szene 1

Erste Minuten im Spiel – die Bedrohung wächst.

Gameplay Szene 2

Das Sammeln von Power-Ups kann das Blatt wenden.

Vektorgestützte KI

Die Zombie-Gegner verfolgen den Spieler mithilfe von pygame.Vector2. Durch die Normalisierung der Vektoren wird eine konstante Bewegungsgeschwindigkeit gewährleistet.

Pixel-perfekte Kollision

Anstelle einfacher Rechteckkollisionen verwendet das Spiel pygame.mask. Dies ermöglicht eine präzise, Pixel-genaue Kollisionsabfrage zwischen Spieler und Gegnern.

Sound-Management

Mittels pygame.mixer.Channel werden Soundeffekte auf separaten Audiokanälen abgespielt, um Überlagerungen und Sound-Clipping zu verhindern.

Dynamische Schwierigkeit

Ein Level-System erhöht mit steigendem Score die Spawn-Rate der Zombies. Die Spawn-Zeit wird schrittweise reduziert, wodurch das Spiel kontinuierlich anspruchsvoller wird.

Einblicke in den Code

1. Initialisierung und Sound-Setup

Die Codebasis startet mit der Initialisierung von Pygame und der Konfiguration des Audio-Mixers, um mehrere Sounds gleichzeitig zu verwalten:

import pygame
import sys
import random
import os

pygame.init()
pygame.mixer.init()
pygame.mixer.set_num_channels(8) # Acht Kanäle für diverse Sounds

2. Spieler-Bewegung und Blickrichtung

Die Spielerbewegung wird über Tastatureingaben gesteuert. Gleichzeitig wird die Blickrichtung des Spielers angepasst, indem das Bild des Spielers horizontal gespiegelt wird:

keys = pygame.key.get_pressed()
dx = dy = 0
if keys[pygame.K_LEFT] or keys[pygame.K_a]: dx -= speed
# ... weitere Bewegungen ...

if dx < 0:
    player_facing_right = False
elif dx > 0:
    player_facing_right = True

3. Gegner-KI: Verfolgung und Kollision

Zombies bewegen sich direkt auf den Spieler zu. Bei Kontakt wird der Spieler verletzt, der Zombie entfernt und ein visueller "Hit-Flash" ausgelöst:

player_center = pygame.Vector2(player.center)
for e in enemies:
    enemy_center = pygame.Vector2(e.center)
    dir_vec = player_center - enemy_center
    if dir_vec.length() != 0:
        dir_vec = dir_vec.normalize()
    move = dir_vec * enemy_speed
    e.move_ip(move.x, move.y)

    offset = (e.left - player.left, e.top - player.top)
    if player_mask.overlap(enemy_mask, offset):
        enemies.remove(e)
        player_health -= damage
        hit_flash_until = pygame.time.get_ticks() + HIT_FLASH_DURATION_MS
        # ... weitere Logik für Treffer und Game Over