Es gibt großartige Fußballmanager-Spiele. Gerade für den deutschen Markt: Anstoss hat eine Generation geprägt. Football Manager ist bis heute die Referenz. Darum geht es hier aber nicht.
Mich hat irgendwann vielmehr die Frage gereizt, wie weit ich selbst kommen würde. Mit meinen Erfahrungen als Spieler und Entwickler, mit Python als Werkzeug und mit den technischen Möglichkeiten von heute . Nicht als Klon und nicht als bessere Version von etwas anderem, sondern als eigenes Projekt.
Das Ergebnis trägt aktuell den Arbeitstitel Joni Fussballmanager. Das Spiel ist noch in Entwicklung und läuft derzeit auf meinem Rechner.
Der erste Moment, der alles verändert hat
Es gibt bei jedem Projekt diesen einen Moment, an dem man aufhört, nur an einer Architektur zu bauen, und anfängt, etwas tatsächlich zu spielen. Beim Joni Fussballmanager war das der Abend, als nach einem Elfmeter der erste Ticker-Eintrag auf dem Bildschirm erschien.
45+2' → EINWECHSLUNG: Spieler A für Spieler B (Heimteam)
47' → GELBE KARTE: Verteidiger (Heimteam) – Foulspiel
56' → TOR! Mittelstürmer (Heimteam) – Schuss ins kurze Eck – 1:0
Über eine Stunde lang hatte ich an der Ereignisverteilung gearbeitet, die Match Engine neu verdrahtet und Timing-Bugs behoben. Und dann liefen Zahlen durch eine Formel, Attribute zweier Spieler wurden verglichen, eine Wahrscheinlichkeit wurde gezogen – und ein Tor erschien im Ticker. Nicht als Debug-Ausgabe, sondern als Ereignis, das im Spiel wirklich zählt.
Das war für mich trotzdem nur ein Zwischenschritt. Die ersten Versionen liefen noch im Terminal, fast wie Ende der 80er oder Anfang der 90er. Dass daraus am Ende ein Spiel mit kompletter grafischer Oberfläche wurde, war für mich persönlich ein echter Meilenstein.
Warum Python für ein Fußballmanager-Spiel?
Die naheliegende Antwort wäre vermutlich "Godot" oder "Unity". Aber ganz ehrlich: Das würde meine Fähigkeiten übersteigen. Für ein Feierabendprojekt wäre mir das schlicht zu groß, zu aufwendig und ich würde es in dieser Form wahrscheinlich auch nicht hinbekommen. Ein Managerspiel ist für mich außerdem kein Echtzeit- oder Actionspiel, sondern im Kern eine datengetriebene Anwendung mit komplexer Oberfläche, viel Zustandslogik und einer Menge Regeln. Hier muss kein Bild mit 60 fps gerendert werden. Es braucht keine Physik-Engine und keine Shader.
Was ein Fußballmanager stattdessen braucht: eine gute UI-Bibliothek, eine saubere Datenhaltung und klar strukturierte Domänenlogik. Genau dafür ist PyQt6 stark. SQLite ist für so ein Projekt mehr als ausreichend. Und Python erlaubt mir, schnell zu entwickeln, Dinge umzubauen und Logik lesbar zu halten.
Was sich in der Praxis bestätigt hat: Die Codebasis ist groß, aber beherrschbar. Neue Features entstehen ohne endlose Build-Ketten. Debugging bleibt überschaubar. Das Spiel läuft plattformübergreifend.
Ein Blick hinter die Kulissen: Die folgenden Abschnitte geben einen Einblick in die Funktionsweise des Spiels und seine technische Struktur.
Das Zwei-Datenbank-System: Fußball und deine Karriere
Vielleicht die wichtigste Architektur-Entscheidung im ganzen Projekt – und eine, die man beim Spielen gar nicht direkt sieht, die aber praktisch alles beeinflusst.
master.db ist read-only. Darin liegen mehrere nationale und internationale Ligen
und weitere Ligen. Dazu Vereine, Spieler, Stadien, Formationsregeln und historische
Legenden. Diese Datei wird nicht verändert.
Pro Spielstand gibt es eine eigene SQLite-Datei. Darin liegen Tabellenstände, Transfers, Finanzen, Spielerform, Ergebnisse und das Archiv der eigenen Karriere.
Was das in der Praxis bedeutet: Das Spiel kann jederzeit neu gestartet werden, ohne dass die Basisdaten beschädigt werden. Mehrere Spielstände können parallel laufen. Und wenn ein Spielstand weg soll, löscht man genau eine Datei. Die Grunddaten bleiben unangetastet.
Auch im Code bringt das Klarheit: Abfragen gegen master.db sind immer read-only,
Abfragen gegen die Spielstandsdatei dürfen schreiben. Ein versehentliches
UPDATE auf den Basisdaten ist damit praktisch ausgeschlossen.
Die Match Engine: Minuten, Wahrscheinlichkeiten und dieser eine Elfmeter
Das ist technisch der anspruchsvollste Teil des Projekts. Und gleichzeitig der, der am meisten Spaß macht.
Ein Spiel läuft tickbasiert: 90 simulierte Minuten, in jeder Minute wird neu berechnet, was passiert. Ereignisse wie Schüsse, Tore, Fouls, Karten, Verletzungen oder Ecken haben Wahrscheinlichkeiten, die von Spielerattributen abhängen. Die Formation spielt mit hinein. Taktische Anweisungen verschieben die Gewichte. Ein guter Stürmer im passenden System kommt häufiger zum Abschluss. Ein Team mit hohem Pressing-Wert stört den gegnerischen Aufbau stärker.
Das Ergebnis ist ein Live-Ticker. Ereignisse erscheinen Zeile für Zeile, ähnlich wie bei einem Liveticker auf dem Smartphone – nur dass man hier selbst der Manager ist, der die Mannschaft aufgestellt hat.
Parallel dazu laufen alle anderen Spiele des Spieltags ebenfalls weiter. Rechts im Fenster baut sich die Live-Tabelle in Echtzeit auf. Wenn ein Konkurrent trifft, verschlechtert sich meine Position. Wenn ich führe und der Verfolger nur unentschieden spielt, wächst mein Vorsprung.
Das Matchday-View: Drag, Drop, dein Layout
Ein Feature, das ich lange unterschätzt habe – und das das Spielgefühl massiv verändert.
Das Matchday-View wurde von einem einfachen QWidget zu einem QMainWindow umgebaut,
um das native Dock-System von Qt zu nutzen. Das bedeutet: Alle Panels rund um den Ticker
sind eigene Dock-Widgets. Aufstellung, Statistiken, parallele Spiele, Live-Tabelle,
Match-Info – alles lässt sich per Drag & Drop frei positionieren. Jedes Fenster
kann einzeln eingeklappt werden, und das Layout wird automatisch gespeichert.
Wer die Aufstellung nicht sehen will, klappt sie zu. Wer die Live-Tabelle immer rechts oben haben will, zieht sie einmal dorthin – und beim nächsten Öffnen ist alles wieder an seinem Platz.
Das klingt erst einmal nach einer kleinen technischen Komfortfunktion. Ist es aber nicht. Wer sich sein eigenes Matchday-Layout einmal eingerichtet hat, merkt sehr schnell, dass sich das Spiel an den Spieler anpasst – und nicht umgekehrt.
Das Lebenszeichen des Vereins: Finanzsystem
Kein Finanzsystem, kein richtiger Fußballmanager. Punkt. Das Finanzsystem im Joni Fussballmanager deckt die wichtigsten Einnahmen und Ausgaben ab. TV-Gelder fließen abhängig von der Ligaposition. Zuschauereinnahmen hängen an Stadionkapazität und sportlicher Attraktivität. Sponsorenverträge müssen ausgehandelt werden. Transfers kosten Ablöse und belasten das Lohnbudget. Jugendakademie, Scouting und Amateurabteilung verursachen laufende Kosten.
Seit dem letzten größeren Update gibt es ein Investitions-Budget-System. Im Onboarding legt man zu Beginn der Karriere fest, wie viel pro Jahr in bestimmte Bereiche fließen soll: Jugendakademie, Amateurbereich, Scouting, Talentförderung. Diese Beträge werden nicht einmalig abgezogen, sondern automatisch Woche für Woche verrechnet. Das erzeugt einen deutlich realistischeren Cashflow. KI-Vereine arbeiten dabei mit plausiblen Standardinvestitionen, die sich an Lohnbudget und Reputation orientieren.
Das Ergebnis: finanzieller Druck ist spürbar. Wer zu viel ausgibt, hat später kein Transferbudget mehr. Wer in die Jugend investiert, sieht den Effekt nicht sofort, sondern oft erst in späteren Saisons.
Das Legenden-System: Die Karten im Schrank
Jeder Verein hat historische Legenden. berühmte Vereinslegenden aus verschiedenen Epochen und Ligen. Statt diese einfach nur als feste Sonderspieler ins Spiel zu setzen, hat das Legenden-System eine eigene Mechanik bekommen: Sammelkarten.
Packs werden im Lauf der Karriere freigeschaltet. Beim Öffnen erhält man Legenden-Karten in verschiedenen Seltenheitsstufen. Wer Pech hat, aber hartnäckig weitersammelt, kommt über ein Pity-System trotzdem an seltene Karten. Wer genug Tokens besitzt, kann gezielt Karten craften. Legenden lassen sich danach dem Kader hinzufügen – aber bewusst nur in einem begrenzten Rahmen pro Saison, damit das Team nicht völlig kippt.
KI-gesteuerte Vereine und der Pressedienst
Alle Vereine, die nicht vom Spieler gesteuert werden, handeln eigenständig. Das betrifft nicht nur die Spielsimulation, sondern auch den Transfermarkt: KI-Vereine haben eigene Budgets, eigene Präferenzen und bieten selbstständig auf Spieler der Transferliste.
Genau das macht den Markt lebendig. Es passiert etwas, auch wenn man selbst gerade nichts tut. Nach jedem Spieltag kommt noch ein weiteres KI-Element dazu: der Pressedienst. Spielberichte werden lokal über Ollama generiert, also ohne Cloud-API. Spielverlauf, Schlüsselmomente und Ergebnis dienen dabei als Kontext, aus dem das Modell einen kurzen Spielbericht formuliert.
Über eine Saison entsteht so ein eigenes Archiv: fiktive Presseberichte über Verlauf, Höhepunkte und Rückschläge der eigenen Karriere. Der 3:1-Sieg gegen einen großen Rivalen, der einen Titelkampf eröffnet. Die unerwartete Niederlage, die plötzlich eine andere Stimmung in den Bericht bringt. Das ist kein Kernsystem – aber eines, das dem Spiel deutlich mehr Atmosphäre gibt.
Spieler altern. Spieler werden Legenden.
Ein Feature, das ich ursprünglich erst für spätere Projektphasen vorgesehen hatte – das dann aber zu früh gebaut wurde, weil es einfach zu wichtig war.
Bei Anstoss 3 war ich immer ein wenig traurig, wenn ein grandioser Spieler seine Karriere beendet hat. Genau dieses Gefühl wollte ich in meinem eigenen Manager nicht einfach verpuffen lassen. Verdiente Spieler sollten einen besonderen Platz bekommen und nicht einfach still aus dem System verschwinden.
Spieler altern über die Saisons. Ab einem bestimmten Alter nimmt die Leistungsfähigkeit langsam ab, Attribute verschlechtern sich, und irgendwann kommt der Karriereabschluss. Wenn ein Spieler bestimmte Voraussetzungen erfüllt – viele Einsätze, wichtige Tore, Titel mit einem Verein –, wird er nach dem Karriereende als Vereinslegende eingestuft.
Das hat keine unmittelbaren Gameplay-Auswirkungen. Aber wenn ein Spieler aufhört und das Spiel diesen Abschied als echten Vereinsmoment würdigt, dann macht das etwas mit dem Gesamtbild. Es gibt der Karriere mehr Gewicht.
Was ich gelernt habe
Die Balance im Transfermarkt war schwieriger, als ich anfangs dachte. Wenn die KI zu aggressiv agiert, ist der Markt schnell frustrierend. Wenn sie zu zurückhaltend ist, passiert zu wenig. Am Ende hilft da keine Theorie, sondern nur immer wieder spielen, beobachten und nachjustieren.
Eine klare Trennung von Domain-Logik und UI zahlt sich auch in Spielen aus. Gerade bei einem Manager mit vielen Systemen macht es einen großen Unterschied, ob neue Funktionen in sauberer Spiellogik entstehen oder direkt in Widget-Klassen landen. Diese Trennung hält den Code testbar, nachvollziehbar und erweiterbar.
Was gerade passiert
Das Spiel ist spielbar, aber von einem wirklich fertigen Zustand noch ein gutes Stück entfernt. Einen vollständigen Saisonwechsel habe ich bislang noch nicht geschafft. Ich stoße immer wieder auf Bugs, Ungereimtheiten und Dinge, die ich nachtesten muss.
Das liegt auch daran, dass ich Entwickler und Tester in einer Person bin. Das Spiel ist über die Zeit immer weiter gewachsen, und viele Systeme mussten vergleichsweise früh eingebaut werden, weil es später deutlich aufwendiger geworden wäre, solche tiefgreifenden Features noch sauber zu integrieren. Und ich bin natürlich auch kein Magier wie die Entwickler der großen Fußballmanager-Klassiker, die schon vor der Jahrtausendwende auf technisch deutlich stärker begrenzter Hardware grandiose Spiele gebaut haben.
Gerade deshalb besteht ein großer Teil der Arbeit nicht nur aus neuem Bauen, sondern auch aus Prüfen, Nachschärfen und erneutem Testen. Genau so entsteht dieses Projekt Schritt für Schritt weiter.
Ich hoffe, dass mir dafür der lange Atem nicht ausgeht und das Projekt am Ende nicht versandet. Dafür stecken inzwischen schon viel zu viele Stunden, Wochen und Monate darin.