Wie ich mein Ein-Personen-Projekt aufgebaut habe: Eine Schach-Engine für eine beliebte Game Dev-Engine

Ich habe kürzlich eines meiner Sommerprojekte abgeschlossen: eine Schach-GUI-Engine, die mit der Ren'Py Visual Novel Game Development Engine und der Python-Schachbibliothek erstellt wurde.

Diese Engine wird nach Abschluss des Spiels in das kinetische Romanspiel The Wind at Dawn integriert .

In diesem Beitrag möchte ich einige wichtige technische und nichttechnische Erkenntnisse mitteilen, die ich gesammelt habe, als ich dieses Ein-Personen-Projekt in einem Monat von Anfang bis Ende vorangetrieben habe.

Schätzen Sie den Wert des Umschreibens von altem Code

Bei CS-Projekten in der Schule habe ich selten die Gelegenheit oder Erfahrung, meinen Code zu überarbeiten.

Dies ist jedoch nicht der Fall, wenn ich an meinen Leidenschaftsprojekten arbeite: Ich nutze gerne jede Gelegenheit, um ihre Benutzerfreundlichkeit und Wiederverwendbarkeit zu verbessern, in der Hoffnung, dass mein Code für andere Entwickler von Wert ist.

Diese Schach-Engine basiert auf einer Schach-Engine, die ich in Ren'Py und Vanilla Python erstellt habe, während ich mir in meiner ersten Sommerpause am College Python beigebracht habe.

Diese alte Schach-Engine basiert wiederum auf einem Projekt in meiner College-Einführung in die CS-Klasse (ein Schach-GUI-Spiel, das in Racket, einer funktionalen Programmiersprache, geschrieben wurde). Das heißt, ich habe meinen Code zweimal umgeschrieben, um diese endgültige Schach-Engine zu erstellen.

Bei meinem ersten Umschreiben habe ich einfach die Schachlogik (um festzustellen, ob ein Zug legal ist, Endspielbedingungen usw.) von Racket nach Python „übersetzt“. Ich habe auch mit objektorientierter Programmierung experimentiert, nach Online-Tutorials eine Minimax-Schach-KI geschrieben und die GUI in Ren'Py implementiert.

Da ich nur die Grundlagen des Schachs kannte und meine Schachlogik gemäß meiner Schulprojekt-Bewertungsspezifikation schrieb, unterstützte meine erste Schachmaschine keine Spezialbewegungen wie en passant, castling oder promotion.

Um dieses Problem bei meinem zweiten Umschreiben zu beheben, habe ich Open-Source-Python-Bibliotheken recherchiert und Python-Chess gefunden, eine Bibliothek mit vollständiger Unterstützung für Schachzüge und Endspielbedingungen wie das Beanspruchen eines Unentschieden bei dreifacher Wiederholung.

Darüber hinaus hat es Stockfish, eine Schach-KI, integriert, und diese Integration ermöglicht es meiner Schach-Engine, die Stärke der Schach-KI zu konfigurieren.

Diese beiden Funktionen haben meiner Schach-Engine-Version 2.0 einen großen Mehrwert verliehen und es mir ermöglicht, mich auf die wichtigeren Aspekte meines Umschreibens zu konzentrieren, die ich unten beschreiben werde.

Lesen Sie die Dokumentation und beachten Sie die Kompatibilität

Es ist meine Gewohnheit geworden, die Dokumentation der Bibliotheken zu überfliegen, die ich für mein Projekt benötige, bevor ich mich mit dem Design und dem Code befasse. Dies hilft mir bei der Bewertung von Problemen mit Abhängigkeiten und Kompatibilität, die auftreten können.

Dieses Ren'Py GitHub-Problem weist darauf hin, dass Ren'Py Python 2 verwendet und noch nicht auf Python 3 portiert wurde. Daher erkannte ich, dass ich eine Version von Python-Chess benötigte, die Python 2 unterstützt, und zwar nur als neueste Version unterstützt Python 3.7+.

Glücklicherweise unterstützt Version 0.23.10 sowohl Python 2.7 als auch Python 3.4+. Ich habe mich letztendlich für Version 0.23.11 entschieden, da es die letzte Version ist, die Python 2.7 noch unterstützt.

