Home Reference Source Demo Test

Battleship

This software package is written in Node JavaScript, and represents the back-end system for playing the game Battleship.

According to Wikipedia:

Battleship is a strategy type guessing game for two players. It is played on ruled grids (paper or board) on which each player's fleet of ships (including battleships) are marked. The locations of the fleets are concealed from the other player. Players alternate turns calling "shots" at the other player's ships, and the objective of the game is to destroy the opposing player's fleet.

Paper version of Battleship

Installation

Node version 8 or greater must be installed, as well as npm (Node Package Manager). In a terminal window, install the required Node packages:

npm install

ESDOCS

The Esdoc system is used to generate web pages describing the software components. By adding special text comments called "annotations" within the code, the esdoc Node module reads the source files and generates the output files. The configuration for Esdoc is in the esdoc section of the package.json file. The documents have already been generated (in this zipfile of Battleship) and are located in the docs directory.

Here is an screen shot of the ESDOCS:


The documents can be generated again with a command in the scripts section of package.json. The "Dev dependencies" (esdoc and related esdoc plugins) in the package.json must be installed prior to generating the docs.

npm install --dev
npm run docs

Demo Docs Server

Static HTML content (files) can be opened with a web browser, but dynamic content requires a web server to generate the content. In the Esdocs, a "Demo" web page has been created, that "auto-plays" a random arrangement of ships. Each time the demo page is reloaded, a new game is played and displayed. This new game is created by a Node program in the scripts directory (scripts/create-demo.js).


A Node program (scripts/serve-docs.js) has been included in this package that runs a local HTTP server (on port 8081) that will serve these ESDOCS. A command in the scripts section of package.json ("serve") will start this local server and automatically open the default browser to the Home page of the documentation. Please run the install command first, then the serve command NOW so you can see the documentation for the sections to be described below.

npm install
npm run serve

This ReadMe page is duplicated by Esdocs and displayed on the Home link in the navigation bar.

If for some reason Node cannot open a local HTTP server on port 8081, please open the docs home page directly in your browser:

open docs/index.html

In this case, the Demo page is static and reloading it will just display the same game simulation.

Object-oriented Design

All the objects are displayed in the left column of the Esdocs web page. Please click on each item to display a detailed web page with a description of all its members and methods.


The Board is the main object that contains tiles and ships, and the methods to add ships, automatically set up the board, and conduct attacks. The Board also has a Moves object, which keeps track of the history of the game, including a string and HTML representation of the board after each move (attack).


The parameters object contains all the constants for configuring the game:


The shipTypes is an object containing the essential information for a given ship type:


The Game class implements a strategy for playing the game, and is used to create the Demo page of the Esdocs. The Game constructor creates a new board and then sets up the board with ships at random positions. The Game has a play method that conducts random attacks until a hit is achieved. Then the surrounding tiles of the hit are stored on a stack to be attacked.


When a second hit is achieved, the stack is filtered to positions that are in a line with the last hit. When an attack results in a sunken ship, the stack is emptied. But if the stack is emptied without a sunken ship, the last stack is restored. This is done because if two ships are adjacent, the filtering strategy would remove positions that should still be tried. This relatively simple strategy greatly improves the rate at which all ships are sunk.


The auto-play game strategy usually results in a ship being sunk if a few moves after any one of its positions are hit. Since a submarine has a length of 1 (only 1 tile), it is the hardest ship to sink. Most often, the submarine is the last ship to be sunk in the auto-play simulation.

Unit and Functional Tests

The Mocha testing utility and the Chai assertion library are used to write unit tests for every class and class method. The tests are displayed in the Test link in the navigation bar.

The Demo link in the navigation bar is an end-to-end functional test of Battleship. Each time the Demo page is reloaded (while the "npm run server" command is executing), a new instance of the Game class is created, which creates a new instance of Board which is set up with all required ships at random (valid) positions. Then the play method of Game is called.

The results of the Demo game are displayed as table with 3 columns:


Scrolling down the demo page shows the effectiveness of the auto-play strategy. After a random attack results in a hit, the positions surrounding that hit are called and the ship is usually sunk in a few moves later.

Changing Game Parameters

The game parameters are in the file parameters.js. The values for numRows and numColumns can be edited to change the size of the board. The values in shipTypes can be edited to change the type of ships on the board, their length, number of each type, and color displayed.

Playing the game

A Node program is included in the package to allow a single player to attack a board with a random arrangment of ships. In a terminal window this command starts the game:

npm run play

This starts the program scripts/play.js, which displays the board after each attack and a prompt to enter the next attack.

Let's attack 2, 2. It is a Miss, so the tile is shown with an "x" in a dark gray:

Let's attack 6, 2. It is a Hit, so the tile is shown with an "x" in orange:

Here are a few more attacks:

Now we get a Hit on the last position of a ship, so it is sunk and marked with all x's in red.

After many moves, we finally sink the last ship:

Future extensions

Future extensions to this package could be a hosted Express (Node) web site with API routes to start a new game, add ships, and accept moves (attacks) upon the enemy. This could be accompanied by a front-end web site to allow players to use these APIs and display both the "Home View" (Game view for the player), and "Player View" for tracking the attacks upon the enemies. These would correspond to the "Game View" and "Player View" columns of the Demo page.

DescriptionGame ViewPlayer View

INITIAL BOARD

oooooooooo
oooooooooo
oooooooooo
oooooooooo
oooooooooo
oooooooooo
oooooooooo
oooooooooo
oooooooooo
oooooooooo
oooooooooo
oooooooooo
oooooooooo
oooooooooo
oooooooooo
oooooooooo
oooooooooo
oooooooooo
oooooooooo
oooooooooo

Move #1

Random attack

Attack(6, 2)

MISS

oooooooooo
oooooooooo
oooooooooo
oooooooooo
oooooooooo
oooooooooo
ooxooooooo
oooooooooo
oooooooooo
oooooooooo
oooooooooo
oooooooooo
oooooooooo
oooooooooo
oooooooooo
oooooooooo
ooxooooooo
oooooooooo
oooooooooo
oooooooooo

