Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

ws2122:kispiel:battleship_ai

Schiffe versenken

Ertellt von: Eric Benschneider

Idee

Dieses Projekt handelt von der Umsetzung des bekannten Brettspiels Schiffe versenken.

Spielregeln

Es gibt zwei Spieler, die jeweils 10 Schiffe auf einem 10×10 grossen 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 schießen 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.


Zielsetzung

Mindestziel

Spiel an sich programmieren

  • Regeln festlegen
  • Schiffe platzieren können
  • Schiffe versenken können
  • Zwei Spiele verbinden (multiplayer)
  • in GUI umsetzen

Zusatz

Künstliche Intelligenz, welche dieses Spiel spielt

  • Methode herausfinden: Welche Art maschine learning? Reinforcement learning?
  • Schnittstelle KI und Spiel (Ein- und Ausgabe in GUI/Code)
  • Schiffe zufällig platzieren
  • Konzept und Umsetzung der Datenanalyse mit KI
  • Darstellung der KI
  • Benutzung der KI (z. B. als Gegenspieler)

Umsetzung

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.

(grid.png einfügen)

Als ich anschließend versuchte, eine Funktion zu implementieren, welche 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. (step1.png) (step2.png) (step3.png)

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_multi.png 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.

(spiel.png einfügen)


Dokumentation

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 außerhalb 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 singleplayer.py geöffnet werden. Ist das Spiel gestartet kann mit dem Drücken der Tasten „2“, „3“, „4“ und „5“ das Setzen eines Schiffes dieser Länge begonnen werden. Dann per Mausklick jeweils ein Feld auswählen. Mit der Pfeiltaste nach links kann jeweils der letzte Klick rückgängig gemacht werden. Mit „Esc“ und der Leertaste kann das Spiel beendet werden. Ist das Schiff fertig, muss es mit „Enter“ eingeloggt werden. Dann verändert sich die Farbe und es kann mit einem weiteren Schiff begonnen werden.

(halb.png einfügen9 Sind alle Schiffe gesetzt, sollte sich das Spielfeld zurücksetzen.

Danach beginnt das Versenken. In diesem Modus kann gelten dieselben Funktionen für das Klicken und Verlassen des Spiels. Es kann aber nur ein Feld ausgewählt werden. Sobald „Enter“ gedrückt wurde, verfärbt sich das ausgewählte Feld. Wird es Schwarz, hat man getroffen. Wird es Geld, war es kein Treffer. Verfärbt sich das Schiff wieder, wurde es versenkt.

(treffer.png einfügen)

Ist das Spiel beendet, muss es im Singleplayer manuell neugestartet werden. Im Multiplayer sollte man zurück zum „Hauptmenü“ gelangen.

(mainmenu.png einfügen)

Viel Spass beim Ausprobieren!!!


Fazit

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 in Javascript umzuschreiben.

Dementprechend ist das Spiel „nur“ lokal und getrennt von einer Webseite nutzbar.

Ausblick

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.


Code

Literatur/Hilfsmittel

verwendete Software

Python 3.8

Module: pygame, numpy, socket

(Hier „requirements.txt“ einbinden)

Entstanden unter Verwendeung von Anaconda, GitHub und MS Visual Studio.

ws2122/kispiel/battleship_ai.txt · Zuletzt geändert: 2022/03/27 05:50 von sunnyrogers