Hier werden die Unterschiede zwischen zwei Versionen gezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
ws2122:kispiel:battleship_ai [2022/03/25 20:45] eric |
ws2122:kispiel:battleship_ai [2022/03/27 05:50] (aktuell) sunnyrogers [Fazit] |
||
---|---|---|---|
Zeile 9: | Zeile 9: | ||
==== Spielregeln ==== | ==== Spielregeln ==== | ||
- | Es gibt zwei Spieler, die jeweils 10 Schiffe auf einem 10x10 grossem Spielfeld platzieren. | + | Es gibt zwei Spieler, die jeweils 10 Schiffe auf einem 10x10 grossen Spielfeld platzieren. |
- | Das Ziel ist es als erster alle Schiffe zu versenken. | + | 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. | + | 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. | + | 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". | + | 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 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. | + | Hat er nicht getroffen, ist der andere Spieler am Zug. |
- | Wer als erstes alle Schiffe des Gegners versenkt hat hat gewonnen. | + | Wer als erstes alle Schiffe des Gegners versenkt hat, hat gewonnen. |
Zeile 38: | Zeile 38: | ||
* Regeln festlegen | * Regeln festlegen | ||
* Schiffe platzieren können | * Schiffe platzieren können | ||
- | |||
* Schiffe versenken können | * Schiffe versenken können | ||
* Zwei Spiele verbinden (multiplayer) | * Zwei Spiele verbinden (multiplayer) | ||
Zeile 61: | Zeile 60: | ||
Nach einiger Recherche zur Umsetzung von Spielen mit Python fiel die Entscheidung auf das pygame-Modul. | 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 10x10 Gitter zu implementieren und die Funktion Klicks in jene Felder zu tracken. | + | Damit konnte recht schnell die Grundlage des Spielfelds programmiert werden. Inspiriert durch eine Umsetzung von Tic Tac Toe begann ich, das 10x10 Gitter zu implementieren und die Funktion Klicks in jene Felder zu tracken. |
- | (bild gitter einfügen) | + | (grid.png 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. | + | 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. | + | 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. | + | 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) | + | (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. | So kann man das 2. Element lediglich direkt neben das erste platzieren und die nachfolgenden in Reihe davor oder dahinter. | ||
Zeile 79: | Zeile 80: | ||
Dort musste zuerst die Theorie dahinter festgelegt werden, da die beiden Spieler je nach Spielphase (setzen oder versenken) unterschiedliche Informationen aneinander senden mussten. | 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) | + | (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 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. | + | 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) | + | (spiel.png einfügen) |
Zeile 96: | Zeile 97: | ||
Zu Beginn benötigen wir eine Python3 Umgebung. Ich habe anaconda3 (Version 3.8) benutzt. | 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. | + | Wenn noch nicht vorhanden, müssen die Module pygame und numpy installiert werden. |
- | Das geht mit pip install modulname | + | 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. | + | 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 | Dafür muss die Ziele | ||
Zeile 111: | Zeile 112: | ||
geändert werden. | geändert werden. | ||
- | Dann kann jedes Gerät, welches diese IP-Adresse erreicht sich mit einem Spiel verbinden. | + | 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. | + | Auf dem Host Gerät muss nun die Datei ''server.py'' ausgeführt werden. |
Diese sollte dann im Hintergrund weiterlaufen. | 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). | + | 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. | + | 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 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. | + | 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. |
- | (schiff fertig und halbfertig) | + | (halb.png einfügen9 |
+ | Sind alle Schiffe gesetzt, sollte sich das Spielfeld zurücksetzen. | ||
- | Sind alle Schiffe gesetzt sollten sich diese verfärben und 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. | ||
- | (alle schiffe da) | + | (treffer.png einfügen) |
- | Danach beginnt das versenken. | + | Ist das Spiel beendet, muss es im Singleplayer manuell neugestartet werden. Im Multiplayer sollte man zurück zum "Hauptmenü" gelangen. |
- | 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. | + | |
- | (ein schiff versenkt eins getroffen) | + | (mainmenu.png einfügen) |
- | Ist das Spiel beendet muss es im Singleplayer manuell neugestartet werden. Im Multiplayer sollte man zurück zum "Hauptmenü" gelangen. | + | Viel Spass beim Ausprobieren!!! |
- | + | ||
- | (hauptmenü) | + | |
- | + | ||
- | Viel Spass bei ausprobieren!!! | + | |
Zeile 146: | Zeile 144: | ||
===== Fazit ===== | ===== 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. | + | 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. | + | 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. | Dementprechend ist das Spiel "nur" lokal und getrennt von einer Webseite nutzbar. | ||
Zeile 162: | Zeile 160: | ||
[[https://github.com/HerrTumorius/BattleshipAI/tree/game|GitHub]] | [[https://github.com/HerrTumorius/BattleshipAI/tree/game|GitHub]] | ||
+ | ==== Code ==== | ||
+ | {{:ws2122:kispiel:game_eric_ws2122.zip|Hier ist der Code.}} | ||
==== Literatur/Hilfsmittel ==== | ==== Literatur/Hilfsmittel ==== | ||
Zeile 168: | Zeile 168: | ||
[[http://python-programmieren.maximilianwittmann.de/kunstliche-intelligenz-programmieren/|KI Einstieg Python]] | [[http://python-programmieren.maximilianwittmann.de/kunstliche-intelligenz-programmieren/|KI Einstieg Python]] | ||
[[https://pythonguides.com/create-a-game-using-python-pygame/|Grundlagen Pygame]] | [[https://pythonguides.com/create-a-game-using-python-pygame/|Grundlagen Pygame]] | ||
+ | |||
+ | (hier game.zip einfügen) | ||
==== verwendete Software ==== | ==== verwendete Software ==== |