Move #2

Random attack

Attack(5, 5)

MISS

oooooooooo
oooooooooo
oooooooooo
oooooooooo
oooooooooo
oooooxoooo
ooxooooooo
oooooooooo
oooooooooo
oooooooooo
oooooooooo
oooooooooo
oooooooooo
oooooooooo
oooooooooo
oooooxoooo
ooxooooooo
oooooooooo
oooooooooo
oooooooooo

Move #3

Random attack

Attack(2, 4)

HIT

oooooooooo
oooooooooo
ooooxooooo
oooooooooo
oooooooooo
oooooxoooo
ooxooooooo
oooooooooo
oooooooooo
oooooooooo
oooooooooo
oooooooooo
ooooxooooo
oooooooooo
oooooooooo
oooooxoooo
ooxooooooo
oooooooooo
oooooooooo
oooooooooo

Move #4

Attack(2, 5)

HIT

oooooooooo
oooooooooo
ooooxxoooo
oooooooooo
oooooooooo
oooooxoooo
ooxooooooo
oooooooooo
oooooooooo
oooooooooo
oooooooooo
oooooooooo
ooooxxoooo
oooooooooo
oooooooooo
oooooxoooo
ooxooooooo
oooooooooo
oooooooooo
oooooooooo

Move #5

Attack(2, 6)

MISS

oooooooooo
oooooooooo
ooooxxxooo
oooooooooo
oooooooooo
oooooxoooo
ooxooooooo
oooooooooo
oooooooooo
oooooooooo
oooooooooo
oooooooooo
ooooxxxooo
oooooooooo
oooooooooo
oooooxoooo
ooxooooooo
oooooooooo
oooooooooo
oooooooooo

Move #6

Attack(2, 3)

HIT

oooooooooo
oooooooooo
oooxxxxooo
oooooooooo
oooooooooo
oooooxoooo
ooxooooooo
oooooooooo
oooooooooo
oooooooooo
oooooooooo
oooooooooo
oooxxxxooo
oooooooooo
oooooooooo
oooooxoooo
ooxooooooo
oooooooooo
oooooooooo
oooooooooo

Move #7

Attack(2, 2)

HIT

oooooooooo
oooooooooo
ooxxxxxooo
oooooooooo
oooooooooo
oooooxoooo
ooxooooooo
oooooooooo
oooooooooo
oooooooooo
oooooooooo
oooooooooo
ooxxxxxooo
oooooooooo
oooooooooo
oooooxoooo
ooxooooooo
oooooooooo
oooooooooo
oooooooooo

Move #8

Attack(2, 1)

SUNK

oooooooooo
oooooooooo
oxxxxxxooo
oooooooooo
oooooooooo
oooooxoooo
ooxooooooo
oooooooooo
oooooooooo
oooooooooo
oooooooooo
oooooooooo
oxxxxxxooo
oooooooooo
oooooooooo
oooooxoooo
ooxooooooo
oooooooooo
oooooooooo
oooooooooo

Move #9

Attack(3, 2)

MISS

oooooooooo
oooooooooo
oxxxxxxooo
ooxooooooo
oooooooooo
oooooxoooo
ooxooooooo
oooooooooo
oooooooooo
oooooooooo
oooooooooo
oooooooooo
oxxxxxxooo
ooxooooooo
oooooooooo
oooooxoooo
ooxooooooo
oooooooooo
oooooooooo
oooooooooo

Move #10

Attack(1, 2)

MISS

oooooooooo
ooxooooooo
oxxxxxxooo
ooxooooooo
oooooooooo
oooooxoooo
ooxooooooo
oooooooooo
oooooooooo
oooooooooo
oooooooooo
ooxooooooo
oxxxxxxooo
ooxooooooo
oooooooooo
oooooxoooo
ooxooooooo
oooooooooo
oooooooooo
oooooooooo

Move #11

Random attack

Attack(2, 7)

MISS

oooooooooo
ooxooooooo
oxxxxxxxoo
ooxooooooo
oooooooooo
oooooxoooo
ooxooooooo
oooooooooo
oooooooooo
oooooooooo
oooooooooo
ooxooooooo
oxxxxxxxoo
ooxooooooo
oooooooooo
oooooxoooo
ooxooooooo
oooooooooo
oooooooooo
oooooooooo

Move #12

Random attack

Attack(5, 1)

MISS

oooooooooo
ooxooooooo
oxxxxxxxoo
ooxooooooo
oooooooooo
oxoooxoooo
ooxooooooo
oooooooooo
oooooooooo
oooooooooo
oooooooooo
ooxooooooo
oxxxxxxxoo
ooxooooooo
oooooooooo
oxoooxoooo
ooxooooooo
oooooooooo
oooooooooo
oooooooooo

Move #13

Random attack

Attack(8, 1)

SUNK

oooooooooo
ooxooooooo
oxxxxxxxoo
ooxooooooo
oooooooooo
oxoooxoooo
ooxooooooo
oooooooooo
oxoooooooo
oooooooooo
oooooooooo
ooxooooooo
oxxxxxxxoo
ooxooooooo
oooooooooo
oxoooxoooo
ooxooooooo
oooooooooo
oxoooooooo
oooooooooo

Move #14

Random attack

Attack(5, 9)

MISS

oooooooooo
ooxooooooo
oxxxxxxxoo
ooxooooooo
oooooooooo
oxoooxooox
ooxooooooo
oooooooooo
oxoooooooo
oooooooooo
oooooooooo
ooxooooooo
oxxxxxxxoo
ooxooooooo
oooooooooo
oxoooxooox
ooxooooooo
oooooooooo
oxoooooooo
oooooooooo

Move #15

Random attack

Attack(0, 7)

MISS