Nachdem ich Abhängigkeits- und Kompatibilitätsprobleme gelöst hatte, war ich bereit, mit Design und Codierung fortzufahren.

Befolgen Sie die Best Practices für Software Engineering

Hinweis: Viele in diesem Abschnitt erwähnte Begriffe stammen von Agile / Scrum.

Sammeln Sie Funktionsanforderungen für das Projektdesign

Obwohl es verlockend ist, direkt in die Codierung einzusteigen, kann ich die Bedeutung des Designs nicht genug betonen.

Stellen Sie sich Design als eine allgemeine Roadmap vor, die den Startpunkt, die Meilensteine ​​und die Endpunkte des Projekts klar umreißt. Auf diese Weise können Entwickler auf komplizierte Implementierungsdetails verweisen, wenn sie hüfthoch sind.

Dies ist besonders wichtig für außerschulische Projekte, da sie normalerweise keine detaillierten, hochtechnischen Spezifikationen haben, während dies bei den meisten Schulprojekten der Fall ist.

Für meine Schachengine habe ich die folgenden Umschreibungen / zusätzlichen Funktionen identifiziert:

  • Integrieren Sie die Schachlogik aus Python-Schach
  • Ersetzen Sie in meinem Ren'Py-GUI-Code die Schachlogik und die Schach-KI, die ich geschrieben habe, durch die Schachlogik und die Stockfish-APIs von Python-Chess
  • Unterstützt verschiedene Spielmodi: Spieler gegen Spieler, Spieler gegen Computer (wobei der Spieler zwischen Schwarz und Weiß wählen kann), einstellbare Stärke der Schach-KI durch Anpassung der Konfigurationsparameter von Stockfish
  • Entwickeln Sie eine Ren'Py-GUI für die Bauernförderung
  • Entwickeln Sie eine Ren'Py-GUI, um bei dreifacher Wiederholung oder der Fünfzig-Züge-Regel ein Unentschieden zu beanspruchen

Entwickeln Sie einen Proof of Concept-Prototyp

Mithilfe eines POC-Prototyps (Proof of Concept) kann ich den Zeit- und Arbeitsaufwand für die Implementierung der erforderlichen Funktionen abschätzen.

Für meinen Schach-Engine-POC habe ich Python-Schach in meinen ursprünglichen Ren'Py-GUI-Code integriert. Ich habe dafür gesorgt, dass die Funktionen minimal und dennoch leicht erweiterbar sind:

  • Ich habe Python-Schach in meinen ursprünglichen Ren'Py-GUI-Code integriert und konnte Teile verschieben
  • Ich habe nur Player vs. Player implementiert, um die Integration von Stockfish für die Schach-KI zu verschieben
  • Ich habe nur Nicht-Promotion-Moves zugelassen, um die Entwicklung der GUI für die Bauern-Promotion zu verschieben

Identifizieren Sie die Definition von Ready und die Definition von Done des Projekts

Die Definition of Ready (DoR) meines Projekts ergibt sich natürlich aus meiner ersten Untersuchung zur Kompatibilität der Bibliotheksversion und zu meinem POC.

Parallel dazu folgt die Definition of Done (DoD) meines Projekts aus den Funktionsanforderungen, die ich in meiner Entwurfsphase ermittelt habe.

Liefern Sie ein Produkt mit minimaler Lebensfähigkeit oder noch besser ein Produkt mit minimaler Lebensfähigkeit

Als ich in der Entwurfsphase war, um Anforderungen zu sammeln, wusste ich, dass mein Projekt viele große Ziele hatte - vielleicht sogar mehr, als ich jemals erreichen konnte.

Daher war es für mich wichtig, die grundlegenden erforderlichen Funktionen zu implementieren, ein Minimum Viable Product (MVP) bereitzustellen und Feedback zu sammeln, um es zu wiederholen.

Besser noch, ich möchte bei meiner ersten Iteration ein Minimum Lovable Product (MLP) liefern. Der winzige Unterschied besteht darin, dass ein MVP zwar nur funktionale Merkmale erfordert, ein MLP jedoch von Natur aus eine liebenswerte Benutzererfahrung bietet.

