MANUAL

Sea Duel 1.0 — sink the fleet before it sinks yours.

Contents

  1. 1Description
  2. 2Quick start
  3. 3Rules
  4. 4Placing your fleet
  5. 5The board
  6. 6The opponent
  7. 7Two players, one phone
  8. 8Two devices
  9. 9High scores
  10. 10Settings
  11. 11Navigation and saving
  12. 12Without seeing it
  13. 13Privacy
  14. 14Support
  15. 15Version history

1Description

Sea Duel is the classic pen-and-paper naval game for Android. Each side hides five ships on a ten-by-ten grid and calls shots by coordinate until one fleet is gone.

The opponent hunts. It fires blindly until something connects, then works outwards from that hit until the ship goes down. It never reads your board — only the answers to its own shots — so the harder levels search better rather than cheat.

Three ways to play: against the machine, against someone beside you passing the one phone back and forth, or against another device over Wi-Fi, Bluetooth or a relay you run yourself. The rules are plain Kotlin with no Android dependencies, covered by unit tests that include three hundred full games played against themselves.

2Quick start

  1. Open the app. The Game tab shows an empty board and the five ships to place.
  2. Tap Random in the bar at the top, or set all five down by hand.
  3. Tap Start.
  4. Tap a square in enemy waters to fire. The machine answers after a short think.
  5. If the level is wrong for you, change it under Settings › Difficulty — it applies to the next game you start.

3Rules

Each side has a board of ten by ten squares, with columns A to J and rows 1 to 10, so a shot is named like C7. Each side has the same five ships:

ShipLength
Carrier5 squares
Battleship4 squares
Cruiser3 squares
Submarine3 squares
Destroyer2 squares

That is seventeen squares of ship on each board. Ships lie horizontally or vertically, never diagonally, and never overlap. Players fire one shot each in turn at the other's board and are told whether it missed, hit, or sank the ship it hit. Whoever sinks all five enemy ships first wins.

4Placing your fleet

Ships are placed one at a time, largest first. Tapping a square anchors the highlighted ship there and it runs to the right or downwards from that square, so a tap always resolves to one layout with no ambiguity.

The strip under the board shows all five, with the next one framed and the ones already down ticked off.

ControlWhat it does
Horizontal / VerticalTurns the ship you are about to place. Ships already down are not affected.
UndoTakes back the ship you placed last.
RandomIn the bar at the top. Lays out all five at once, replacing whatever was there.
StartAvailable once all five are down. Reads Done in a two-player game, because the phone then changes hands.

A placement that would run off the board or land on a ship already there is refused, and the line above the buttons says which of the two it was.

5The board

Two buttons above the grid switch between Enemy waters and Your fleet, each showing the damage that board has taken out of seventeen. On a tablet, or a phone turned sideways with room enough, both boards are shown at once and the switch disappears.

Colours

ColourMeaning
Water Not yet fired at.
Miss A shot that found nothing.
Hit A shot that struck a ship still afloat.
Sunk A ship on the bottom, hull and all.
Ship One of yours, drawn on your own board.

Your own ships are drawn as hulls rather than rows of blocks, with red blisters on the sections that have been hit. Enemy ships stay hidden until they sink; only then is the wreck revealed. A ship going down lists to one side, slides under and takes the colour of a wreck, with rings closing over it on the surface.

The log

Under the board a card holds the last six lines, oldest at the top and the newest in bold at the foot. Every shot is reported by its coordinate, so a game can be followed by reading rather than by watching.

6The opponent

Three levels. They differ in how the machine looks for a ship it has not yet found; once it has a hit, Normal and Hard both work outwards from it.

LevelHow it huntsAfter a hit
Easyat randomnever follows up — it fires and forgets
Normalat randomtries the four neighbours, then extends the line once the orientation is known
Harda diagonal latticethe same as Normal

The lattice is worth explaining. The machine hunts only on squares where row and column add up to an even number — a chequerboard. Since the smallest ship is two squares long, no ship can sit entirely in the gaps, so half the board can be skipped without ever missing a target.

Difficulty is read at the moment a game starts. Changing it cannot rewrite a game already under way.

7Two players, one phone

Pick 2 players at the top of the setup screen. Player 1 lays out a fleet and taps Done; a hand-over screen then covers everything until Player 2 confirms they are holding the phone. Player 2 lays out theirs, the phone goes back, and play begins.

Between shots the same hand-over screen appears. It deliberately holds nothing but the name of whoever is next and one button — anything else on screen would be something the wrong player could read over the other's shoulder. The shot that was just fired stays visible for a moment first, so the shooter sees where it landed.

Duels are not scored. The high score table ranks how few shots a win against the machine took, and mixing in human opponents would make it meaningless.

8Two devices

