You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
105 lines
4.4 KiB
105 lines
4.4 KiB
6 years ago
|
# Battleship Game Engine
|
||
|
|
||
|
**Tier:** 3-Advanced
|
||
|
|
||
|
Battleship Game Engine (BGE) implements the classic turn-based board game as a
|
||
|
package that's separated from any presentation layer. This is a type of
|
||
|
architectural pattern that useful in many application since it allows
|
||
|
any number of apps to utilize the same service.
|
||
|
|
||
|
The BGE itself is invoked through a series of function calls rather than
|
||
|
through directly coupled end user actions. In this respect using the BGE is
|
||
|
is similar to using an API or a series of routes exposed by a web server.
|
||
|
|
||
|
This challenge requires that you develop the BGE and a very thin, text-based
|
||
|
presentation layer for testing that's separate from the engine itself. Due to
|
||
|
this the User Stories below are divided two sets - one for the BGE and one
|
||
|
for the text-based presentation layer.
|
||
|
|
||
6 years ago
|
BGE is responsible for maintaining game state.
|
||
|
|
||
6 years ago
|
## User Stories
|
||
|
|
||
|
### BGE
|
||
|
|
||
|
- [ ] Caller can invoke a `startGame()` function to begin a 1-player game. This
|
||
|
function will generate an 8x8 game board consisting of 3 ships having a width of
|
||
|
one square and a length of:
|
||
|
* Destroyer: 2 squares
|
||
|
* Cruiser: 3 squares
|
||
|
* Battleship: 4 squares
|
||
|
|
||
6 years ago
|
`startGame()` will randomly place these ships on the board in any direction
|
||
|
and will return an array representing ship placement.
|
||
6 years ago
|
- [ ] Caller can invoke a `shoot()` function passing the target row and column
|
||
6 years ago
|
coordinates of the targeted cell on the game board. `shoot()` will return
|
||
|
indicators representing if the shot resulted in a hit or miss, the number of
|
||
|
ships left (i.e. not yet sunk), the ship placement array, and an updated hits
|
||
|
and misses array.
|
||
6 years ago
|
|
||
|
Cells in the hits and misses array will contain a space if they have yet
|
||
|
to be targeted, `O` if they were targeted but no part of a ship was at that
|
||
|
location, or `X` if the cell was occupied by part of a ship.
|
||
|
|
||
|
### Text-based Presentation Layer
|
||
|
|
||
|
- [ ] User can see the hits and misses array displayed as a 2 dimensional
|
||
|
character represention of the game board returned by the `startGame()` function.
|
||
|
- [ ] User can be promted to enter the coordinates of a target square on the
|
||
|
game board.
|
||
|
- [ ] User can see an updated hits and misses array display after taking a
|
||
|
shot.
|
||
|
- [ ] User can see a message after each shot indicating whether the shot
|
||
|
resulted in a hit or miss.
|
||
|
- [ ] User can see an congratulations message after the shot that sinks the
|
||
|
last remaining ship.
|
||
|
- [ ] User can be prompted to play again at the end of each game. Declining
|
||
|
to play again stops the game.
|
||
|
|
||
|
## Bonus features
|
||
|
|
||
|
### BGE
|
||
|
|
||
|
- [ ] Caller can specify the number of rows and columns in the game board as
|
||
|
a parameter to the `startGame()` function.
|
||
6 years ago
|
- [ ] Caller can invoke a `gameStats()` function that returns a Javascript
|
||
|
object containing metrics for the current game. For example, number of turns
|
||
|
played, current number of hits and misses, etc.
|
||
|
- [ ] Caller can specify the number of players (1 or 2) when calling
|
||
|
`startGame()` which will generate one board for each player randomly populated
|
||
|
with ships.
|
||
|
|
||
|
`shoot()` will accept the player number the shot is being made for along with
|
||
|
the coordinates of the shot. The data it returns will be for that player.
|
||
6 years ago
|
|
||
|
### Text-based Presentation Layer
|
||
|
|
||
6 years ago
|
- [ ] User can see the current game statics at any point by entering the
|
||
|
phrase `stats` in place of target coordinates. (Note that this requires
|
||
|
the `gameStats()` function in the BGE)
|
||
|
- [ ] User can specify a two player game is to be played, with each player
|
||
|
alternating turns in the same terminal session (Note that this requires
|
||
|
cooresponding Bonus Features in the BGE)
|
||
|
- [ ] User can see the player number in prompts associated with the inputs in
|
||
|
each turn.
|
||
|
- [ ] User can see both players boards at the end of each turn.
|
||
6 years ago
|
|
||
|
## Project Board
|
||
|
|
||
|
You can track your progress by cloning this [TBD](url-goes-here)
|
||
|
|
||
|
## Useful links and resources
|
||
|
|
||
|
- [Battleship Game (Wikipedia)](https://en.wikipedia.org/wiki/Battleship_(game))
|
||
|
- [Battleship Game Rules (Hasbro)](https://www.hasbro.com/common/instruct/battleship.pdf)
|
||
|
|
||
|
## Example projects
|
||
|
|
||
|
This YouTube video shows how a text-based
|
||
|
[Battleship Game](https://www.youtube.com/watch?v=TKksu3JXTTM) is played.
|
||
|
|
||
|
The following example is provided as a demonstration of the Battleship game
|
||
|
if it is unfamiliar to you. Remember you are to implement a text based
|
||
|
presentation layer for testing.
|
||
|
[Battleship Game by Chris Brody](https://codepen.io/CodifyAcademy/pen/ByBEOz)
|