comp1110-ass2/README.md
2023-03-22 14:28:20 +11:00

494 lines
21 KiB
Markdown

# COMP1110 Assignment 2
## Academic Honesty and Integrity
Honesty and integrity are of utmost importance. These goals are *not* at odds
with being resourceful and working collaboratively. You *should* be
resourceful, you should collaborate within your team, and you should discuss
the assignment and other aspects of the course with others taking the class.
However, *you must never misrepresent the work of others as your own*. If you
have taken ideas from elsewhere or used code sourced from elsewhere, you must
say so with *utmost clarity*. At each stage of the assignment you will be asked
to submit a statement of originality, either as a group or as individuals. This
statement is the place for you to declare which ideas or code contained in your
submission were sourced from elsewhere.
Please read the ANU's [official position](http://academichonesty.anu.edu.au/)
on academic honesty. If you have any questions, please ask me.
Carefully review the statements of originality in the [admin](admin) folder
which you must complete at each stage. Edit the relevant statement and update
it as you complete each stage of the assignment, ensuring that when you
complete each stage, a truthful statement is committed and pushed to your repo.
## Purpose
In this assignment you will *work as a group* to master a number of major
themes of this course, including software design and implementation, group
work, using development tools such as Git and IntelliJ, and using JavaFX to
build a user interface. **Above all, this assignment will emphasize group
work**; while you will receive an individual mark for your work based on your
contributions to the assignment, **you can only succeed if all members
contribute to your group's success**.
## Assignment Deliverables
The assignment is worth 30% of your total assessment, and it will be
marked out of 30. So each mark in the assignment corresponds to a
mark in your final assessment for the course. Note that for some
stages of the assignment, you will get a _group_ mark, and for others
you will be _individually_ marked. The mark breakdown and the due
dates are described on the
[deliverables](https://cs.anu.edu.au/courses/comp1110/assessments/deliverables/)
page.
Your tutor will mark your work via GitLab, so it is essential that you
carefully follow instructions for setting up and maintaining your group
repository. You will be marked according to whatever is committed to your
repository at the time of the deadline. You will be assessed on how effectively
you use Git as a development tool.
## Problem Description
Your task is to implement in Java, using JavaFX, a board game called the
[Blue Lagoon](https://boardgamegeek.com/boardgame/244331/blue-lagoon).
The design of the game and all imagery shown in this README comes from
the game publishers, Blue Orange Games. You should either be creating
your own artwork or making use of other works with an appropriate license.
![Blue Lagoon Box](assets/images/blue_lagoon_box.png)
A copy of the [rulebook](assets/rules/rulebook.pdf) has been provided from the
[official site](https://blueorangegames.eu/en/games/blue-lagoon/).
You can also find several video tutorials explaining how to play the game
online, for example [this video](https://www.youtube.com/watch?v=0q1hWfH9S_8).
## Game Overview
In Blue Lagoon, you play as a seafaring tribe on a quest to settle and explore
a newly discovered archipelago. Enlisting the help of all the settlers in your
tribe to claim territory, and scavenging the resources you find, you will make
history as one of the first tribes on the archipelago. But be careful! Other
tribes have found the islands too, and it's a race to the top to see who can
end up the most renowned tribe of the archipelago.
Blue Lagoon is a board game for 2-4 players. Each player manages a group
of settlers who will be finding precious resources and claiming islands in
the newly discovered archipelago.
The game is played over two phases - the exploration phase followed by the
settlement phase. On a player's turn, they will be playing one of the tokens
from their hand on to the board in order to work towards claiming resources
and islands. At the end of each phase points are scored based on the islands
each player claims and the resources they collect. Highest score wins!
An overview of the game rules is given below. Use this, in addition to the
resources linked above. If anything is unclear, please consult
the [class forum](https://edstem.org/au/courses/10706/discussion/) for clarification.
## Game Rules
It is strongly encouraged to read the [rulebook](assets/rules/rulebook.pdf).
Though a brief overview of the rules will be provided here.
### Overview
#### Game
The game is played over two different phases - the exploration phase, and
then the settlement phase. The score is counted at the end of each phase, the
highest score wins!
#### Components
All players start with 5 villages. In a 2 player game each player has 30 settlers,
in a 3 player game 25 settlers and a 4 player game 20 settlers.
There are 24 resources (coconuts, bamboo, water and precious stones)
and 8 additional statuettes (important: these are counted separately
to resources). All resources and statuettes will be randomly distributed
amongst the stone circles on the board at the start of the game.
The standard game is played on the below game board. On the game board you can
see eight different islands (each with a score attached) and 32 stone circles
which will hold the resources and statuettes. You will also see that the board
can be divided up into land tiles and water tiles.
<img src="assets/images/blue_lagoon_board.png" alt="Blue Lagoon Game Board" width=50% height=50%>
### Exploration Phase
Each player sequentially takes turns playing a piece from their collection of
settler and village tokens.
The rules for playing a piece are as follows:
- A settler can be placed on any unoccupied water space
- A settler or a village can be placed on any unoccupied land space adjacent to one of their pieces.
If a piece is placed on a stone circle, the player instantly claims the resource in that space
into their hand.
### End of Exploration Phase
Once either of the end of phase conditions occur,
points are scored and the settlement phase begins.
#### End of Phase Conditions
The exploration phase ends when either:
- All resources (not including statuettes) have been collected
- No player has any remaining moves available
#### Scoring Exploration Phase
The rules for scoring are as below. Please refer to page 3 of
the rulebook for scoring examples.
**Total Islands**
Players with pieces on eight or more islands score 20 points.
Players with pieces on exactly seven islands score 10 points.
Otherwise, 0 points are scored.
**Links**
A (potentially) branching path of neighbouring settlers and villages
belonging to a player forms a chain. Players earn points from the chain
of their pieces which links the most islands. Players earn 5 points
per linked island in this chain.
**Majorities**
The player with the most pieces on an island scores
the points indicated on the board for that island.
In the case of a tie, the points are divided evenly
between the tied players, rounding down.
**Resources**
Players score points for the resources they claimed during the phase.
For each resource type (coconuts, bamboo, water and precious stones),
each player receives the following points:
- 4+ of a kind: 20 points
- 3 of a kind: 10 points
- 2 of a kind: 5 points
Additionally, if a player has collected all 4 different resources, they get 10 bonus points.
**Statuettes**
Players receive 4 points per claimed statuette.
### Settlement Phase
#### Setup
All settlers, resources and statuettes are removed from the board, as well
as villages placed on stone circles. All villages except for those remaining
on the board are discarded.
All resources and statuettes are then randomly distributed amongst the
stone circles again.
The player after the player who ended the exploration phase
has the first turn.
#### Play
Play continues, this time however players may only place settlers
next to pieces they already own. That is, one cannot play on an
unoccupied water space anymore unless it is adjacent to one of
their pieces.
### End of Game
The settlement phase ends using the exact same conditions as the
exploration phase.
Once the settlement phase ends, the score is again calculated
using the same scoring system.
Each player adds the scores between the 2 phases.
The most points wins! If there is a tie, the player
with the most resources and statuettes wins. Otherwise,
the tied players share the victory!
## Encoding for Testing
This section describes a string encoding for the game state and player moves.
It will be necessary to work with this encoding when writing the methods in
`BlueLagoon.java`. This encoding has been designed purely for the purpose of
providing a common representation that both our tests and your game can understand.
**Importantly** we strongly discourage using this string encoding for anything
other than interfacing with our tests. The backend of your game (that encodes
the game logic) should have its own internal representation of the game
state and moves using appropriate classes, enums, and so on. To implement the
static methods in `BlueLagoon.java`, you should should be converting from
this string encoding to your internal game representation, performing the
relevant method calls to perform the desired operation, and then converting
back to the string encoding to provide a result for the tests.
The **Game State** string is made up of multiple parts segmented into statements.
Each statement starts with a lowercase character to identify which statement it is,
followed by space-separated information that is outlined below. Multiple statements are
separated by a `;` character. *hint: investigate java string methods. split() will be
very useful...*
### Grammar Hints
The string statements are formally presented using "formal grammar"
notation (e.g., see [EBNF](https://en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_form)).
If you are not familiar with formal grammars, this section gives a brief overview.
You don't need to fully understand these grammars so long as you can make sense of the
examples provided.
The symbols we will use include:
* Double quotes `""` are used to indicate a string literal.
* E.g., `"A B"` is a string literal.
* The comma `,` is used to combine / concatenate strings.
* E.g., `"A", "B", "C"` is equivalent to `"ABC"`.
* The pipe symbol `|` provides alternatives.
* E.g., `"A" | "B" | "C"` means `"A"` or `"B"` or `"C"`.
* Braces `{` and `}` are used to indicate the enclosed can appear zero or
more times.
* E.g., `{"A"}` can be `""` or `"A"` or `"AA"` or ...
* Parentheses `(` and `)` allow items to be grouped.
* E.g., `("A", " ") | "B"` can be `"A "` or `"B"`.
### Coordinates
To start with we define the form that coordinates take on which will be used in
other game statements. A coordinate is formally represented by the following
grammar:
`coordinate = row, ",", col`
where `row` and `col` are both non-negative integers representing a given board
row and column pair.
Coordinates are 0-indexed from the top left. The top-left tile is at coordinate
`"0,0"` (row 0, col 0). One tile to the right of this is `"0,1"`. The left-most
tile of the second row is `"1,0"`. The bottom-right tile is at `"12,11"`
noting that the number of columns in each row varies.
### Game Arrangement Statement
Contains the static board information of this game - you will need this to set up
the board and players. This information will not change throughout the game.
`gameArrangementStatement = "a ", boardHeight, " ", numPlayers, ";"`
where `boardHeight` and `numPlayers` are both positive integers.
> e.g. "a 13 2;"
>
> ^ The standard map layout - 13 high, 2 players
### Current State Statement
Contains the dynamic info of this game - this will change over the course of the game.
`currentStateStatement = "c ", playerId, " ", phase, ";"`
`phase = "E" | "S"`
and where `playerId` is a non-negative integer that represents the ID of
the current player whose turn it is.
>e.g. "c 0 E;"
>
>^ The current player to move is player 0 in the Exploration phase
### Island Statement
The layout of one island on the board - the board will be made up of a
number of these. Ths bonus score for an island is provided (see the game
rules for scoring - majorities). This is followed by a number of coordinates
that make up the island. Tiles that make up an island will be land tiles.
Some of the land tiles are also stone circles (see next section).
Different islands will not overlap tiles.
The coordinates are ordered in numerically ascending order with row before
column.
`islandStatement = "i ", bonus, {" ", coordinate}, ";"`
where `bonus` is a non-negative integer.
>e.g. "i 6 0,0 0,1 0,2 0,3 1,0 1,1 1,2 1,3 1,4 2,0 2,1;"
>
>^ The first island (top left) of the standard map
>e.g. "i 6 0,5 0,6 0,7 1,6 1,7 1,8 2,6 2,7 2,8 3,7 3,8;"
>
>^ The second island (top middle) of the standard map
>e.g. "i 6 7,12 8,11 9,11 9,12 10,10 10,11 11,10 11,11 11,12 12,10 12,11; i 8 0,9 0,10 0,11 1,10 1,11 1,12 2,10 2,11 3,10 3,11 3,12 4,10 4,11 5,11 5,12; i 8 4,0 5,0 5,1 6,0 6,1 7,0 7,1 7,2 8,0 8,1 8,2 9,0 9,1 9,2;"
>
>^ A sequence of three island statements appearing in the standard game string
### Stones Statement
The coordinates of all stone circles on the board. Stone circles will only
appear on tiles belonging to an island. The tile a stone circle is located
at will still 'belong' to the island as outlined in the island statement
for the purpose of scoring.
There will always be exactly 32 stone circles.
Coordinates are sorted in numerically ascending order.
*hint: parse all island statements before the stones statement*
`stonesStatement = "s", {" ", coordinate}, ";"`
>e.g. "s 0,0 0,5 0,9 1,4 1,8 1,12 2,1 3,5 3,7 3,10 3,12 4,0 4,2 5,9 5,11 6,3 6,6 7,0 7,8 7,12 8,2 8,5 9,0 9,9 10,3 10,6 10,10 11,0 11,5 12,2 12,8 12,11;"
>
>^ The stone circles on the base map
### Unclaimed Resources and Statuettes Statement
All resources and statuettes remaining on the board (not in a player's
inventory). The statement gives the resource or statuettes type indicated
by a capital letter (Coconut, Bamboo, Water, Precious stone, Statuette)
followed by the coordinates where that resource or statuette can be found.
Coordinates are sorted in numerically ascending order.
*hint: you will want some more advanced string methods here. How would you
extract just the coordinates of Bamboo? You know they will be between a unique
'B' and a unique 'W'...*
`unclaimedResourcesAndStatuettesStatement = "r C", {" ", coordinate}, " B", {" ", coordinate}, " W", {" ", coordinate}, " P", {" ", coordinate}, " S", {" ", coordinate}, ";"`
>e.g. "r C 1,1 B 1,2 W P 1,4 S;"
>
>^ Coconut at 1,1, Bamboo at 1,2, Precious Stone at 1,4. No Water or Statuettes
### Player Statement
All player information. We give their ID and score, their
resource counts, and the locations of their settlers and villages.
The settler and village coordinates are sorted in numerically ascending order
`playerStatement = "p ", playerId, " ", score, " ", coconut, " ", bamboo, " ", water, " ", preciousStone, " ", statuette, " S", {" ", coordinate}, " T", {" ", coordinate}, ";"`
where `coconut`, `bamboo`, `water`, `preciousStone`, `statuette`
are non-negative integers representing the number of each resource or
statuettes the player has collected during this phase. `score` is the
total score of the player.
>e.g. "p 1 42 1 2 3 4 5 S 5,6 8,7 T 1,2;"
>
>^ player 1 with score: 42, coconuts: 1, bamboo: 2, water: 3, precious stone: 4, statuettes: 5, placed settlers at 5,6 and 8,7, placed villages at 1,2
### Game State
The combined game state is made up of the following in order:
- 1 Game Arrangement Statement
- 1 Current State Statement
- Many Island Statements (as many as there are Islands on the map) - sorted ascending numerically by the island bonus (ties broken by numerically ascending coordinates)
- 1 Stones Statement
- 1 Unclaimed Resources Statement
- Many Player Statements (as many as there are Players) - sorted ascending numerically by player number
Formally this is:
`gameState = gameArrangementStatement, " ", currentStateStatement, {" ", islandStatement}, " ", stonesStatement, " ", unclaimedResourcesAndStatuettesStatement, {" ", playerStatement}`
>e.g. "a 13 2; c 0 E; i 6 0,0 0,1 0,2 0,3 1,0 1,1 1,2 1,3 1,4 2,0 2,1; i 6 0,5 0,6 0,7 1,6 1,7 1,8 2,6 2,7 2,8 3,7 3,8; i 6 7,12 8,11 9,11 9,12 10,10 10,11 11,10 11,11 11,12 12,10 12,11; i 8 0,9 0,10 0,11 1,10 1,11 1,12 2,10 2,11 3,10 3,11 3,12 4,10 4,11 5,11 5,12; i 8 4,0 5,0 5,1 6,0 6,1 7,0 7,1 7,2 8,0 8,1 8,2 9,0 9,1 9,2; i 8 10,3 10,4 11,0 11,1 11,2 11,3 11,4 11,5 12,0 12,1 12,2 12,3 12,4 12,5; i 10 3,3 3,4 3,5 4,2 4,3 4,4 4,5 5,3 5,4 5,5 5,6 6,3 6,4 6,5 6,6 7,4 7,5 7,6 8,4 8,5; i 10 5,8 5,9 6,8 6,9 7,8 7,9 7,10 8,7 8,8 8,9 9,7 9,8 9,9 10,6 10,7 10,8 11,7 11,8 12,7 12,8; s 0,0 0,5 0,9 1,4 1,8 1,12 2,1 3,5 3,7 3,10 3,12 4,0 4,2 5,9 5,11 6,3 6,6 7,0 7,8 7,12 8,2 8,5 9,0 9,9 10,3 10,6 10,10 11,0 11,5 12,2 12,8 12,11; r C B W P S; p 0 0 0 0 0 0 0 S T; p 1 0 0 0 0 0 0 S T;"
>
>^ The initial board. Two players, player 0 to start.
### Move String
We need an encoding for moves to play the game. Once the game is
working you will be able to take a state string and create an instance
of the game using your classes, then apply each move to your running game,
and converting the resulting state back into a string that we can check against.
`move = pieceType, " ", coordinate`
`pieceType = "S" | "T"`
>e.g. "S 2,3"
>
>^ Move: a settler is being played at coordinate 2,3
## Your High Level Task
Create a fully working game, using JavaFX to implement a playable
graphical version of the game in a 1200x700 window.
Notice that aside from the window size, the details of exactly how the
game looks etc., are **intentionally** left up to you. You may choose to
closely follow the look of the original board game, or you may choose to
present the game in a totally different manner.
The only **firm** requirements on the GUI are that:
* Your game must run using Java 17 and JavaFX 17.
* Your implementation must respect the specification of the game rules
given here.
* Your game must be easy to play.
* Your game must run in a 1200x700 window.
* Your game must be executable on a standard lab machine from a jar file
automatically built from your project called `game.jar` (as outlined in
[D2E]).
In addition to the main GUI, the backend of your game (the part that
implements the game logic) should be linked to the static methods
declared in `BlueLagoon.java` so that we can test your implementation.
## Evaluation Criteria
[deliverables]: https://comp.anu.edu.au/courses/comp1110/assessments/deliverables/
It is essential that you refer to the **[deliverables]** page to check
that you understand each of the **deadlines**, what is required, and the
**mark breakdown**. This assignment has multiple deliverables, D2A to D2G.
A significant part of your assignment will be marked via tests run through
gitlab's continuous integration (CI) framework, so all submittable materials
will need to be committed and pushed to gitlab and in the *correct* locations,
as prescribed by the [deliverables] page.
*Some* marks in deliverables are attributed to the completion (and tests
passing if relevant) of specific **tasks**. There are 17 tasks (from #1 through
to #17) that are outlined in gitlab **issues** associated with your team's fork
of the assignment 2 project. Not all tasks have tests associated with them,
instead some will be manually marked.
**Importantly** not all activities you will have to perform to complete a
deliverable are covered by a task, instead refer to the [deliverables].
The deliverables that depend on tasks are summarised as:
* [D2A]: task #1
* [D2B]: task #2
* [D2C]: tasks #3 to #8
* [D2F]: tasks #9 to #17 (and tasks #3, #4, #6, #7, #8 to a small degree)
[D2A]: https://comp.anu.edu.au/courses/comp1110/assessments/deliverables/#D2A
[D2B]: https://comp.anu.edu.au/courses/comp1110/assessments/deliverables/#D2B
[D2C]: https://comp.anu.edu.au/courses/comp1110/assessments/deliverables/#D2C
[D2E]: https://comp.anu.edu.au/courses/comp1110/assessments/deliverables/#D2E
[D2F]: https://comp.anu.edu.au/courses/comp1110/assessments/deliverables/#D2F
The tasks (mostly) increase in difficulty the higher the task number. However,
note that the GUI-related tasks will generally require significantly more work
than other tasks related to backend game logic.
Some, but not all, tasks will depend on the completion of earlier tasks. For
example, a later task might build on or make use of game logic developed as
part of an earlier task. We don't make these dependencies explicit because
the relationships should become relatively apparent after a bit of design
work (and they will depend somewhat on your design).
Keep the relative difficulty and the potential dependencies between tasks
in mind when negotiating which team member will work on what tasks. Try to
structure things so that you can work relatively independently, or otherwise
agree on some clear internal deadlines when one member relies on the output
of another.