oooooooxoo
ooxooooooo
oxxxxxxxoo
ooxooooooo
oooooooooo
oxoooxooox
ooxooooooo
oooooooooo
oxoooooooo
oooooooooo
oooooooxoo
ooxooooooo
oxxxxxxxoo
ooxooooooo
oooooooooo
oxoooxooox
ooxooooooo
oooooooooo
oxoooooooo
oooooooooo

Move #16

Random attack

Attack(6, 6)

MISS

oooooooxoo
ooxooooooo
oxxxxxxxoo
ooxooooooo
oooooooooo
oxoooxooox
ooxoooxooo
oooooooooo
oxoooooooo
oooooooooo
oooooooxoo
ooxooooooo
oxxxxxxxoo
ooxooooooo
oooooooooo
oxoooxooox
ooxoooxooo
oooooooooo
oxoooooooo
oooooooooo

Move #17

Random attack

Attack(4, 5)

MISS

oooooooxoo
ooxooooooo
oxxxxxxxoo
ooxooooooo
oooooxoooo
oxoooxooox
ooxoooxooo
oooooooooo
oxoooooooo
oooooooooo
oooooooxoo
ooxooooooo
oxxxxxxxoo
ooxooooooo
oooooxoooo
oxoooxooox
ooxoooxooo
oooooooooo
oxoooooooo
oooooooooo

Move #18

Random attack

Attack(1, 9)

MISS

oooooooxoo
ooxoooooox
oxxxxxxxoo
ooxooooooo
oooooxoooo
oxoooxooox
ooxoooxooo
oooooooooo
oxoooooooo
oooooooooo
oooooooxoo
ooxoooooox
oxxxxxxxoo
ooxooooooo
oooooxoooo
oxoooxooox
ooxoooxooo
oooooooooo
oxoooooooo
oooooooooo

Move #19

Random attack

Attack(1, 3)

MISS

oooooooxoo
ooxxooooox
oxxxxxxxoo
ooxooooooo
oooooxoooo
oxoooxooox
ooxoooxooo
oooooooooo
oxoooooooo
oooooooooo
oooooooxoo
ooxxooooox
oxxxxxxxoo
ooxooooooo
oooooxoooo
oxoooxooox
ooxoooxooo
oooooooooo
oxoooooooo
oooooooooo

Move #20

Random attack

Attack(0, 1)

MISS

oxoooooxoo
ooxxooooox
oxxxxxxxoo
ooxooooooo
oooooxoooo
oxoooxooox
ooxoooxooo
oooooooooo
oxoooooooo
oooooooooo
oxoooooxoo
ooxxooooox
oxxxxxxxoo
ooxooooooo
oooooxoooo
oxoooxooox
ooxoooxooo
oooooooooo
oxoooooooo
oooooooooo

Move #21

Random attack

Attack(7, 4)

MISS

oxoooooxoo
ooxxooooox
oxxxxxxxoo
ooxooooooo
oooooxoooo
oxoooxooox
ooxoooxooo
ooooxooooo
oxoooooooo
oooooooooo
oxoooooxoo
ooxxooooox
oxxxxxxxoo
ooxooooooo
oooooxoooo
oxoooxooox
ooxoooxooo
ooooxooooo
oxoooooooo
oooooooooo

Move #22

Random attack

Attack(8, 2)

MISS

oxoooooxoo
ooxxooooox
oxxxxxxxoo
ooxooooooo
oooooxoooo
oxoooxooox
ooxoooxooo
ooooxooooo
oxxooooooo
oooooooooo
oxoooooxoo
ooxxooooox
oxxxxxxxoo
ooxooooooo
oooooxoooo
oxoooxooox
ooxoooxooo
ooooxooooo
oxxooooooo
oooooooooo

Move #23

Random attack

Attack(6, 8)

MISS

oxoooooxoo
ooxxooooox
oxxxxxxxoo
ooxooooooo
oooooxoooo
oxoooxooox
ooxoooxoxo
ooooxooooo
oxxooooooo
oooooooooo
oxoooooxoo
ooxxooooox
oxxxxxxxoo
ooxooooooo
oooooxoooo
oxoooxooox
ooxoooxoxo
ooooxooooo
oxxooooooo
oooooooooo

Move #24

Random attack

Attack(8, 0)

MISS

oxoooooxoo
ooxxooooox
oxxxxxxxoo
ooxooooooo
oooooxoooo
oxoooxooox
ooxoooxoxo
ooooxooooo
xxxooooooo
oooooooooo
oxoooooxoo
ooxxooooox
oxxxxxxxoo
ooxooooooo
oooooxoooo
oxoooxooox
ooxoooxoxo
ooooxooooo
xxxooooooo
oooooooooo

Move #25

Random attack

Attack(9, 7)

MISS

oxoooooxoo
ooxxooooox
oxxxxxxxoo
ooxooooooo
oooooxoooo
oxoooxooox
ooxoooxoxo
ooooxooooo
xxxooooooo
oooooooxoo
oxoooooxoo
ooxxooooox
oxxxxxxxoo
ooxooooooo
oooooxoooo
oxoooxooox
ooxoooxoxo
ooooxooooo
xxxooooooo
oooooooxoo

Move #26

Random attack

Attack(9, 9)

MISS

oxoooooxoo
ooxxooooox
oxxxxxxxoo
ooxooooooo
oooooxoooo
oxoooxooox
ooxoooxoxo
ooooxooooo
xxxooooooo
oooooooxox
oxoooooxoo
ooxxooooox
oxxxxxxxoo
ooxooooooo
oooooxoooo
oxoooxooox
ooxoooxoxo
ooooxooooo
xxxooooooo
oooooooxox

Move #27

Random attack

Attack(7, 7)

HIT

oxoooooxoo
ooxxooooox
oxxxxxxxoo
ooxooooooo
oooooxoooo
oxoooxooox
ooxoooxoxo
ooooxooxoo
xxxooooooo
oooooooxox
oxoooooxoo
ooxxooooox
oxxxxxxxoo
ooxooooooo
oooooxoooo
oxoooxooox
ooxoooxoxo
ooooxooxoo
xxxooooooo
oooooooxox