Pick Two devices. Once the two are connected, both sides lay out a fleet, and the device that hosted fires first. There are three ways across, chosen with the second row of buttons.

Same Wi-Fi

One device taps Host a game and announces itself on the network; the other taps Search and joins what it finds. If the network blocks that kind of announcement, the host shows its address and the guest can type it in under Address and port.

A VPN will stop this. It routes even local traffic away from the network, so the two devices never see each other. Turn it off, let it bypass the local network, or use Nearby instead.

Nearby

Bluetooth and Wi-Fi Direct, through Google's Nearby Connections. No shared network is needed at all, which is the way out when a guest network or a VPN keeps the two apart. Android asks for permission to look for nearby devices the first time.

Online

Two home routers accept no incoming connections, so neither device can host for the other. Instead both dial out to a relay, which pairs them by a short code and then pipes bytes between them. One side taps Create a game and reads out the code it is given; the other types it in and joins.

The relay is a single Python file, published at djvlk.de/seaduel/relay/, that you run yourself on a machine both sides can reach. It listens on port 8642 by default and understands nothing about the game: once two players are paired it only forwards lines. If the relay is on a public address it can ask for a shared key, which both players type into Access key, and it can be spoken to over TLS with Encrypted connection.

What crosses the wire

Neither device holds both fleets. Each owns its own board and learns about the other's only from the answers to its shots, which is what makes cheating impossible without both ends agreeing to it. Ships are named on the wire by a fixed English name, so two devices understand each other whatever language either one is running in.

A network game cannot be resumed. If it ends early — the other player leaves, or the connection drops — the log says so and the game stops there.

9High scores

The Scores tab holds your record: games played, won and lost, and the win rate as a whole percent. Under it, up to ten best wins ranked by how few shots they took, with the date. A tie goes to the older game, having got there first.

Only wins are ranked — a loss counts towards the record but has no shot count worth placing. Counters are kept in full while only those ten results are stored, so the list cannot grow without bound but "the fiftieth game" stays true. Clear in the bar at the top deletes both, after a confirmation.

10Settings

SettingOptions
DifficultyEasy, Normal, Hard. Applies to the next game you start.
LanguageSystem, German, English. System follows the phone.
AppearanceFollow system, Light, Dark.
Sound effectsSplashes, hits and the fanfare at the end.
VibrationA tick on a hit, a heavier one when a ship goes down.

Changing the language rebuilds the screen, which takes an instant. It is independent of the language the phone is set to, so the app can be German on an English phone and the other way round.

Three destinations — Game, Scores, Settings — reachable two ways: the bar along the bottom, and the drawer behind the button with three lines at the top left. Back from another tab returns to the game rather than leaving the app; back with the drawer open closes the drawer.

A game in progress is written down at every move, and a half-placed fleet too, so closing the app mid-battle loses nothing. The machine even remembers which ship it was chasing. A finished game is not kept: its save is cleared rather than resumed into a dead board. Duel setup is not saved either — the phone is being handed round anyway, and a half-laid fleet belonging to one of two people is not worth the ambiguity.

12Without seeing it

The board is playable with a screen reader. Every square announces where it is and what is on it — "C7, miss", "E4, your Cruiser, hit" — and a tap is announced as firing or as placing a ship, depending on which board it is.

Ship names are only spoken for boards their owner is allowed to see. On the opponent's board a name appears only once the ship has been sunk and revealed.

The newest line of the log is read out as it arrives, so the result of a shot is heard without hunting for it. The letters and numbers around the edge, the hulls drawn over the grid and the marks inside squares are all hidden from screen readers: they repeat what the squares already say, and a hundred of them would be unusable.

13Privacy

Nothing about you is collected. Your scores and settings live in a private preferences file on the device and are deleted with the app. There are no accounts, no ads, no analytics and no third-party SDKs.

Sea Duel does hold network permissions, because two devices can play each other:

PermissionWhat for
INTERNETThe socket to the other device, or to your relay.
Wi-Fi stateAnnouncing and finding games on the same network.
BluetoothNearby Connections, when there is no shared network.
Nearby devicesThe same, on Android 13 and up.
LocationOnly below Android 13, where the system counts scanning for nearby devices as a location capability. The game never asks where anyone is.
VibrateThe tick on a hit.

Nothing leaves the device unless you start a game against another one, and what crosses the wire is shots and their answers, plus the device name each side introduces itself with. There is no server of ours anywhere: a game on the same Wi-Fi goes straight to the other phone, and an online game goes to a relay whose address you type in yourself.

The full text is in the privacy policy; the terms of service sit beside it.

14Support

Questions, bugs and wishes are welcome by email at agrauf67@gmail.com.

Frequently asked questions are answered on the help page.

15Version history

1.0