Dobbelen met twee dobbelstenen

Voor deze oefening krijg je een opgave in twee `rondes'. De eerste ronde bestaat uit een opgave die je zal herkennen uit Informatica I: ze werd geschreven voor Java. Je schrijft echter geen Java- maar Pythonklassen, en zorgt ervoor dat de functionaliteit van deze klassen overeenkomt met die van de Java-klassen. Uiteraard zijn er verschillen tussen Java en Python, die zullen wel in het oog springen. De tweede ronde bestaat uit een paar vraagjes over je Python-code. Ga na of je, bij het vertalen van de Java-opgave naar de Python-code, de juiste beslissingen nam.

Eerste ronde

  1. De klasse Worp
    De klasse Worp geeft de blauwdruk van een worp met twee dobbelstenen. Je implementeert de klasse als volgt:
    • Voeg twee instantievariabelen dobbelsteen1 en dobbelsteen2 toe, van het juiste type.
    • Voeg een default-constructor toe. Deze initialiseert de twee dobbelstenen op een willekeurig getal (1,2,...,6).
    • Schrijf de methode int getWaarde() die de som van beide dobbelstenen teruggeeft.
    • Schrijf in de klasse Worp de methode String toString() waarmee je een worp makkelijk zal kunnen uitschrijven. Als de dobbelstenen waarden 5 en 3 hebben, komt er "8 (5,3)".
  2. De klasse Persoon
    De klasse Persoon geeft de blauwdruk van een persoon. Je implementeert de klasse als volgt:
    • Voeg twee instantievariabelen naam en leeftijd toe.
    • Voeg een constructor toe zodat onderstaande initialisatie (in het hoofdprogramma) correct werkt. Onthoud alle informatie in de instantievariabelen.
            Persoon iemand = new Persoon("Jan",19);
      
    • Voeg ook een default-constructor toe (zonder parameters). Deze initialiseert het object met naam Geen naam en leeftijd 0. Gebruik this(...,...) om de vorige constructor aan te roepen.
    • Schrijf de methode getName die de naam van de persoon teruggeeft.
    • Overschrijf de methode toString zodat deze de naam en de leeftijd van de persoon teruggeeft in de vorm naam, leeftijd jaar (bijvoorbeeld: Nel, 8 jaar).
  3. De klasse Speler
    De klasse Speler is een subklasse van de klasse Persoon.
    Deze klasse stelt één speler (een persoon) voor die een spel speelt : dobbelen met twee dobbelstenen. Je implementeert de klasse als volgt:
    • Voeg een instantievariabele besteWorp toe van het type Worp. Deze zal de beste worp van de speler onthouden. (De beste worp is die met de hoogste waarde.)
    • Voeg een constructor toe met twee parameters, die dezelfde betekenis hebben als in de klasse Persoon. Daarna wordt een eerste worp (met twee dobbelstenen) uitgevoerd. Dit is dus de voorlopig beste worp van deze speler.
    • Schrijf de methode getScore die de beste score van deze speler teruggeeft (dit is de waarde van de beste worp).
    • Schrijf de methode werp die een nieuwe worp doet (met twee dobbelstenen). Indien deze worp beter is dan de vorige worp(en), dan wordt dit onthouden als beste worp - anders gebeurt er helemaal niets. De methode geeft niets terug.
    • Schrijf een tweede methode werp(aantal) die een extra parameter heeft. De parameter is een geheel getal dat bepaalt hoeveel keer er moet geworpen worden (met twee dobbelstenen). Ook hier wordt enkel de beste worp onthouden - gebruik de vorige methode.
    • Overschrijf de methode toString zodat de informatie van de superklasse wordt aangevuld met de waarden van de beste worp. Zo komt er bijvoorbeeld Nel, 8 jaar, beste worp: 7 (5,2).

Tweede ronde

  1. Heb je `instantievariabelen' (in Python:... ) expliciet gedefinieerd? Is niet nodig, zeker niet bij eenvoudige types!
  2. Je hebt voor de verschillende klassen allicht de __str__-methode geschreven. Heb je ook gedacht aan de __repr__-methode? Die is het belangrijkst! (Indien __str__ niet geïmplementeerd werd, zal __repr__ gebruikt worden; andersom niet.) Om exact dezelfde uitvoer te krijgen als gevraagd (en getest), kijk je even na:
    • de representatie van een Worp met dobbelstenen 6 en 1 moet van de vorm (6,1) zijn (de stringmethode gaf als resultaat 7 (6,1)).
    • als de stringmethode van een gegeven Persoon als resultaat Atif, 19 jaar geeft, dan zal de representatie gelijk zijn aan naam: Atif, leeftijd: 19.
    • de methode __str__ en __repr__ van de klasse Speler geven beide hetzelfde resultaat, te weten (voor bovenstaande persoon en worp gecombineerd): naam: Atif, leeftijd: 19, beste worp: 7 (6,1).
  3. In Python schrijf je slechts één constructor. Moet er een defaultconstructor zijn, dan stel je defaultwaarden in voor de parameters.
  4. In Python heb je evenmin overloading van andere methodes. Ook hier: een defaultwaarde instellen voor de parameter(s). En uiteraard NIET testen op die defaultwaarde als het niet nodig is. Meer concreet: onderstaande code is NIET GOED:
    if aantal == 1:                   // NIET GOED
        doe iets                      // NIET GOED
    else:                             // NIET GOED  
        for i in range(0, aantal):
            doe iets