Move #28

Attack(7, 8)

MISS

oxoooooxoo
ooxxooooox
oxxxxxxxoo
ooxooooooo
oooooxoooo
oxoooxooox
ooxoooxoxo
ooooxooxxo
xxxooooooo
oooooooxox
oxoooooxoo
ooxxooooox
oxxxxxxxoo
ooxooooooo
oooooxoooo
oxoooxooox
ooxoooxoxo
ooooxooxxo
xxxooooooo
oooooooxox

Move #29

Attack(7, 6)

MISS

oxoooooxoo
ooxxooooox
oxxxxxxxoo
ooxooooooo
oooooxoooo
oxoooxooox
ooxoooxoxo
ooooxoxxxo
xxxooooooo
oooooooxox
oxoooooxoo
ooxxooooox
oxxxxxxxoo
ooxooooooo
oooooxoooo
oxoooxooox
ooxoooxoxo
ooooxoxxxo
xxxooooooo
oooooooxox

Move #30

Attack(8, 7)

MISS

oxoooooxoo
ooxxooooox
oxxxxxxxoo
ooxooooooo
oooooxoooo
oxoooxooox
ooxoooxoxo
ooooxoxxxo
xxxooooxoo
oooooooxox
oxoooooxoo
ooxxooooox
oxxxxxxxoo
ooxooooooo
oooooxoooo
oxoooxooox
ooxoooxoxo
ooooxoxxxo
xxxooooxoo
oooooooxox

Move #31

Attack(6, 7)

SUNK

oxoooooxoo
ooxxooooox
oxxxxxxxoo
ooxooooooo
oooooxoooo
oxoooxooox
ooxoooxxxo
ooooxoxxxo
xxxooooxoo
oooooooxox
oxoooooxoo
ooxxooooox
oxxxxxxxoo
ooxooooooo
oooooxoooo
oxoooxooox
ooxoooxxxo
ooooxoxxxo
xxxooooxoo
oooooooxox

Move #32

Random attack

Attack(6, 3)

MISS

oxoooooxoo
ooxxooooox
oxxxxxxxoo
ooxooooooo
oooooxoooo
oxoooxooox
ooxxooxxxo
ooooxoxxxo
xxxooooxoo
oooooooxox
oxoooooxoo
ooxxooooox
oxxxxxxxoo
ooxooooooo
oooooxoooo
oxoooxooox
ooxxooxxxo
ooooxoxxxo
xxxooooxoo
oooooooxox

Move #33

Random attack

Attack(0, 4)

MISS

oxooxooxoo
ooxxooooox
oxxxxxxxoo
ooxooooooo
oooooxoooo
oxoooxooox
ooxxooxxxo
ooooxoxxxo
xxxooooxoo
oooooooxox
oxooxooxoo
ooxxooooox
oxxxxxxxoo
ooxooooooo
oooooxoooo
oxoooxooox
ooxxooxxxo
ooooxoxxxo
xxxooooxoo
oooooooxox

Move #34

Random attack

Attack(7, 3)

MISS

oxooxooxoo
ooxxooooox
oxxxxxxxoo
ooxooooooo
oooooxoooo
oxoooxooox
ooxxooxxxo
oooxxoxxxo
xxxooooxoo
oooooooxox
oxooxooxoo
ooxxooooox
oxxxxxxxoo
ooxooooooo
oooooxoooo
oxoooxooox
ooxxooxxxo
oooxxoxxxo
xxxooooxoo
oooooooxox

Move #35

Random attack

Attack(4, 6)

MISS

oxooxooxoo
ooxxooooox
oxxxxxxxoo
ooxooooooo
oooooxxooo
oxoooxooox
ooxxooxxxo
oooxxoxxxo
xxxooooxoo
oooooooxox
oxooxooxoo
ooxxooooox
oxxxxxxxoo
ooxooooooo
oooooxxooo
oxoooxooox
ooxxooxxxo
oooxxoxxxo
xxxooooxoo
oooooooxox

Move #36

Random attack

Attack(3, 9)

MISS

oxooxooxoo
ooxxooooox
oxxxxxxxoo
ooxoooooox
oooooxxooo
oxoooxooox
ooxxooxxxo
oooxxoxxxo
xxxooooxoo
oooooooxox
oxooxooxoo
ooxxooooox
oxxxxxxxoo
ooxoooooox
oooooxxooo
oxoooxooox
ooxxooxxxo
oooxxoxxxo
xxxooooxoo
oooooooxox

Move #37

Random attack

Attack(1, 4)

HIT

oxooxooxoo
ooxxxoooox
oxxxxxxxoo
ooxoooooox
oooooxxooo
oxoooxooox
ooxxooxxxo
oooxxoxxxo
xxxooooxoo
oooooooxox
oxooxooxoo
ooxxxoooox
oxxxxxxxoo
ooxoooooox
oooooxxooo
oxoooxooox
ooxxooxxxo
oooxxoxxxo
xxxooooxoo
oooooooxox

Move #38

Attack(1, 5)

HIT

oxooxooxoo
ooxxxxooox
oxxxxxxxoo
ooxoooooox
oooooxxooo
oxoooxooox
ooxxooxxxo
oooxxoxxxo
xxxooooxoo
oooooooxox
oxooxooxoo
ooxxxxooox
oxxxxxxxoo
ooxoooooox
oooooxxooo
oxoooxooox
ooxxooxxxo
oooxxoxxxo
xxxooooxoo
oooooooxox

Move #39

Attack(1, 6)

HIT

