Domino is een legspel dat met speciale dominostenen gespeeld wordt. De stenen zijn tegenwoordig vaak van plastic of hout gemaakt, maar vroeger werden ze ook vervaardigd van echte steen of ivoor. Ze hebben een rechthoekige vorm en zijn verdeeld in 2 vierkante veldhelften, ieder gemerkt met nul tot zes ogen. In de standaardset komen alle 28 combinaties van stenen met 0 tot 6 ogen juist eenmaal voor.
De ontstaansgeschiedenis van het spel is onduidelijk. Mogelijk vindt het dominospel zijn oorsprong in China en zijn de stenen door Marco Polo daarvandaan meegenomen, maar dit valt niet met zekerheid vast te stellen.
Definieer een klasse Domino waarmee dominostenen kunnen voorgesteld worden in Python. We kiezen voor een ontwerp waarbij dominostenen onveranderlijke (immutable) objecten zijn. Daardoor mag geen enkele methode de interne toestand van een object aanpassen nadat het werd geïnitialiseerd. De objecten van deze klasse moeten minstens de volgende methoden hebben:
Een initialisatiemethode waaraan twee getallen moeten doorgegeven worden. We stellen een dominosteen voor als twee vierkante helften die naast elkaar staan, en de gegeven getallen stellen dan respectievelijk het aantal ogen op de linker- en de rechterhelft voor.
De initialisatiemethode moet een AssertionError opwerpen met de boodschap ongeldig aantal ogen, indien het aantal ogen op beide helften van de dominosteen niet telkens tussen 0 en 6 (grenzen inbegrepen) gelegen is.
Een methode __repr__ die een stringvoorstelling van de dominosteen teruggeeft. Deze stringvoorstelling leest als een Python-expressie die een nieuw object aanmaakt van de klasse Domino dat dezelfde toestand heeft als de dominosteen waarop de methode aangeroepen wordt.
Een methode __str__ die een stringvoorstelling van de
dominosteen teruggeeft. Deze stringvoorstelling maakt gebruik van
onderstaande sjablonen om elk van beide helften van de steen voor te
stellen op basis van hun aantal ogen.
+---+ +---+ +---+ +---+ +---+ +---+ +---+
| | | | |o | |o | |o o| |o o| |ooo|
| | | o | | | | o | | | | o | | |
| | | | | o| | o| |o o| |o o| |ooo|
+---+ +---+ +---+ +---+ +---+ +---+ +---+
0 1 2 3 4 5 6
Een methode draai die een nieuwe dominosteen (object van de klasse Domino) teruggeeft, waarvan het aantal ogen op de linker- en rechthelft omgewisseld werd ten opzichte van de dominosteen waarop de methode werd aangeroepen.
Een methode die toelaat om twee dominostenen bij elkaar op te tellen
aan de hand van de + operator. Twee dobbelstenen kunnen
enkel bij elkaar opgeteld worden als het aantal ogen aan de
rechterkant van de eerste steen gelijk is aan het aantal ogen aan de
linkerkant van de tweede steen. Indien dit niet het geval is, dan moet
de methode een AssertionError opwerpen met de boodschap
dominostenen passen niet.
>>> steen1 = Domino(3, 4)
>>> Domino(-1, 7)
Traceback (most recent call last):
AssertionError: ongeldig aantal ogen
>>> steen1
Domino(3, 4)
>>> print(steen1)
+---+---+
|o |o o|
| o | |
| o|o o|
+---+---+
>>> print(steen1.draai())
+---+---+
|o o|o |
| | o |
|o o| o|
+---+---+
>>> print(steen1)
+---+---+
|o |o o|
| o | |
| o|o o|
+---+---+
>>> steen2 = Domino(1, 3)
>>> steen1 + steen2
Traceback (most recent call last):
AssertionError: dominostenen passen niet
>>> print(steen2 + steen1)
+---+---+
| |o o|
| o | |
| |o o|
+---+---+
>>> steen3 = steen1.draai() + steen2.draai()
>>> steen3
Domino(4, 1)
>>> print(steen3)
+---+---+
|o o| |
| | o |
|o o| |
+---+---+