Files
Hermes Agent 0901a4b99a
Quality Gate / 🛡️ Lint + Type Check + Tests (push) Failing after 12m52s
style: Ruff-Formatierung auf Alicias Empfehlungs-Engine
2026-06-22 00:22:46 +02:00

134 lines
3.6 KiB
Python

"""Spiele-Datenbank fuer die Empfehlungs-Engine."""
from typing import TypedDict
class SPIEL(TypedDict):
"""Struktur einer Spiel-Zeile."""
name: str
min_spieler: int
max_spieler: int
dauer_min: int
komplexitaet: float
kategorien: list[str]
MIN_SPIELER_DEFAULT = 1
MAX_SPIELER_DEFAULT = 10
def spiele_laden() -> list[SPIEL]:
"""Lädt eine vordefinierte Liste von Brettspielen.
Returns:
Liste von Spiel-Dictionaries mit mindestens 8 Spielen.
"""
return [
{
"name": "Catan",
"min_spieler": 3,
"max_spieler": 4,
"dauer_min": 60,
"komplexitaet": 2.5,
"kategorien": ["Strategie", "Aufbau", "Handel"],
},
{
"name": "Carcassonne",
"min_spieler": 2,
"max_spieler": 5,
"dauer_min": 45,
"komplexitaet": 1.5,
"kategorien": ["Familienspiel", "Bauen", "Karte"],
},
{
"name": "Pandemic",
"min_spieler": 2,
"max_spieler": 4,
"dauer_min": 45,
"komplexitaet": 2.4,
"kategorien": ["Strategie", "Kooperativ", "Abenteuer"],
},
{
"name": "Codenames",
"min_spieler": 4,
"max_spieler": 8,
"dauer_min": 15,
"komplexitaet": 1.3,
"kategorien": ["Partyspiel", "Worte", "Team"],
},
{
"name": "Wunderland",
"min_spieler": 2,
"max_spieler": 4,
"dauer_min": 60,
"komplexitaet": 2.5,
"kategorien": ["Strategie", "Worte", "Kreativ"],
},
{
"name": "Ticket to Ride",
"min_spieler": 2,
"max_spieler": 5,
"dauer_min": 60,
"komplexitaet": 1.8,
"kategorien": ["Familienspiel", "Reisen", "Bauen"],
},
{
"name": "Dixit",
"min_spieler": 3,
"max_spieler": 6,
"dauer_min": 30,
"komplexitaet": 1.2,
"kategorien": ["Partyspiel", "Träume", "Kreativ"],
},
{
"name": "Wingspan",
"min_spieler": 1,
"max_spieler": 5,
"dauer_min": 70,
"komplexitaet": 3.1,
"kategorien": ["Strategie", "Aufbau", "Natur"],
},
]
def spiele_filtern(
spiele: list[SPIEL],
spieler_count: int | None = None,
kategorien: list[str] | None = None,
max_dauer: int | None = None,
) -> list[SPIEL]:
"""Filtert Spiele nach Spieleranzahl, Kategorien und Dauer.
Jeder Filter ist optional (None = kein Filter). Nur Spiele,
die alle aktiven Filter erfüllen, werden zurückgegeben.
Args:
spiele: Liste aller Spiele, die gefiltert werden sollen.
spieler_count: Gesuchte Spieleranzahl.
kategorien: Liste der Kategorien, die vorhanden sein müssen.
max_dauer: Maximale Spieldauer in Minuten.
Returns:
Gefilterte Liste der Spiele.
"""
ergebnis: list[SPIEL] = []
for spiel in spiele:
if spieler_count is not None:
if not (spiel["min_spieler"] <= spieler_count <= spiel["max_spieler"]):
continue
if kategorien is not None:
spiel_kat = spiel.get("kategorien", [])
if not any(kat in spiel_kat for kat in kategorien):
continue
if max_dauer is not None:
if spiel.get("dauer_min", 999) > max_dauer:
continue
ergebnis.append(spiel)
return ergebnis