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.

kaartdressuur
Beginopstelling van een spelletje kaartdressuur, waarbij de kaarten met de beeldzijde naar onder neergelegd worden in vijf rijen van drie speelkaarten.
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.

Opgave

Definieer een klasse Kaartdressuur waarmee spelletjes kaartdressuur kunnen gespeeld worden. De objecten van deze klasse moeten minstens de volgende methoden hebben:

Voorbeeld

>>> 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