Um beispielsweise Bauernförderungsbewegungen durchzuführen, könnte ich Benutzer für einen MVP bitten, verschiedene Tasten zu drücken, um den Stücktyp auszuwählen, zu dem sie befördern möchten (wie B für Bischof und K für Ritter).

Für einen MLP würde ich eine Benutzeroberfläche mit stückförmigen Schaltflächen implementieren, die beim Bewegen oder Auswählen die Farbe ändern.

Seien Sie Ihr eigener Projektmanager

Wenn Sie die Liste der Funktionen (plus die ständig wachsende Liste der Fehler und Korrekturen) als überwältigend empfinden, sind Sie nicht allein. Es ist Zeit, Ihr eigener Projektmanager zu sein.

Ich fand Trello ein erstaunliches Werkzeug sowohl für Einzelprojekte als auch für Projekte mit großen Teams.

So organisiere ich normalerweise mein Trello-Board für ein Codierungsprojekt:

Haben Sie vier Listen: Backlog (für zu testende Funktionen), TODO , Doing und Done.

Farbcodierte Etiketten haben:

  • Bereit für die Qualitätssicherung: Ein rotes Etikett, um die Aufmerksamkeit meiner Teamkollegen zu erregen
  • Auswirkung: Niedrig (gelb) vs. Hoch (orange), bestimmt durch die Auswirkung, die ein Feature oder eine Fehlerbehebung erzeugt. Beispielsweise ist ein leicht falsch ausgerichtetes UI-Panel von geringer Auswirkung, während ein deterministisch abstürzender Fehler von großer Auswirkung ist.
  • Eine Schätzung der Zeit, die für die Implementierung benötigt wird: trivial (<1 Stunde, blaugrün), mittel (1–2 Stunden, hellblau) und schwierig (2–4 Stunden, dunkelblau).

    Meine andere Faustregel lautet: Wenn ich davon ausgehe, dass die Implementierung einer Karte länger als 4 Stunden dauert, sollte ich sie wahrscheinlich in mehrere feinkörnigere Karten aufteilen.

  • Farbe ist ein guter visueller Hinweis: Ich gehe immer Karten mit orangefarbenen und blaugrünen Tags an (hohe Auswirkung und geringer Zeitaufwand), bevor ich Karten mit gelben und schwierigen Tags (geringe Auswirkung, aber hoher Zeitaufwand) in Angriff nehme.

Schreiben Sie eine Dokumentation und reflektieren Sie Ihr Lernen

Nachdem Sie jede einzelne Trello-Karte von TODO auf Doing to Done verschoben und jeden bösen Fehler behoben haben, ist es endlich an der Zeit, ein Projekt als erledigt zu bezeichnen? Ja und nein.

Um mein Lernen aus einem Projekt zu maximieren, finde ich es immens lohnenswert, über meine technischen oder Soft Skills nachzudenken:

  1. Schreiben Sie eine klare, präzise README-Datei in das GitHub-Projekt-Repository. Dies hilft anderen Entwicklern, das Projekt zu verstehen und sich dafür zu interessieren.
  2. Schreiben Sie einen Blog-Beitrag (wie den, den ich gerade schreibe) über die übergeordneten Aspekte, z. B. Architekturübersicht, Feature-Design, Herausforderungen und Lösungen usw.

Credits & Links

Vielen Dank an Tim Min, der mich dazu veranlasst hat, an diesem Projekt zu arbeiten, für seine Beiträge (neue Feature-Ideen + Qualitätssicherung) im Trello-Vorstand und dafür, dass er mich zur Rechenschaft gezogen hat. Tim ist der Autor des kinetischen Romans The Wind at Dawn .

  • Mein GitHub-Repository für die Schachengine
  • Das öffentliche Trello-Board für dieses Schach-Engine-Projekt
  • Ren'Py: eine Visual Novel Game Development Engine
  • Python-Schach: Eine reine Python-Schachbibliothek

Lass uns Kontakt halten! Verbinden Sie sich mit mir auf LinkedIn, GitHub, Medium oder besuchen Sie meine persönliche Website.