Bij de start van een spelletje kaartdressuur worden $$m \times n$$ speelkaarten met hun beeldzijde naar beneden neergelegd in $$m$$ rijen van $$n$$ speelkaarten. Zoals aangegeven op onderstaande figuur worden de speelkaarten hierbij startend vanaf één genummerd van links naar rechts en van boven naar onder.
oplossingen |
---|
1,3,5,7,9,14 |
1,2,4,5,12,13 |
2,3,5,6,10,15 |
2,7,9,11,13,15 |
1,6,10,11,13,14 |
3,4,11,12,14,15 |
1,2,3,4,6,7,9,10,11,12 |
4,5,6,7,9,10,12,13,14,15 |
De bedoeling van het spel is om ervoor te zorgen dat alle kaarten met hun beeldzijde naar boven komen te liggen. Hierbij mogen kaarten alleen omgedraaid worden volgens de spelregel: als een kaart omgedraaid wordt, dan moeten ook al zijn buren omgedraaid worden. Buren zijn kaarten links, rechts, boven en onder — indien aanwezig — maar niet diagonaal. Na het omdraaien komt een kaart die met zijn rug naar boven lag, met zijn beeldzijde naar onder te liggen. Omgekeerd wordt een kaart die met zijn beeldzijde naar boven lag omgedraaid zodat zijn rug naar boven komt te liggen.
Definieer een klasse Kaartdressuur waarmee spelletjes kaartdressuur kunnen gespeeld worden. De objecten van deze klasse moeten minstens de volgende methoden hebben:
Een initialisatiemethode waaraan één of twee natuurlijke getallen moeten doorgegeven worden. Indien er twee getallen aan de methode doorgegeven worden, dan stellen deze respectievelijk het aantal rijen en kolommen voor waarin de kaarten neergelegd worden. Indien er slechts één getal aan de methode doorgegeven wordt, dan geeft die zowel het aantal rijen als het aantal kolommen aan waarin de kaarten worden neergelegd.
Methoden __str__ en __repr__ die beide dezelfde stringvoorstelling van het object teruggeven. Deze stringvoorstelling vormt een rechthoekig rooster dat de positie en huidige bovenzijde van de kaarten weergeeft. Kaarten die met hun rug naar boven liggen, worden aangegeven met een hekje (#). Kaarten die met hun beeldzijde naar boven liggen, worden aangegeven met een koppelteken (-).
Een methode draaiKaart waarmee een bepaalde kaart kan omgedraaid worden volgens de regels van het spelletje kaartdressuur. Het nummer van de kaart moet als argument aan de methode doorgegeven worden. Indien het spelletje kaartdressuur geen kaart heeft met het opgegeven nummer, dan moet een AssertionError opgeworpen worden met de boodschap ongeldig kaartnummer.
Een methode draaiKaarten waarmee een reeks kaarten na elkaar kunnen omgedraaid worden volgens de regels van het spelletje kaartdressuur. De nummers van de kaarten moeten als een lijst of tuple aan de methode doorgegeven worden. Uiteraard moet je bij de implementatie van deze methode gebruikmaken van de methode draaiKaart.
Een methode gewonnen waaraan geen argumenten kunnen doorgegeven worden. De methode moet een Booleaanse waarde teruggeven, die aangeeft of alle kaarten van het spelletje kaartdressuur met hun beeldzijde naar boven liggen.
>>> spel = Kaartdressuur(5, 3)
>>> print(spel)
###
###
###
###
###
>>> spel.draaiKaart(1)
>>> spel
--#
-##
###
###
###
>>> spel.gewonnen()
False
>>> spel.draaiKaart(3)
>>> spel
-#-
-#-
###
###
###
>>> spel.gewonnen()
False
>>> spel.draaiKaart(16)
Traceback (most recent call last):
AssertionError: ongeldig kaartnummer
>>> spel.draaiKaart(0)
Traceback (most recent call last):
AssertionError: ongeldig kaartnummer
>>> spel.draaiKaarten([5, 7, 9, 14])
>>> spel
---
---
---
---
---
>>> spel.gewonnen()
True
>>> spel = Kaartdressuur(5)
>>> spel.draaiKaarten([18, 13, 9, 11, 21, 24, 12, 7, 17, 5, 4, 6, 19, 23, 10])
>>> spel
-----
-----
-----
-----
-----
>>> spel.gewonnen()
True
>>> spel = Kaartdressuur(3, 6)
>>> spel.draaiKaarten((1, 5, 9, 8, 6, 10))
>>> spel
-#-###
##-##-
#---##
>>> spel.gewonnen()
False