Bachelorthesis: Levelgenerierung mit künstlicher Intelligenz

Von Moritz Leopold

Erstellt am 10. June 2025


Im Rahmen meiner Bachelorarbeit an der Technischen Hochschule Augsburg untersuchte ich die Kombination zweier aktueller Ansätze zur KI-basierten Spielentwicklung: die textbasierte Generierung von Spielinhalten durch Large Language Models (LLMs) und die automatisierte Bewertung spielbarer Inhalte durch Reinforcement Learning (RL).

Ein Agent spielt automatisiert die generierten Level und sammelt Werte zur Validierung.

Ein Agent spielt automatisiert die generierten Level und sammelt Werte zur Validierung.


🔍 Stand der Technik

Procedural Content Generation

Prozedurale Levelgenerierung ist etabliert in der Spieleentwicklung. Klassische Methoden arbeiten regelbasiert oder zufällig – jedoch selten kontextsensitiv.

LLMs zur Levelgenerierung

Neuere Arbeiten zeigen, dass Sprachmodelle wie GPT-4 oder DeepSeek in der Lage sind, strukturierte Spielinhalte (z. B. JSON, XML, oder Doom-WAD) aus Prompt-Text zu erzeugen.

RL zur Evaluation

Anstatt Level manuell zu testen, wurde ein RL-Agent trainiert, der die Spielbarkeit, Schwierigkeit und Navigierbarkeit eines Levels bewertet – rein durch seine Interaktion mit dem generierten Raum.

ViZDoom als Plattform

ViZDoom bietet eine visuelle, steuerbare FPS-Umgebung auf Basis der Doom-Engine – mit API-Zugriff, .wad/.cfg-Levelunterstützung und hoher Modifizierbarkeit.


🧠 Konzeption & Methodik

Zielsetzung

Wie sinnvoll und effizient lassen sich Level durch LLMs erzeugen und automatisiert bewerten?

Systemarchitektur

  • LLM erzeugt Doom-Level im Textformat
  • Level wird automatisch in .wad/.cfg konvertiert
  • RL-Agent spielt Level via Sample Factory (APPO)

💡 Implementierung

Tech Stack

  • LLMs: DeepSeek-1, Gemini-2.0-flash, CodeLLaMA
  • RL-Engine: Sample Factory, APPO
  • Game Engine: ViZDoom
  • Tools: Python, PyTorch, Git
import json
from openai import OpenAI


TOOL = {...}

user_prompt = f"""
Generate a valid 15x15 ASCII-based ViZDoom level.   
### HARD CONSTRAINTS (must never be violated):
1. There must be **exactly one player**, placed in the **second row** (index 1). Do not place the player anywhere else.
2. There must be **exactly one goal item**, placed in the **second last row** (index 13). Do not place the goal anywhere else.
3. There must be **exactly 2 to 4 enemies**, located anywhere except player and goal positions.
...
"""

role_prompt = f"""
You are an AI designed to generate ASCII-based ViZDoom levels in a strict 15x15 format.  
The first and last line must be only walls.
Allowed characters:
"#": "wall"
" ": "space for open areas"
"P": "player"
"G": "goal item"
"E": "enemy"
"""

response = AsyncOpenAI(
        api_key=os.getenv("GOOGLE_API_KEY"), 
        base_url="https://generativelanguage.googleapis.com/v1beta/openai/"
    )
    .chat.completions.create(
    model=llm_model,
    messages=[
        { "role": "system", "content": role_prompt },
        { "role": "user", "content": user_prompt }
    ],
    tools=[TOOL],
    tool_choice={"type": "function", "function": {"name": "generate_level"}}
)

arguments_json = response.choices[0].message.tool_calls[0].function.arguments
return json.loads(arguments_json)

Vereinfachtes Beispiel für einen Prompt zur Levelgenerierung mit gemini-2.0-flash.


📊 Evaluation

Testdesign

Für die quantitative Bewertung generierter Level wurden pro Level Szenarien mit einer festen Agenten-Konfiguration durchgeführt (Sample Factory, 100 Episoden pro Level). Dabei wurden folgende Metriken berechnet:

  • avg_reward: Durchschnittlich erreichter Gesamt-Reward je Episode
  • avg_hit_rate: Verhältnis zwischen abgegebenen und erfolgreichen Treffern
  • avg_damage_taken: Durchschnittlicher erlittenen Schaden pro Durchlauf
  • avg_damage_per_kill: Schadensmenge pro eliminiertem Gegner
  • avg_ammo_efficiency: Verhältnis von Damage zu Munitionsverbrauch
  • avg_health: Durchschnittlicher Health-Wert am Ende der Episode
  • survival_rate: Quote der erfolgreichen Durchläufe ohne Tod

Diese Metriken wurden automatisiert aus den gesammelten Trajektorien extrahiert und in aggregierter Form (Mittelwert über alle Episoden) als Bewertung jedes Levels genutzt.

Ergebnisse

  • Spielbarkeit (survival_rate > 0.5) konnte bei ca. 70 % der Level erreicht werden
  • Ammo Efficiency war ein sensibler Indikator für Leveldichte und Gegnerplatzierung
  • avg_reward korrelierte stark mit Healthkits und Map-Komplexität

Die Kombination dieser Metriken erlaubte eine differenzierte Bewertung, bei der z. B. auch spielbare, aber ineffizient designte Levels identifiziert werden konnten.


🧩 Diskussion

LLMs können Doom-Level erzeugen – aber nicht zuverlässig im richtigen Format. Der Agent als Bewertungsinstanz bringt nicht nur funktionales Feedback, sondern offenbart auch Balancing-Schwächen. In Kombination entsteht ein valider Kreislauf zur automatisierten Levelvalidierung.


✅ Fazit & Ausblick

Die Kombination von textbasierter Generierung und RL-basierter Bewertung bietet eine spannende Grundlage für zukünftige Tools in der Spieleentwicklung – etwa für automatische Testlevels, Schwierigkeitsanalyse oder assistiertes Leveldesign.