oxooxooxoo
ooxxxxxoox
oxxxxxxxoo
ooxoooooox
oooooxxooo
oxoooxooox
ooxxooxxxo
oooxxoxxxo
xxxooooxoo
oooooooxox
oxooxooxoo
ooxxxxxoox
oxxxxxxxoo
ooxoooooox
oooooxxooo
oxoooxooox
ooxxooxxxo
oooxxoxxxo
xxxooooxoo
oooooooxox

Move #40

Attack(1, 7)

SUNK

oxooxooxoo
ooxxxxxxox
oxxxxxxxoo
ooxoooooox
oooooxxooo
oxoooxooox
ooxxooxxxo
oooxxoxxxo
xxxooooxoo
oooooooxox
oxooxooxoo
ooxxxxxxox
oxxxxxxxoo
ooxoooooox
oooooxxooo
oxoooxooox
ooxxooxxxo
oooxxoxxxo
xxxooooxoo
oooooooxox

Move #41

Attack(0, 6)

MISS

oxooxoxxoo
ooxxxxxxox
oxxxxxxxoo
ooxoooooox
oooooxxooo
oxoooxooox
ooxxooxxxo
oooxxoxxxo
xxxooooxoo
oooooooxox
oxooxoxxoo
ooxxxxxxox
oxxxxxxxoo
ooxoooooox
oooooxxooo
oxoooxooox
ooxxooxxxo
oooxxoxxxo
xxxooooxoo
oooooooxox

Move #42

Random attack

Attack(9, 4)

HIT

oxooxoxxoo
ooxxxxxxox
oxxxxxxxoo
ooxoooooox
oooooxxooo
oxoooxooox
ooxxooxxxo
oooxxoxxxo
xxxooooxoo
ooooxooxox
oxooxoxxoo
ooxxxxxxox
oxxxxxxxoo
ooxoooooox
oooooxxooo
oxoooxooox
ooxxooxxxo
oooxxoxxxo
xxxooooxoo
ooooxooxox

Move #43

Attack(9, 5)

MISS

oxooxoxxoo
ooxxxxxxox
oxxxxxxxoo
ooxoooooox
oooooxxooo
oxoooxooox
ooxxooxxxo
oooxxoxxxo
xxxooooxoo
ooooxxoxox
oxooxoxxoo
ooxxxxxxox
oxxxxxxxoo
ooxoooooox
oooooxxooo
oxoooxooox
ooxxooxxxo
oooxxoxxxo
xxxooooxoo
ooooxxoxox

Move #44

Attack(9, 3)

HIT

oxooxoxxoo
ooxxxxxxox
oxxxxxxxoo
ooxoooooox
oooooxxooo
oxoooxooox
ooxxooxxxo
oooxxoxxxo
xxxooooxoo
oooxxxoxox
oxooxoxxoo
ooxxxxxxox
oxxxxxxxoo
ooxoooooox
oooooxxooo
oxoooxooox
ooxxooxxxo
oooxxoxxxo
xxxooooxoo
oooxxxoxox

Move #45

Attack(9, 2)

SUNK

oxooxoxxoo
ooxxxxxxox
oxxxxxxxoo
ooxoooooox
oooooxxooo
oxoooxooox
ooxxooxxxo
oooxxoxxxo
xxxooooxoo
ooxxxxoxox
oxooxoxxoo
ooxxxxxxox
oxxxxxxxoo
ooxoooooox
oooooxxooo
oxoooxooox
ooxxooxxxo
oooxxoxxxo
xxxooooxoo
ooxxxxoxox

Move #46

Attack(8, 3)

HIT

oxooxoxxoo
ooxxxxxxox
oxxxxxxxoo
ooxoooooox
oooooxxooo
oxoooxooox
ooxxooxxxo
oooxxoxxxo
xxxxoooxoo
ooxxxxoxox
oxooxoxxoo
ooxxxxxxox
oxxxxxxxoo
ooxoooooox
oooooxxooo
oxoooxooox
ooxxooxxxo
oooxxoxxxo
xxxxoooxoo
ooxxxxoxox

Move #47

Attack(8, 4)

SUNK

oxooxoxxoo
ooxxxxxxox
oxxxxxxxoo
ooxoooooox
oooooxxooo
oxoooxooox
ooxxooxxxo
oooxxoxxxo
xxxxxooxoo
ooxxxxoxox
oxooxoxxoo
ooxxxxxxox
oxxxxxxxoo
ooxoooooox
oooooxxooo
oxoooxooox
ooxxooxxxo
oooxxoxxxo
xxxxxooxoo
ooxxxxoxox

Move #48

Random attack

Attack(4, 9)

MISS

oxooxoxxoo
ooxxxxxxox
oxxxxxxxoo
ooxoooooox
oooooxxoox
oxoooxooox
ooxxooxxxo
oooxxoxxxo
xxxxxooxoo
ooxxxxoxox
oxooxoxxoo
ooxxxxxxox
oxxxxxxxoo
ooxoooooox
oooooxxoox
oxoooxooox
ooxxooxxxo
oooxxoxxxo
xxxxxooxoo
ooxxxxoxox

Move #49

Random attack

Attack(3, 8)

MISS

oxooxoxxoo
ooxxxxxxox
oxxxxxxxoo
ooxoooooxx
oooooxxoox
oxoooxooox
ooxxooxxxo
oooxxoxxxo
xxxxxooxoo
ooxxxxoxox
oxooxoxxoo
ooxxxxxxox
oxxxxxxxoo
ooxoooooxx
oooooxxoox
oxoooxooox
ooxxooxxxo
oooxxoxxxo
xxxxxooxoo
ooxxxxoxox

Move #50

Random attack

Attack(9, 0)

MISS

oxooxoxxoo
ooxxxxxxox
oxxxxxxxoo
ooxoooooxx
oooooxxoox
oxoooxooox
ooxxooxxxo
oooxxoxxxo
xxxxxooxoo
xoxxxxoxox
oxooxoxxoo
ooxxxxxxox
oxxxxxxxoo
ooxoooooxx
oooooxxoox
oxoooxooox
ooxxooxxxo
oooxxoxxxo
xxxxxooxoo
xoxxxxoxox

