Add public methods to the GameBoard class to interact with GamePieces:
Public Sub RotatePiece(x As Integer, y As Integer,
clockwise As Boolean)
boardSquares(x, y).RotatePiece(clockwise)
End Sub
Public Function GetSourceRect(
x As Integer, y As Integer) As Rectangle
Return boardSquares(x, y).GetSourceRectangle()
End Function
Public Function GetSquare(x As Integer, y As Integer) As String
Return boardSquares(x, y).PieceType
End Function
Public Sub SetSquare(x As Integer, y As Integer, pieceType As String)
boardSquares(x, y).SetPiece(pieceType)
End Sub
Public Function HasConnector(x As Integer, y As Integer, direction As String) As Boolean
Return boardSquares(x, y).HasConnector(direction)
End Function
Public Sub RandomPiece(x As Integer, y As Integer)
boardSquares(x, y).SetPiece(GamePiece.PieceTypes(
rand.Next(0, GamePiece.MaxPlayablePieceIndex + 1)))
End Sub
What just happened?
RotatePiece(), GetSourceRect(), GetSquare(), SetSquare(), and HasConnector() methods simply locate the appropriate GamePiece within the boardSquares array and pass on the function request to the piece.
The RandomPiece() method uses the rand object to get a random value from the PieceTypes array and assigns it to a GamePiece. It is important to remember that with the Random.Next() method overload used here, the second parameter is non-inclusive. In order to generate a random number from 0 through 5, the second parameter needs to be 6.
Tip
Subs, functions, and methods
Method is the generic term for a callable code block inside a class. Both Subs and Functions are methods. The difference between the two is that a Function returns a value, while a Sub does not.
Filling in the gaps
Whenever the player completes a scoring chain, the pieces in that chain are removed from the board. Any pieces above them fall down into the vacated spots and new pieces are generated.