###### tags: `kata` # [Battleships kata](https://katalyst.codurance.com/battleships) _created by: [Mark Gray](https://github.com/markg-codurance)_ See also https://katalyst.codurance.com/battleships ## Introduction This version of the classic game has three ships: * **Carrier**: 4 cells - represented on a board with 'c' * **Destroyer**: 3 cells - represented on a board with 'd' * **Gun Ship**: 1 cell - represented on a board with 'g' Create a program that allows the user to specify commands for playing battleship. The commands available are: * `addPlayer`: Creates a player for the game. - the user should specify the location of their ships * `start`: Starts a new game with a fleet of ships placed at user's defined (x,y) coordinates. * `endTurn`: Ends the player's turn. * `print`: This command will print out the game board (Exhibit A): ``` | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0| | | | | | | | | | | 1| | | | | | | | | | | 2| | | | | | | | g | | | 3| | | d | d | d | | | | | | 4| | | | | | | g | | c | | 5| | | | | | | | | c | | 6| | | | | | | | | c | | 7| | g | | | | d | | | c | | 8| | | | | | d | | | | | 9| | | | | | d | | | | g | ``` * `fire`: Launches a torpedo at the given (x,y) coordinates. - If the (x,y) coordinate is sea then the position will be marked with 'o'. - If the (x,y) coordinate is a ship then the position will be marked with 'x'. - If a ship has all cells hit then a message should print notifying the player the ship has sunk.- when all ships have been sunk the game ends ## Rules * When all ships have been sunk the game ends * When the game is finished, the game should display a battle report with the number of shots fired by each player, including hit/miss ship sunk. * Ships sunk should show the lowest possible coordinate for the given ship, for example: - a horizontal destroyer on grid reference (2,3), (3,3) and (4,3), but when reporting the sinking of the ship, you only need to reference the first coordinate. - A horizontal destroyer on grid reference (2,3), (3,3) and (4,3), but when reporting the sinking of the ship, you only need to reference the first coordinate. - A vertical destroyer on ref (5,5), (5,6) and (5,7) but you'll only need to reference (5,5) when reporting. Using Exhibit A above, here is a battle report based on the ship positions: ``` [ Player1 Total shots: 23 Misses: 15 Hits: 8 Ships Sunk: [ Gunship: (1,7), Gunship: (9,9), Gunship: (7, 2), Destroyer (2,3) ] ``` ``` | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0| | | o | | | | | | | | 1| | o | | o | | | | | | | 2| | o | | | | | | X | | | 3| | | X | X | X | | | | | | 4| | o | | | | | g | | c | | 5| | o | o | | | o | | | c | | 6| | | | o | | | o | | c | | 7| | X | | | | d | | | x | | 8| | | o | o | | d | | | o | | 9| | | | | o | x | o | | | X | ``` Sunk ships have all their coordinates marked with an uppercase X and hit cells have a lower case x where they were not sunk. ### Restrictions * Complete using outside-in * Each player has maximum: * 1 Carrier * 2 Destroyers * 4 Gunships * Grid is 10 x 10 to keep it simple (but the design should be open for enhancements) ### Hardcore enhancement (optional) - Implement an AI player