Move #51

Random attack

Attack(4, 2)

MISS

oxooxoxxoo
ooxxxxxxox
oxxxxxxxoo
ooxoooooxx
ooxooxxoox
oxoooxooox
ooxxooxxxo
oooxxoxxxo
xxxxxooxoo
xoxxxxoxox
oxooxoxxoo
ooxxxxxxox
oxxxxxxxoo
ooxoooooxx
ooxooxxoox
oxoooxooox
ooxxooxxxo
oooxxoxxxo
xxxxxooxoo
xoxxxxoxox

Move #52

Random attack

Attack(7, 1)

MISS

oxooxoxxoo
ooxxxxxxox
oxxxxxxxoo
ooxoooooxx
ooxooxxoox
oxoooxooox
ooxxooxxxo
oxoxxoxxxo
xxxxxooxoo
xoxxxxoxox
oxooxoxxoo
ooxxxxxxox
oxxxxxxxoo
ooxoooooxx
ooxooxxoox
oxoooxooox
ooxxooxxxo
oxoxxoxxxo
xxxxxooxoo
xoxxxxoxox

Move #53

Random attack

Attack(5, 4)

MISS

oxooxoxxoo
ooxxxxxxox
oxxxxxxxoo
ooxoooooxx
ooxooxxoox
oxooxxooox
ooxxooxxxo
oxoxxoxxxo
xxxxxooxoo
xoxxxxoxox
oxooxoxxoo
ooxxxxxxox
oxxxxxxxoo
ooxoooooxx
ooxooxxoox
oxooxxooox
ooxxooxxxo
oxoxxoxxxo
xxxxxooxoo
xoxxxxoxox

Move #54

Random attack

Attack(7, 2)

MISS

oxooxoxxoo
ooxxxxxxox
oxxxxxxxoo
ooxoooooxx
ooxooxxoox
oxooxxooox
ooxxooxxxo
oxxxxoxxxo
xxxxxooxoo
xoxxxxoxox
oxooxoxxoo
ooxxxxxxox
oxxxxxxxoo
ooxoooooxx
ooxooxxoox
oxooxxooox
ooxxooxxxo
oxxxxoxxxo
xxxxxooxoo
xoxxxxoxox

Move #55

Random attack

Attack(1, 8)

MISS

oxooxoxxoo
ooxxxxxxxx
oxxxxxxxoo
ooxoooooxx
ooxooxxoox
oxooxxooox
ooxxooxxxo
oxxxxoxxxo
xxxxxooxoo
xoxxxxoxox
oxooxoxxoo
ooxxxxxxxx
oxxxxxxxoo
ooxoooooxx
ooxooxxoox
oxooxxooox
ooxxooxxxo
oxxxxoxxxo
xxxxxooxoo
xoxxxxoxox

Move #56

Random attack

Attack(0, 0)

MISS

xxooxoxxoo
ooxxxxxxxx
oxxxxxxxoo
ooxoooooxx
ooxooxxoox
oxooxxooox
ooxxooxxxo
oxxxxoxxxo
xxxxxooxoo
xoxxxxoxox
xxooxoxxoo
ooxxxxxxxx
oxxxxxxxoo
ooxoooooxx
ooxooxxoox
oxooxxooox
ooxxooxxxo
oxxxxoxxxo
xxxxxooxoo
xoxxxxoxox

Move #57

Random attack

Attack(0, 5)

MISS

xxooxxxxoo
ooxxxxxxxx
oxxxxxxxoo
ooxoooooxx
ooxooxxoox
oxooxxooox
ooxxooxxxo
oxxxxoxxxo
xxxxxooxoo
xoxxxxoxox
xxooxxxxoo
ooxxxxxxxx
oxxxxxxxoo
ooxoooooxx
ooxooxxoox
oxooxxooox
ooxxooxxxo
oxxxxoxxxo
xxxxxooxoo
xoxxxxoxox

Move #58

Random attack

Attack(2, 0)

MISS

xxooxxxxoo
ooxxxxxxxx
xxxxxxxxoo
ooxoooooxx
ooxooxxoox
oxooxxooox
ooxxooxxxo
oxxxxoxxxo
xxxxxooxoo
xoxxxxoxox
xxooxxxxoo
ooxxxxxxxx
xxxxxxxxoo
ooxoooooxx
ooxooxxoox
oxooxxooox
ooxxooxxxo
oxxxxoxxxo
xxxxxooxoo
xoxxxxoxox

Move #59

Random attack

Attack(3, 5)

MISS

xxooxxxxoo
ooxxxxxxxx
xxxxxxxxoo
ooxooxooxx
ooxooxxoox
oxooxxooox
ooxxooxxxo
oxxxxoxxxo
xxxxxooxoo
xoxxxxoxox
xxooxxxxoo
ooxxxxxxxx
xxxxxxxxoo
ooxooxooxx
ooxooxxoox
oxooxxooox
ooxxooxxxo
oxxxxoxxxo
xxxxxooxoo
xoxxxxoxox

Move #60

Random attack

Attack(3, 4)

MISS

xxooxxxxoo
ooxxxxxxxx
xxxxxxxxoo
ooxoxxooxx
ooxooxxoox
oxooxxooox
ooxxooxxxo
oxxxxoxxxo
xxxxxooxoo
xoxxxxoxox
xxooxxxxoo
ooxxxxxxxx
xxxxxxxxoo
ooxoxxooxx
ooxooxxoox
oxooxxooox
ooxxooxxxo
oxxxxoxxxo
xxxxxooxoo
xoxxxxoxox

Move #61

Random attack

Attack(3, 7)

MISS

