Seegefecht 1.0 — versenke die Flotte, bevor sie deine versenkt.
Seegefecht ist der Klassiker mit Papier und Bleistift für Android. Jede Seite versteckt fünf Schiffe auf einem Raster von zehn mal zehn Feldern und ruft Schüsse mit ihrer Koordinate auf, bis eine Flotte verloren ist.
Der Gegner jagt. Er schießt blind, bis etwas trifft, und arbeitet sich dann von diesem Treffer aus vor, bis das Schiff untergeht. Er liest dein Spielfeld nie — nur die Antworten auf seine eigenen Schüsse. Die höheren Stufen suchen also besser, statt zu schummeln.
Drei Arten zu spielen: gegen den Computer, gegen jemanden neben dir, wobei das eine Telefon hin und her wandert, oder gegen ein anderes Gerät über WLAN, Bluetooth oder ein Relay, das du selbst betreibst. Die Regeln sind reines Kotlin ohne Android-Abhängigkeiten und durch Unit-Tests abgedeckt, darunter dreihundert vollständige Partien gegen sich selbst.
Jede Seite hat ein Feld aus zehn mal zehn Kästchen, mit den Spalten A bis
J und den Zeilen 1 bis 10. Ein Schuss heißt also etwa
C7. Jede Seite hat dieselben fünf Schiffe:
| Schiff | Länge |
|---|---|
| Flugzeugträger | 5 Felder |
| Schlachtschiff | 4 Felder |
| Kreuzer | 3 Felder |
| U-Boot | 3 Felder |
| Zerstörer | 2 Felder |
Das sind siebzehn Schiffsfelder auf jedem Feld. Schiffe liegen waagerecht oder senkrecht, nie diagonal, und überlappen nie. Beide Seiten feuern abwechselnd einen Schuss auf das Feld der anderen und erfahren, ob er danebenging, traf oder das getroffene Schiff versenkte. Wer zuerst alle fünf gegnerischen Schiffe versenkt, gewinnt.
Die Schiffe werden einzeln gesetzt, das größte zuerst. Ein Tippen verankert das hervorgehobene Schiff auf diesem Feld; von dort läuft es nach rechts oder nach unten. Ein Tippen ergibt damit immer genau eine Lage, ohne Mehrdeutigkeit.
Die Leiste unter dem Feld zeigt alle fünf: das nächste umrahmt, die schon gesetzten abgehakt.
| Bedienelement | Wirkung |
|---|---|
| Waagerecht / Senkrecht | Dreht das Schiff, das als Nächstes gesetzt wird. Bereits gesetzte bleiben, wie sie liegen. |
| Zurück | Nimmt das zuletzt gesetzte Schiff wieder weg. |
| Zufällig | Oben in der Leiste. Setzt alle fünf auf einmal und ersetzt, was da war. |
| Start | Verfügbar, sobald alle fünf stehen. Heißt Fertig im Spiel zu zweit, weil das Telefon dann weitergereicht wird. |
Eine Lage, die über den Rand ragen oder auf einem schon gesetzten Schiff landen würde, wird abgelehnt — die Zeile über den Schaltflächen sagt, welches von beidem es war.
Zwei Schaltflächen über dem Raster wechseln zwischen Feindliche Gewässer und Deine Flotte und zeigen jeweils den Schaden dieses Feldes von siebzehn. Auf einem Tablet, oder einem quer gehaltenen Telefon mit genug Platz, stehen beide Felder nebeneinander und der Umschalter verschwindet.
| Farbe | Bedeutung |
|---|---|
| Wasser | Noch nicht beschossen. |
| Daneben | Ein Schuss, der nichts gefunden hat. |
| Treffer | Ein Schuss auf ein Schiff, das noch schwimmt. |
| Versenkt | Ein Schiff auf dem Grund, mitsamt Rumpf. |
| Schiff | Eines von deinen, gezeichnet auf deinem eigenen Feld. |
Deine eigenen Schiffe werden als Rümpfe gezeichnet statt als Reihen von Blöcken, mit roten Blasen auf den getroffenen Abschnitten. Gegnerische Schiffe bleiben verborgen, bis sie sinken; erst dann wird das Wrack sichtbar. Ein sinkendes Schiff legt sich auf die Seite, rutscht unter Wasser und nimmt die Farbe eines Wracks an, während sich an der Oberfläche Ringe darüber schließen.
Unter dem Feld hält eine Karte die letzten sechs Zeilen, die älteste oben und die neueste fett unten. Jeder Schuss wird mit seiner Koordinate gemeldet, sodass sich eine Partie auch lesend statt zusehend verfolgen lässt.
Drei Stufen. Sie unterscheiden sich darin, wie der Computer nach einem noch nicht gefundenen Schiff sucht; hat er erst einen Treffer, arbeiten sich Normal und Schwer beide von dort vor.
| Stufe | Wie er sucht | Nach einem Treffer |
|---|---|---|
| Leicht | zufällig | verfolgt ihn nie weiter — er feuert und vergisst |
| Normal | zufällig | probiert die vier Nachbarfelder und verlängert dann die Linie, sobald die Richtung feststeht |
| Schwer | ein diagonales Raster | wie bei Normal |
Das Raster ist eine Erklärung wert. Der Computer sucht nur auf Feldern, deren Zeile und Spalte zusammen eine gerade Zahl ergeben — ein Schachbrettmuster. Da das kleinste Schiff zwei Felder lang ist, passt keines vollständig in die Lücken. Damit lässt sich das halbe Feld überspringen, ohne je ein Ziel zu verfehlen.
Die Schwierigkeit wird in dem Moment gelesen, in dem eine Partie beginnt. Eine Änderung kann eine laufende Partie nicht nachträglich umschreiben.
Oben im Aufbau-Bildschirm 2 Spieler wählen. Spieler 1 stellt eine Flotte auf und tippt auf Fertig; ein Übergabe-Bildschirm verdeckt dann alles, bis Spieler 2 bestätigt, dass er das Telefon in der Hand hält. Spieler 2 stellt seine Flotte auf, das Telefon geht zurück, und es geht los.
Zwischen den Schüssen erscheint derselbe Übergabe-Bildschirm. Er zeigt bewusst nichts außer dem Namen des Nächsten und einer Schaltfläche — alles andere wäre etwas, das der falsche Spieler dem anderen über die Schulter lesen könnte. Der eben abgegebene Schuss bleibt vorher noch einen Moment sichtbar, damit der Schütze sieht, wo er eingeschlagen ist.
Partien zu zweit werden nicht gewertet. Die Bestenliste ordnet ein, mit wie wenigen Schüssen ein Sieg gegen den Computer gelang; menschliche Gegner dazwischen würden sie bedeutungslos machen.
Zwei Geräte wählen. Sobald die beiden verbunden sind, stellt jede Seite eine Flotte auf, und das Gerät, das eröffnet hat, feuert zuerst. Es gibt drei Wege hinüber, wählbar in der zweiten Schaltflächenreihe.
Ein Gerät tippt auf Spiel eröffnen und kündigt sich im Netz an; das andere tippt auf Suchen und tritt dem bei, was es findet. Blockiert das Netz solche Ankündigungen, zeigt der Gastgeber seine Adresse an und der Gast trägt sie unter Adresse und Port ein.
Ein VPN verhindert das. Es leitet sogar den lokalen Verkehr aus dem Netz heraus, sodass sich die beiden Geräte nie sehen. Schalte es aus, lass es das lokale Netz umgehen, oder nimm stattdessen „In der Nähe".
Bluetooth und WLAN Direct über Googles Nearby Connections. Ganz ohne gemeinsames Netz — der Ausweg, wenn ein Gastnetz oder ein VPN die beiden trennt. Android fragt beim ersten Mal nach der Erlaubnis, nach Geräten in der Nähe zu suchen.
Zwei Heimrouter nehmen keine eingehenden Verbindungen an, also kann keines der Geräte für das andere eröffnen. Stattdessen wählen sich beide bei einem Relay ein, das sie über einen kurzen Code zusammenbringt und danach Bytes zwischen ihnen durchreicht. Eine Seite tippt auf Spiel erstellen und liest den Code vor, den sie bekommt; die andere tippt ihn ein und tritt bei.
Das Relay ist eine einzelne Python-Datei, veröffentlicht unter
djvlk.de/seaduel/relay/, die du selbst auf einer Maschine
betreibst, die beide Seiten erreichen. Sie lauscht standardmäßig auf
Port 8642 und versteht nichts vom Spiel: sind zwei Spieler erst gepaart, leitet sie
nur noch Zeilen weiter. Steht das Relay auf einer öffentlichen Adresse, kann es einen gemeinsamen
Schlüssel verlangen, den beide Spieler unter Zugangsschlüssel eintragen, und es lässt sich
mit Verschlüsselte Verbindung über TLS ansprechen.
Kein Gerät kennt beide Flotten. Jedes besitzt sein eigenes Feld und erfährt vom anderen nur durch die Antworten auf seine Schüsse. Genau das macht Schummeln unmöglich, solange nicht beide Seiten mitmachen. Schiffe werden auf der Leitung mit einem festen englischen Namen benannt, damit sich zwei Geräte verstehen, gleich in welcher Sprache jedes davon läuft.
Eine Netzwerkpartie lässt sich nicht fortsetzen. Endet sie vorzeitig — der andere Spieler geht, oder die Verbindung bricht ab — sagt das Log es, und die Partie endet dort.
Der Reiter Bestenliste hält deine Bilanz: gespielte, gewonnene und verlorene Partien sowie die Siegquote in ganzen Prozent. Darunter bis zu zehn beste Siege, geordnet nach der Zahl der Schüsse, mit Datum. Bei Gleichstand gewinnt die ältere Partie, weil sie zuerst da war.
Gewertet werden nur Siege — eine Niederlage zählt für die Bilanz, hat aber keine Schusszahl, die sich einordnen ließe. Die Zähler werden vollständig geführt, während nur diese zehn Ergebnisse gespeichert sind. So kann die Liste nicht unbegrenzt wachsen, und „die fünfzigste Partie" stimmt trotzdem. Löschen oben in der Leiste entfernt beides, nach einer Rückfrage.
| Einstellung | Möglichkeiten |
|---|---|
| Schwierigkeit | Leicht, Normal, Schwer. Gilt ab der nächsten Partie. |
| Sprache | System, Deutsch, Englisch. System folgt dem Telefon. |
| Darstellung | Wie das System, Hell, Dunkel. |
| Geräusche | Einschläge, Treffer und die Fanfare am Ende. |
| Vibration | Ein kurzer Stoß bei einem Treffer, ein kräftigerer beim Untergang. |
Ein Sprachwechsel baut den Bildschirm neu auf, was einen Augenblick dauert. Er ist unabhängig von der Sprache des Telefons — die App kann also deutsch auf einem englischen Telefon sein und umgekehrt.
Drei Ziele — Spiel, Bestenliste, Einstellungen — auf zwei Wegen erreichbar: über die Leiste am unteren Rand und über die Schublade hinter der Schaltfläche mit den drei Strichen oben links. Zurück aus einem anderen Reiter führt zum Spiel statt aus der App; Zurück bei offener Schublade schließt die Schublade.
Eine laufende Partie wird bei jedem Zug festgehalten, eine halb gesetzte Flotte ebenso — die App mitten im Gefecht zu schließen verliert also nichts. Der Computer weiß sogar noch, welches Schiff er gerade verfolgt hat. Eine beendete Partie wird nicht aufgehoben: ihr Speicherstand wird gelöscht, statt in ein totes Feld zurückzuführen. Der Aufbau zu zweit wird ebenfalls nicht gespeichert — das Telefon wandert ohnehin herum, und eine halb gesetzte Flotte, die einem von zwei Leuten gehört, ist die Mehrdeutigkeit nicht wert.
Das Feld ist mit einem Screenreader spielbar. Jedes Feld sagt an, wo es liegt und was darauf ist — „C7, daneben", „E4, dein Kreuzer, getroffen" — und ein Tippen wird als Feuern oder als Setzen eines Schiffs angekündigt, je nachdem, um welches Feld es geht.
Schiffsnamen werden nur für Felder gesprochen, die ihr Besitzer sehen darf. Auf dem gegnerischen Feld erscheint ein Name erst, wenn das Schiff versenkt und aufgedeckt ist.
Die neueste Zeile des Logs wird vorgelesen, sobald sie eintrifft, sodass das Ergebnis eines Schusses zu hören ist, ohne danach suchen zu müssen. Die Buchstaben und Zahlen am Rand, die über das Raster gezeichneten Rümpfe und die Zeichen in den Kästchen sind vor Screenreadern verborgen: sie wiederholen, was die Felder ohnehin sagen, und hundert davon wären unbenutzbar.
Es wird nichts über dich erhoben. Bestenliste und Einstellungen liegen in einer privaten Einstellungsdatei auf dem Gerät und werden mit der App gelöscht. Es gibt keine Konten, keine Werbung, keine Analyse und keine Fremd-SDKs.
Netzwerkrechte hat Seegefecht, weil zwei Geräte gegeneinander spielen können:
| Recht | Wofür |
|---|---|
INTERNET | Die Verbindung zum anderen Gerät oder zu deinem Relay. |
| WLAN-Status | Spiele im selben Netz ankündigen und finden. |
| Bluetooth | Nearby Connections, wenn es kein gemeinsames Netz gibt. |
| Geräte in der Nähe | Dasselbe, ab Android 13. |
| Standort | Nur vor Android 13, wo das System die Suche nach Geräten in der Nähe als Standortfunktion zählt. Das Spiel fragt nie, wo jemand ist. |
| Vibration | Der Stoß bei einem Treffer. |
Nichts verlässt das Gerät, solange du keine Partie gegen ein anderes startest, und über die Leitung gehen Schüsse und deren Antworten sowie der Gerätename, mit dem sich jede Seite vorstellt. Es gibt nirgends einen Server von uns: eine Partie im selben WLAN geht direkt zum anderen Telefon, und eine Online-Partie zu einem Relay, dessen Adresse du selbst einträgst.
Der vollständige Text steht in der Datenschutzerklärung; daneben liegen die Nutzungsbedingungen.
Fragen, Fehler und Wünsche gern per E-Mail an agrauf67@gmail.com.
Häufige Fragen beantwortet die Hilfeseite.