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.
75 lines
4.3 KiB
75 lines
4.3 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.
|
||
|
|
||
6 years ago
|
This challenge requires that you develop the BGE and a very thin, text-based
|
||
6 years ago
|
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
|
||
6 years ago
|
for the text-based presentation layer.
|
||
6 years ago
|
|
||
6 years ago
|
BGE is responsible for maintaining game state.
|
||
|
|
||
6 years ago
|
## User Stories
|
||
|
|
||
|
### BGE
|
||
|
|
||
6 years ago
|
- [ ] 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
|
||
|
|
||
|
`startGame()` will randomly place these ships on the board in any direction and will return an array representing ship placement.
|
||
|
|
||
|
- [ ] Caller can invoke a `shoot()` function passing the target row and column 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.
|
||
|
|
||
|
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.
|
||
6 years ago
|
|
||
|
### Text-based Presentation Layer
|
||
|
|
||
6 years ago
|
- [ ] User can see the hits and misses array displayed as a 2 dimensional character representation of the game board returned by the `startGame()` function.
|
||
|
- [ ] User can be prompted 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.
|
||
6 years ago
|
|
||
|
## Bonus features
|
||
|
|
||
|
### BGE
|
||
|
|
||
6 years ago
|
- [ ] Caller can specify the number of rows and columns in the game board as a parameter to the `startGame()` function.
|
||
|
- [ ] 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.
|
||
6 years ago
|
|
||
6 years ago
|
`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 corresponding Bonus Features in the BGE)
|
||
|
- [ ] User can see the player number in prompts associated with the inputs in each turn.
|
||
6 years ago
|
- [ ] User can see both players boards at the end of each turn.
|
||
6 years ago
|
|
||
|
## Useful links and resources
|
||
|
|
||
6 years ago
|
- [Battleship Game (Wikipedia)](<https://en.wikipedia.org/wiki/Battleship_(game)>)
|
||
|
- [Battleship Game Rules (Hasbro)](https://www.hasbro.com/common/instruct/battleship.pdf)
|
||
6 years ago
|
|
||
|
## Example projects
|
||
|
|
||
6 years ago
|
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.
|
||
6 years ago
|
|
||
6 years ago
|
- [Battleship Game by Chris Brody](https://codepen.io/CodifyAcademy/pen/ByBEOz)
|