xxooxxxxoo
ooxxxxxxxx
xxxxxxxxoo
ooxoxxoxxx
ooxooxxoox
oxooxxooox
ooxxooxxxo
oxxxxoxxxo
xxxxxooxoo
xoxxxxoxox
xxooxxxxoo
ooxxxxxxxx
xxxxxxxxoo
ooxoxxoxxx
ooxooxxoox
oxooxxooox
ooxxooxxxo
oxxxxoxxxo
xxxxxooxoo
xoxxxxoxox

Move #62

Random attack

Attack(0, 3)

MISS

xxoxxxxxoo
ooxxxxxxxx
xxxxxxxxoo
ooxoxxoxxx
ooxooxxoox
oxooxxooox
ooxxooxxxo
oxxxxoxxxo
xxxxxooxoo
xoxxxxoxox
xxoxxxxxoo
ooxxxxxxxx
xxxxxxxxoo
ooxoxxoxxx
ooxooxxoox
oxooxxooox
ooxxooxxxo
oxxxxoxxxo
xxxxxooxoo
xoxxxxoxox

Move #63

Random attack

Attack(7, 0)

MISS

xxoxxxxxoo
ooxxxxxxxx
xxxxxxxxoo
ooxoxxoxxx
ooxooxxoox
oxooxxooox
ooxxooxxxo
xxxxxoxxxo
xxxxxooxoo
xoxxxxoxox
xxoxxxxxoo
ooxxxxxxxx
xxxxxxxxoo
ooxoxxoxxx
ooxooxxoox
oxooxxooox
ooxxooxxxo
xxxxxoxxxo
xxxxxooxoo
xoxxxxoxox

Move #64

Random attack

Attack(3, 1)

MISS

xxoxxxxxoo
ooxxxxxxxx
xxxxxxxxoo
oxxoxxoxxx
ooxooxxoox
oxooxxooox
ooxxooxxxo
xxxxxoxxxo
xxxxxooxoo
xoxxxxoxox
xxoxxxxxoo
ooxxxxxxxx
xxxxxxxxoo
oxxoxxoxxx
ooxooxxoox
oxooxxooox
ooxxooxxxo
xxxxxoxxxo
xxxxxooxoo
xoxxxxoxox

Move #65

Random attack

Attack(5, 6)

MISS

xxoxxxxxoo
ooxxxxxxxx
xxxxxxxxoo
oxxoxxoxxx
ooxooxxoox
oxooxxxoox
ooxxooxxxo
xxxxxoxxxo
xxxxxooxoo
xoxxxxoxox
xxoxxxxxoo
ooxxxxxxxx
xxxxxxxxoo
oxxoxxoxxx
ooxooxxoox
oxooxxxoox
ooxxooxxxo
xxxxxoxxxo
xxxxxooxoo
xoxxxxoxox

Move #66

Random attack

Attack(8, 9)

MISS

xxoxxxxxoo
ooxxxxxxxx
xxxxxxxxoo
oxxoxxoxxx
ooxooxxoox
oxooxxxoox
ooxxooxxxo
xxxxxoxxxo
xxxxxooxox
xoxxxxoxox
xxoxxxxxoo
ooxxxxxxxx
xxxxxxxxoo
oxxoxxoxxx
ooxooxxoox
oxooxxxoox
ooxxooxxxo
xxxxxoxxxo
xxxxxooxox
xoxxxxoxox

Move #67

Random attack

Attack(4, 7)

MISS

xxoxxxxxoo
ooxxxxxxxx
xxxxxxxxoo
oxxoxxoxxx
ooxooxxxox
oxooxxxoox
ooxxooxxxo
xxxxxoxxxo
xxxxxooxox
xoxxxxoxox
xxoxxxxxoo
ooxxxxxxxx
xxxxxxxxoo
oxxoxxoxxx
ooxooxxxox
oxooxxxoox
ooxxooxxxo
xxxxxoxxxo
xxxxxooxox
xoxxxxoxox

Move #68

Random attack

Attack(2, 8)

MISS

xxoxxxxxoo
ooxxxxxxxx
xxxxxxxxxo
oxxoxxoxxx
ooxooxxxox
oxooxxxoox
ooxxooxxxo
xxxxxoxxxo
xxxxxooxox
xoxxxxoxox
xxoxxxxxoo
ooxxxxxxxx
xxxxxxxxxo
oxxoxxoxxx
ooxooxxxox
oxooxxxoox
ooxxooxxxo
xxxxxoxxxo
xxxxxooxox
xoxxxxoxox

Move #69

Random attack

Attack(7, 5)

MISS

xxoxxxxxoo
ooxxxxxxxx
xxxxxxxxxo
oxxoxxoxxx
ooxooxxxox
oxooxxxoox
ooxxooxxxo
xxxxxxxxxo
xxxxxooxox
xoxxxxoxox
xxoxxxxxoo
ooxxxxxxxx
xxxxxxxxxo
oxxoxxoxxx
ooxooxxxox
oxooxxxoox
ooxxooxxxo
xxxxxxxxxo
xxxxxooxox
xoxxxxoxox

Move #70

Random attack

Attack(6, 9)

MISS

xxoxxxxxoo
ooxxxxxxxx
xxxxxxxxxo
oxxoxxoxxx
ooxooxxxox
oxooxxxoox
ooxxooxxxx
xxxxxxxxxo
xxxxxooxox
xoxxxxoxox
xxoxxxxxoo
ooxxxxxxxx
xxxxxxxxxo
oxxoxxoxxx
ooxooxxxox
oxooxxxoox
ooxxooxxxx
xxxxxxxxxo
xxxxxooxox
xoxxxxoxox

Move #71

Random attack

Attack(5, 7)

MISS

xxoxxxxxoo
ooxxxxxxxx
xxxxxxxxxo
oxxoxxoxxx
ooxooxxxox
oxooxxxxox
ooxxooxxxx
xxxxxxxxxo
xxxxxooxox
xoxxxxoxox
xxoxxxxxoo
ooxxxxxxxx
xxxxxxxxxo
oxxoxxoxxx
ooxooxxxox
oxooxxxxox
ooxxooxxxx
xxxxxxxxxo
xxxxxooxox
xoxxxxoxox

