Dies ist eine alte Version des Dokuments!
Ertellt von: Eric Benschneider
Dieses Projekt handelt von der Umsetzung des bekannten Brettspiels Schiffe versenken.
Es gibt zwei Spieler, die jeweils 10 Schiffe auf einem 10×10 grossem Spielfeld platzieren.
Das Ziel ist es als erster alle Schiffe zu versenken.
Beim platzieren der Schiffe ist zu beachten, dass diese nur senkrecht oder waagerecht platziert werden können und sich nicht gegenseitig berühren dürfen.
Haben beide Spieler ihre Schiffe platziert ohne, dass sie der andere Spieler dabei gesehen hat, geht es los mit dem versenken.
Dabei fängt der ältere Spieler an und sagt dem zweiten Spieler ein Feld auf das er schiessen will. Wenn der zweite Spieler auf diesem Feld ein Schiff gesetzt hat sagt er dem ersten Spieler „getroffen“ ansonsten „daneben“.
Hat der Spieler getroffen, darf er nochmal. Hat er alle Elemente eines Schiffes getroffen muss der andere Spieler „versenkt sagen“.
Hat er nicht getroffen ist der andere Spieler am Zug.
Wer als erstes alle Schiffe des Gegners versenkt hat hat gewonnen.
Spiel an sich programmieren
Künstliche Intelligenz, welche dieses Spiel spielt
Nach einiger Recherche zur Umsetzung von Spielen mit Python fiel die Entscheidung auf das pygame-Modul. Damit konnte recht schnell die Grundlage des Spielfelds programmiert werden. Inspiriert durch eine Umsetzung von Tic Tac Toe begann ich das 10×10 Gitter zu implementieren und die Funktion Klicks in jene Felder zu tracken.
(bild gitter einfügen)
Als ich anschliessend versuchte eine Funktion zu implementieren, welches einem ermöglicht regelkonform die Schiffe zu setzen wurde mir schnell klar, dass es schon eine zeitliche Herausforderung war überhaupt ein fertiges Spiel zu schaffen. Dementsprechend wurden die Intentionen eines KI gesteuerten Gegenspielers verworfen.
Um die Schiffe regelkonform setzen zu können entschied ich mich für die Variante jedes Schiff einzeln setzen zu müssen und bei jedem weiteren Element des Schiffes zu tracken welche Positionen noch möglich waren. (bilder Schritt 1-3 einfügen)
So kann man das 2. Element lediglich direkt neben das erste platzieren und die nachfolgenden in Reihe davor oder dahinter.
Die Schiffe zu versenken stellte kein Problem dar, da dafür lediglich der Wert des entsprechenden Feldes im Array geändert werden musste.
Richtig interessant wurde es bei dem Thema Multiplayer.
Dort musste zuerst die Theorie dahinter festgelegt werden, da die beiden Spieler je nach Spielphase (setzen oder versenken) unterschiedliche Informationen aneinander senden mussten.
(Schema multiplayer einfügen)
Die Umsetzung des Ganzen hat nicht ganz funktioniert, weshalb auch noch nicht auf den Zug des anderen gewartet wird etc.
Die Darstellung und das Layout waren ebenfalls eine Herausforderung. Da Buttons in pygame wesentlich aufwendiger zu implementieren sind als in HTML.
(Multiplayer mit buttons einfügen)
Zu Beginn benötigen wir eine Python3 Umgebung. Ich habe anaconda3 (Version 3.8) benutzt. Wenn noch nicht vorhanden müssen die Module pygame und numpy installiert werden. Das geht mit pip install modulname
Danach muss für die Multiplayer Funktion ausserhalb des eigenen Gerätes die IP Adresse des Host Gerätes in die Dokumente server.py und network.py eingetragen werden.
Dafür muss die Ziele self.server=„localhost“ zu self.server=„IP-Adresse des Hosts“ geändert werden.
Dann kann jedes Gerät, welches diese IP-Adresse erreicht sich mit einem Spiel verbinden.
Auf dem Host Gerät muss nun die Datei server.py ausgeführt werden. Diese sollte dann im Hintergrund weiterlaufen.
Nun kann mit dem öffnen der Datei client.py das Spiel geöffnet werden. Sobald ein weiterer Spieler verbunden ist startet das Spiel (aktuell nur theoretisch, 25.03.2022)
Um mit sich selbst zu spielen muss die Datei
Ich bin zufrieden ein halbwegs verwendbares Ergebnis erzielt zu haben. Im Hinblick auf die Nachhaltigkeit habe ich viel geschafft, worauf man in Zukunft aufbauen kann (z. B. das Networking). Jedoch muss ich feststellen, dass es nicht unbedingt praktisch ist Python zu verwenden, wenn man ein Browserfähiges Spiel programmieren will.
So war mir eine Einbindung in eine Website leider durch das pygame-Modul nicht möglich. Ich habe keinerlei Möglichkeiten gefunden ein pygame-Skript in ein HTML Dokument einzubinden, welche nicht aufwendiger wäre, als das gesamte Projekt nocheinmal im Javascript umzuschreiben.
Dementprechend ist das Spiel „nur“ lokal und getrennt von einer Webseite nutzbar.
Dennoch hat das Spiel sehr viel potenzial. So könnte man die GUI ausbauen und das Spiel mithilfe von Buttons intuitiver machen. Oder das Spiel durch weitere Spielregeln erweitern. Am interessantesten wäre es jedoch gegen einen KI gesteuerten Gegner zu spielen und die gewonnen Erkenntnisse der „besten“ Strategie auszuwerten.
Python: pygame, numpy, socket Hier „requirements.txt“ einbinden
Anaconda, GitHub, MS Visual Studio