BattleShips

Aus HRW FabLab MediaWiki
Wechseln zu: Navigation, Suche
BattleShips

Battleships.png

Entwickler

Leonard Hach, Daniel May, Justin Mazurek

Verwendete Software

Arduino IDE, MQTT

Programmiersprache

Arduino C

Verbaute Hardware

TTGO ESP32, 8x8 LED-Matrizen, MAX7219 Chips, Buttons, Widerstände, Breadboard, Kabel


BattleShips ist eine hardwarebasierte Version des Spieleklassikers "Schiffe versenken" für zwei Spieler. Dabei verfügen beide Spieler über ein Spielfeld, auf welchem sie ihre Schiffe positionieren können. Der Gegner versucht dann durch gezieltes, taktisches Vorgehen, die Positionen der feindlichen Schiffe herauszufinden und sie dadurch zu versenken.


Spielablauf[Bearbeiten]

Das Spielgerät

Der Spielablauf unterscheidet sich kaum vom klassischen Schiffe versenken. Zunächst positionieren beide Spieler ihre Schiffe auf dem jeweiligen Feld (hier eine 8x8 LED Matrix). Die Schiffe können durch Richtungs- und Rotationsknöpfe navigiert und gesetzt werden. Dabei ist es nicht mögllich, Schiffe aneinander angrenzend zu setzen. Die Anzahl der Schiffe pro Spieler setzt sich wie folgt zusammen:

   4x 2px  +  2x 3px  +  1x 4px  =  7 Schiffe auf 18 Pixeln

Sobald alle Schiffe gesetzt wurden, wird ausgelost wer beginnt. Anschließend geht die Zielsuche los. Die beiden Spieler navigieren abwechselnd durch das Feld des Gegners und markieren dabei einen anzugreifenden Pixel. Ist dieses Feld leer, ist der Angriff ein Fehlschlag. Ist das Feld besetzt, gilt der Angriff als Treffer. Wurde durch diesen Treffer der letzte verbleibende Pixel eines Schiffes getroffen, wird das Schiff versenkt und verschwindet aus dem Spiel. Der Spieler, der zuerst alle gegnerischen Schiffe versenkt hat, gewinnt das Spiel.

Entwicklung[Bearbeiten]

Bei der Entwicklung war der erste Punkt, den es umzusetzen galt, das Spielfeld. Dieses soll dem Spieler ermöglichen, seine Schiffe zu setzen und später dann auch das Feld des Gegenübers angreifen zu können. Unser erster Ansatz der Umsetzung war einzelne LEDs zu einer 10x10 Matrix zusammenzulöten. Diese Idee wurde aus Gründen wie der physischen Größe der Matrix und der Notwendigkeit weitere Chips zu verbauen verworfen. Stattdessen haben wir uns für vier bereits zusammengebaute 8x8 LED-Matrizen entschieden. Diese Matrizen nutzen einen MAX7219 Chip, um die einzelnen LEDs mit Multiplexing ansprechen zu können. Da die Regeln und Anzahl der Schiffe, die gesetzt werden können beim originalen Spiel auf ein 10x10 Feld ausgelegt sind, haben wir uns dafür entschieden, die Anzahl der Schiffe auf das 8x8 Format anzupassen.

Als nächstes war die Steuerung an der Reihe. Auch diese hat sich im Laufe der Entwicklung verändert. Unser erster Gedanke war es, die Steuerung mit einem Nummern Pad umzusetzen. Die Spieler hätten dann die Koordinaten von dem Feld, das angegriffen werden soll, eingegeben und anschließend mit der #-Taste die Eingabe bestätigt. Diese Version hatte jedoch viele Schwächen. Der ausschlaggebende Punkt warum wir uns letzten Endes doch für eine andere Steuerung entschieden haben war, dass die eigenen Schiffe nicht offline auf diese Weise gesetzt werden konnten. Man musste eine Webseite öffnen, welche vom ESP32 gehostet wurde, um dort die Koordinaten der Schiffe eintragen zu können.

Endgültig haben wir uns dann für eine von Spielekonsolen bekannte Form der Steuerung entschieden: Buttons. Vier Buttons werden für die Richtungssteuerung verwendet, ein weiterer zur Rotation der eigenen Schiffe beim Setzen sowie ein Button zur Bestätigung der Eingaben. Jeder der Buttons braucht auch einen 10k Ohm Widerstand. Zusätzlich war noch eine extra Bibliothek nötig, um die Funktionalität der Buttons an unser Vorhaben anzupassen.

Hardware[Bearbeiten]

Elektronik[Bearbeiten]

Blick ins Innere
Befestigung der Elektronik

