The GameBoard class
Now that we have a way to represent pieces in memory, the next logical step is to create a way to represent an entire board of playing pieces.
The game board is a two-dimensional array of GamePiece objects, and we can build in some additional functionality to allow our code to interact with pieces on the game board by their X and Y coordinates.
The GameBoard class needs to:
Store a GamePiece object for each square on the game board
Provide methods for code using the GameBoard to update individual pieces by passing calls through to the underlying GamePiece instances
Randomly assign a piece type to a GamePiece
Set and clear the "Filled with water" flags on individual GamePieces
Determine which pipes should be filled with water based on their position and orientation and mark them as filled
Return lists of potentially scoring water chains to code using the GameBoard