Move #72

Random attack

Attack(4, 4)

MISS

xxoxxxxxoo
ooxxxxxxxx
xxxxxxxxxo
oxxoxxoxxx
ooxoxxxxox
oxooxxxxox
ooxxooxxxx
xxxxxxxxxo
xxxxxooxox
xoxxxxoxox
xxoxxxxxoo
ooxxxxxxxx
xxxxxxxxxo
oxxoxxoxxx
ooxoxxxxox
oxooxxxxox
ooxxooxxxx
xxxxxxxxxo
xxxxxooxox
xoxxxxoxox

Move #73

Random attack

Attack(4, 3)

MISS

xxoxxxxxoo
ooxxxxxxxx
xxxxxxxxxo
oxxoxxoxxx
ooxxxxxxox
oxooxxxxox
ooxxooxxxx
xxxxxxxxxo
xxxxxooxox
xoxxxxoxox
xxoxxxxxoo
ooxxxxxxxx
xxxxxxxxxo
oxxoxxoxxx
ooxxxxxxox
oxooxxxxox
ooxxooxxxx
xxxxxxxxxo
xxxxxooxox
xoxxxxoxox

Move #74

Random attack

Attack(9, 8)

MISS

xxoxxxxxoo
ooxxxxxxxx
xxxxxxxxxo
oxxoxxoxxx
ooxxxxxxox
oxooxxxxox
ooxxooxxxx
xxxxxxxxxo
xxxxxooxox
xoxxxxoxxx
xxoxxxxxoo
ooxxxxxxxx
xxxxxxxxxo
oxxoxxoxxx
ooxxxxxxox
oxooxxxxox
ooxxooxxxx
xxxxxxxxxo
xxxxxooxox
xoxxxxoxxx

Move #75

Random attack

Attack(5, 0)

MISS

xxoxxxxxoo
ooxxxxxxxx
xxxxxxxxxo
oxxoxxoxxx
ooxxxxxxox
xxooxxxxox
ooxxooxxxx
xxxxxxxxxo
xxxxxooxox
xoxxxxoxxx
xxoxxxxxoo
ooxxxxxxxx
xxxxxxxxxo
oxxoxxoxxx
ooxxxxxxox
xxooxxxxox
ooxxooxxxx
xxxxxxxxxo
xxxxxooxox
xoxxxxoxxx

Move #76

Random attack

Attack(0, 8)

MISS

xxoxxxxxxo
ooxxxxxxxx
xxxxxxxxxo
oxxoxxoxxx
ooxxxxxxox
xxooxxxxox
ooxxooxxxx
xxxxxxxxxo
xxxxxooxox
xoxxxxoxxx
xxoxxxxxxo
ooxxxxxxxx
xxxxxxxxxo
oxxoxxoxxx
ooxxxxxxox
xxooxxxxox
ooxxooxxxx
xxxxxxxxxo
xxxxxooxox
xoxxxxoxxx

Move #77

Random attack

Attack(9, 6)

MISS

xxoxxxxxxo
ooxxxxxxxx
xxxxxxxxxo
oxxoxxoxxx
ooxxxxxxox
xxooxxxxox
ooxxooxxxx
xxxxxxxxxo
xxxxxooxox
xoxxxxxxxx
xxoxxxxxxo
ooxxxxxxxx
xxxxxxxxxo
oxxoxxoxxx
ooxxxxxxox
xxooxxxxox
ooxxooxxxx
xxxxxxxxxo
xxxxxooxox
xoxxxxxxxx

Move #78

Random attack

Attack(5, 8)

MISS

xxoxxxxxxo
ooxxxxxxxx
xxxxxxxxxo
oxxoxxoxxx
ooxxxxxxox
xxooxxxxxx
ooxxooxxxx
xxxxxxxxxo
xxxxxooxox
xoxxxxxxxx
xxoxxxxxxo
ooxxxxxxxx
xxxxxxxxxo
oxxoxxoxxx
ooxxxxxxox
xxooxxxxxx
ooxxooxxxx
xxxxxxxxxo
xxxxxooxox
xoxxxxxxxx

Move #79

Random attack

Attack(0, 2)

MISS

xxxxxxxxxo
ooxxxxxxxx
xxxxxxxxxo
oxxoxxoxxx
ooxxxxxxox
xxooxxxxxx
ooxxooxxxx
xxxxxxxxxo
xxxxxooxox
xoxxxxxxxx
xxxxxxxxxo
ooxxxxxxxx
xxxxxxxxxo
oxxoxxoxxx
ooxxxxxxox
xxooxxxxxx
ooxxooxxxx
xxxxxxxxxo
xxxxxooxox
xoxxxxxxxx

Move #80

Random attack

Attack(8, 5)

MISS

xxxxxxxxxo
ooxxxxxxxx
xxxxxxxxxo
oxxoxxoxxx
ooxxxxxxox
xxooxxxxxx
ooxxooxxxx
xxxxxxxxxo
xxxxxxoxox
xoxxxxxxxx
xxxxxxxxxo
ooxxxxxxxx
xxxxxxxxxo
oxxoxxoxxx
ooxxxxxxox
xxooxxxxxx
ooxxooxxxx
xxxxxxxxxo
xxxxxxoxox
xoxxxxxxxx

Move #81

Random attack

Attack(4, 1)

WIN

xxxxxxxxxo
ooxxxxxxxx
xxxxxxxxxo
oxxoxxoxxx
oxxxxxxxox
xxooxxxxxx
ooxxooxxxx
xxxxxxxxxo
xxxxxxoxox
xoxxxxxxxx
xxxxxxxxxo
ooxxxxxxxx
xxxxxxxxxo
oxxoxxoxxx
oxxxxxxxox
xxooxxxxxx
ooxxooxxxx
xxxxxxxxxo
xxxxxxoxox
xoxxxxxxxx