Benutzer-Werkzeuge

Webseiten-Werkzeuge


ws2122:kispiel:battleship_ai

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen gezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
ws2122:kispiel:battleship_ai [2022/03/25 21:14]
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 esals 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 Feldauf das er schießen ​will. Wenn der zweite Spieler auf diesem Feld ein Schiff gesetzt hatsagt 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 getroffenmuss der andere Spieler "​versenkt" ​sagen
  
-Hat er nicht getroffen ist der andere Spieler am Zug.+Hat er nicht getroffenist der andere Spieler am Zug.
  
-Wer als erstes alle Schiffe des Gegners versenkt hat hat gewonnen.+Wer als erstes alle Schiffe des Gegners versenkt hathat gewonnen.
  
  
Zeile 60: 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 ichdas 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 ​versuchteeine Funktion zu implementieren, ​welche ​einem ermöglichtregelkonform die Schiffe zu setzenwurde 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önnenentschied ich mich für die Variantejedes Schiff einzeln setzen zu müssen und bei jedem weiteren Element des Schiffes zu trackenwelche 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 78: 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 95: 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 vorhandenmü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 110: 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 erreichtsich 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 iststartet 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 spielenmuss 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 fertigmuss 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 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.
  
-Danach beginnt das versenken.  +(treffer.png einfügen)
-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)+Ist das Spiel beendet, muss es im Singleplayer manuell neugestartet werden. Im Multiplayer sollte man zurück zum "​Hauptmenü"​ gelangen. ​
  
-Ist das Spiel beendet muss es im Singleplayer manuell neugestartet werden. Im Multiplayer sollte man zurück zum "​Hauptmenü"​ gelangen+(mainmenu.png einfügen)
  
-(hauptmenü) +Viel Spass beim Ausprobieren!!!
- +
-Viel Spass bei ausprobieren!!!+
  
  
Zeile 143: 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 zufriedenein 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 istPython 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 gefundenein 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 159: 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 165: 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 ====
ws2122/kispiel/battleship_ai.1648239290.txt.gz · Zuletzt geändert: 2022/03/25 21:14 von eric