Kwatro is een spel dat gespeeld wordt met 64 unieke kaarten. De kaarten verschillen van elkaar in drie eigenschappen: vorm, kleur en getal. Deze eigenschappen kunnen de volgende waarden aannemen:
er zijn vier verschillende vormen: cirkel, driehoek, vierkant en kruis
er zijn vier verschillende kleuren: groen, oranje, blauw en rood
er zijn vier verschillende getallen: 1, 2, 3 en 4
Aan de hand van deze kaarten moeten de spelers lijnen vormen. Een lijn bestaat uit een opeenvolging van 2, 3 of 4 kaarten, waarbij de eigenschappen (vorm, kleur en getal) van alle kaarten in die lijn ofwel geheel verschillend of geheel gelijk zijn. Een lijn met vier kaarten wordt een kwatro genoemd.
Laat ons de regels voor het vormen van lijnen eens wat meer in detail bekijken. Twee willekeurige kaarten kunnen altijd een lijn vormen (ze delen namelijk geen, één of meer eigenschappen). De derde en de vierde kaart moeten voldoen aan de voorwaarden die door de eerste twee kaarten zijn bepaald. Voordat je de derde kaart aanlegt, bekijk je de drie kaarten die een lijn zullen vormen en stel je jezelf de volgende vragen:
is de kleur op alle kaarten gelijk óf op alle kaarten verschillend?
is de vorm op alle kaarten gelijk óf op alle kaarten verschillend?
is het getal op alle kaarten gelijk óf op alle kaarten verschillend?
Als het antwoord op één of meerdere van bovenstaande vragen "neen" is, dan mag je de kaart niet spelen. Stel jezelf dezelfde vragen voordat je een vierde kaart aanlegt om zo een kwatro te maken. Je mag een lijn creëren of verlengen door aan beide uiteinden van een lijn kaarten aan te leggen.
Hieronder staan alvast nog enkele voorbeelden van geldige lijnen van vier kaarten, die dus een kwatro vormen:
Definieer een klasse Kaart waarmee de kaarten die gebruikt worden bij het spelletje Kwatro kunnen voorgesteld worden. Bij het instantiëren van objecten van deze klasse moeten twee strings en één natuurlijk getal doorgegeven worden, die respectievelijk de vorm, de kleur en het getal van de kaart omschrijven. Deze omschrijvingen moeten overeenkomen met de mogelijke waarden van de drie eigenschappen zoals ze in de inleiding van deze opgave werden vastgelegd. Indien dat niet het geval is, dan moet een AssertionError opgeworpen worden met de boodschap ongeldige kaart.
Zorg ervoor dat objecten van de klasse Kaart onveranderlijk (immutable) zijn: na het aanmaken van een object mogen de eigenschappen niet meer gewijzigd kunnen worden. De eigenschappen kunnen evenwel nog opgevraagd worden aan de hand van de objecteigenschappen vorm, kleur en getal.
Objecten van de klasse Kaart moeten ook een methode toString
ondersteunen waaraan geen argumenten moeten doorgegeven worden. Deze
methode moet een stringvoorstelling van de eigenschappen van de kaart
teruggeven die bestaat uit twee hoofdletters en een cijfer: de eerste
letter van de vorm, de eerste letter van de kleur en het getal.
Definieer ook nog een klasse Lijn waarmee lijnen van kaarten uit het spelletje Kwatro kunnen voorgesteld worden. Bij het instantiëren van objecten van deze klasse moeten nul of meer kaarten (objecten van de klasse Kaart) doorgegeven worden. Indien de gegeven kaarten geen geldige lijn vormen volgens de spelregels van het spelletje Kwatro, dan moet een AssertionError opgeworpen worden met de boodschap ongeldige lijn. Voorts moet de klasse Lijn minimaal de volgende methoden ondersteunen:
Een methode toString waaraan geen argumenten moeten doorgegeven worden. De methode moet een stringvoorstelling van de lijn teruggeven, die bestaat uit de opeenvolgende stringvoorstellingen van de kaarten in de lijn, telkens van elkaar gescheiden door een spatie, een koppelteken (-) en nog een spatie.
Een methode aanleggen waaraan een kaart (een object van de klasse Kaart) moet doorgegeven worden. De methode heeft ook nog een tweede optionele parameter waaraan een Booleaanse waarde kan doorgegeven worden (standaardwaarde: false). De methode moet ervoor zorgen dat de gegeven kaart vooraan (indien tweede parameter de waarde true heeft) of achteraan (indien tweede parameter de waarde false heeft) aan de lijn wordt aangelegd. De methode moet een referentie teruggeven naar het object waarop de methode werd aangeroepen. Indien het aanleggen van de gegeven kaart niet mogelijk is volgens de spelregels van het spelletje Kwatro, dan moet een AssertionError opgeworpen worden met de boodschap ongeldige lijn en mag de lijn zelf niet gewijzigd worden.
>>> const kaart = new Kaart("driehoek", "groen", 2);
>>> kaart.vorm;
"driehoek"
>>> kaart.kleur;
"groen"
>>> kaart.getal;
2
>>> kaart.toString();
"DG2"
>>> new Kaart("ruit", "groen", 1);
AssertionError: ongeldige kaart
>>> new Kaart("driehoek", "zwart", 1);
AssertionError: ongeldige kaart
>>> new Kaart("driehoek", "groen", 42);
AssertionError: ongeldige kaart
>>> new Kaart("groen", "driehoek", 2);
AssertionError: ongeldige kaart
>>> const lijn = new Lijn(new Kaart('driehoek', 'groen', 2), new Kaart('vierkant', 'oranje', 3));
>>> lijn.toString();
"DG2 - VO3"
>>> lijn.aanleggen(new Kaart('cirkel', 'blauw', 1)).toString();
"DG2 - VO3 - CB1"
>>> lijn.kwatro().toString();
"KR4"
>>> lijn.aanleggen(new Kaart('vierkant', 'rood', 4));
AssertionError: ongeldige lijn
>>> lijn.toString();
"DG2 - VO3 - CB1"
>>> lijn.aanleggen(new Kaart('kruis', 'rood', 4), true).toString();
"KR4 - DG2 - VO3 - CB1"
>>> new Lijn(new Kaart('driehoek', 'groen', 2), new Kaart('vierkant', 'oranje', 3), new Kaart('cirkel', 'groen', 1));
AssertionError: ongeldige lijn
>>> new Lijn(new Kaart('driehoek', 'groen', 2), new Kaart('driehoek', 'groen', 2), new Kaart('driehoek', 'groen', 2));
AssertionError: ongeldige lijn