Das Projekt besteht aus jeweils zwei 8x8 Matrizen, zwei MAX7219 Chips, 6 Buttons und einem ESP32. Außerdem verwendet haben wir jeweils ein Breadboard, pro Button einen 10k Ohm Widerstand und diverse Steckkabel. Davon mussten wir lediglich die Matrizen sowie die daüfr benötigten MAX7219 Chips bestellen, der Rest war in der zur Verfügung gestellten Box vorhanden. Dadurch sind Kosten von ca. 15 € entstanden.

Hier ist eine Auflistung aller Verwendeten Teile pro Spielgerät:

Komponente Anzahl
TTGO ESP32 1
8x8 LED-Matrix 2
MAX7219 Chip 2
Button 6
10k Ohm Widerstand 6
Steckkabel div.
Breadboard 1


Während der Entwicklung unseres Projekts haben wir allerdings noch weitere Materialien bestellt, die wir am Ende jedoch nicht verwendet haben. Dies waren zum einen 8x8 Matrizen zum selber löten. Leider hat das Löten nicht einwandfrei funktioniert, weshalb wir am Ende neue, bereits gelötete und direkt verbaubare, Matrizen bestellen mussten. Außerdem haben wir für den ersten Bedienansatz mit dem Nummernpad zwei I2C pcf8574 Port-Expander bestellt. Da wir uns jedoch für eine andere Bedienart entschieden haben, brauchten wir auch diese nicht mehr. Die zusätzlich enstandenen Kosten berufen sich auf rund 20 €.

Gehäuse[Bearbeiten]

Das Gehäuse unserer "Schiffe" besteht aus einem Milchkarton. Durch die charakteristische Wölbung an der Oberseite des Tetrapacks wird an den Bug eines Schiffes erinnert. So kann mit etwas Kreativität und Fantasie ein Schiff gesehen werden.

Für die Spielfelder und Buttons haben wir entsprechende Aussparungen angelegt und diese farblich markiert. Das Breadboard haben wir innen festgeklebt und die Matrizen und Buttons sind von innen mit zusätzlicher Pappe verstärkt, um dem entstehenden Gegendruck standzuhalten. Wir haben die Milchkartons schwarz angemalt und mit orangener und hellblauer Farbe Akzente gesetzt. Zusätzlich dienen diese Farben der Unterscheidung der beiden Felder sowie der Modelle. Die Trinköffnung des Kartons nutzen wir zur Stromzufuhr.

Software[Bearbeiten]

Setzen der Schiffe[Bearbeiten]

Die Koordinaten eines Punktes (LED) werden durchgehend gespeichert. Es wird geprüft, ob der Rotationsknopf gedrückt wurde und dann berechnet, welche weiteren Pixel aktiviert sein sollen. Dabei wird auch abgefragt, ob sich ein Schiff auf einen Rand hinzubewegt, um bei entsprechender Überschreitung wieder am anderen Ende zu erscheinen, sodass keine Punkte außerhalb der Matrix sein können. Soll ein Schiff durch das Drücken des Eingabeknopfes platziert werden, wird vorher geprüft, ob sich im Umkreis von einer LED schon ein Schiff befindet. In diesem Fall passiert nichts, bis eine geeignete Stelle gewählt wurde und es dort platziert wird. Nach dem Platzieren erscheint ein neues Schiff, bis alle sieben Schiffe positioniert sind.

Datenaustausch[Bearbeiten]

Für den Datenaustausch nutzen wir MQTT. Insgesamt verwenden wir hier fünf Topics. Hat ein Spieler alle Schiffe platziert, erhält der andere per MQTT dies als Information. Sind beide fertig, wird ausgelost wer anfangen darf.

Zu diesem Zeitpunkt wird die zweite Matrix zum ersten Mal benutzt. Der Spieler bewegt einen Punkt über die Matrix und bestimmt so, mit welchem Feld bei dem anderen Spieler angegriffen werden soll. Erfolgt eine Eingabe, werden die Koordinaten per MQTT an den anderen Spieler geleitet, dieser verarbeitet diese Werte und gibt dem Angreifer zurück, ob getroffen wurde oder nicht. Nach der Eingabe ändert sich intern eine Variable, welche bestimmt, wer gerade am Zug ist. Beim Verteidiger ändert sich diese, wenn die Information, ob es ein Treffer war oder nicht, herausgegeben wurde.

Wurde ein Schiff getroffen, steigt bei dem Angreifer ein Zähler. Erreicht dieser den Wert 19, was bedeutet, dass alle Schiffe versenkt wurden, wird eine MQTT Nachricht an den anderen Spieler versendet. Diese Nachricht verkündet, dass er verloren hat. Anschließend setzen sich beide Systeme zurück und es kann ein neues Spiel begonnen werden.