Skip to main content

Oefening State Pattern

Introductie

Heb je aan de les genoeg om aan de volgende oefening te beginnen? Zo niet, bekijk dan meer informatie over het State Pattern op de site van Refactoring Guru.

Dobbelspel SIDOQ

Bij het (fictieve) dobbelspel SIDOQ gooi je een aantal keer met één dobbelsteen. De score die je per worp behaalt, hangt af van de toestand waarin de dobbelsteen verkeert. De totaalscore van het spel is gelijk aan de som van de scores per worp. (Een nogal nutteloos spelletje dus 😊.) Je start met een dobbelsteen die in toestand enkel verkeert. De score van de worp is dan gelijk aan het aantal ogen van de bovenliggende zijde. Als het aantal ogen oneven is, dan blijft de toestand van de dobbelsteen gelijk. Als het aantal ogen even is, dan wijzigt de toestand van de dobbelsteen in dubbel. Werp je een dobbelsteen die zich in de toestand dubbel bevindt, dan is de score van de worp gelijk aan 2 keer het aantal ogen (dubbel) van de bovenliggende zijde. Vervolgens wijzigt de toestand van de dobbelsteen. Bij een oneven aantal ogen wordt de toestand weer enkel, bij een even aantal ogen komt de dobbelsteen in de toestand kwadraat. De score van een worp met een dobbelsteen met de status kwadraat is gelijk aan het kwadraat van het aantal ogen van de bovenliggende zijde. Na deze worp blijft de dobbelsteen in de toestand kwadraat als het aantal ogen even is. Bij een oneven aantal ogen gaat de dobbelsteen terug naar de toestand dubbel.

Hieronder zijn de mogelijke toestanden van de dobbelsteen en de bijbehorende toestandsovergangen schematisch weergegeven in een statemachine diagram.

Dobbelsteen states

Mermaid broncode voor "SIDOQ Dobbelspel"
stateDiagram
direction LR
[*] --> Enkel
Enkel --> Enkel : oneven
Enkel --> Dubbel : even
Dubbel --> Enkel : oneven
Dubbel --> Kwadraat : even
Kwadraat --> Dubbel : oneven
Kwadraat --> Kwadraat : even

Het verloop van het spel is bijvoorbeeld als volgt:

worptoestand dobbelsteenaantal ogenscore worp
1enkel55
2enkel44
3dubbel48
4kwadraat636
5kwadraat39
6dubbel24
7kwadraat11
8dubbel510
9enkel22
10dubbel36
totaalscore:85

Het geraamte van de code van de class Dobbelsteen ziet er als volgt uit:

public class Dobbelsteen {
private int aantalOgen;
private Random rand = new Random();

public int werp() {
aantalOgen = rand.nextInt(6)+1;
return;
}

}

De methode werp dient de score van de betreffende worp te retourneren (en dus niet het aantal ogen). Merk op dat deze score afhankelijk is van de toestand waarin de dobbelsteen verkeert.

Er is al een class diagram gemaakt voor de class Dobbelsteen en zijn states. Deze ziet er als volgt uit:

Dobbelsteen class diagram

  1. Maak de code van de methode werp() compleet, zodat de berekening van de score wordt gedelegeerd naar het huidige state-object. Implemementeer ook de methode volgende() van de class Dobbelsteen.
  2. Implementeer de toestanden Enkel, Dubbel en Kwadraat en de gedeelde interface DobbelsteenState.
  3. Maak een testprogramma waarmee je het verloop van het spel simuleert door 10 rondes te spelen en de totale score te berekenen.
  4. De toepassing van het State Pattern leunt sterk op één van de design principes. Beschrijf op welk principe het sterk leunt. Motiveer je antwoord en noem minimaal één voordeel van dit principe.