Le jeu de Dominos est un jeu très simple, ou, pour gagner, il faut être le premier joueur à avoir posé tous ses dominos.
Une fois le premier domino placé sur la table, le joueur suivant doit à son tour poser un domino ayant le même nombre de points sur au moins un côté du domino précédemment posé. Voir la règle du jeu ici
Un domino est constitué de côtés, droite/gauche ou haut/bas selon comment la pièce sera disposée.
un début de partie
La disposition importe peu: il faut que la chaine reste ouverte.
Exemple de disposition juste (à gauche) et fausse (à droite)
Dans cette simulation de jeu, on supposera:
que le joueur joue seul
et qu’il est possible d’insérer un Domino en l’intercalant entre 2 Dominos déjà posés, à condition qu’il s’agisse d’un Domino double. (1:1) par exemple peut être posé entre (5:1) et (1:6)
On utilise la définition de classes suivantes:
classDomino:def__init__(self,val1,val2):self.val1=val1self.val2=val2self.suiv=NoneclassPartie:def__init__(self,first):self.first=firstdeflast(self):"""parcours de la liste chainee jusqu'a la fin
return: str, valeurs du dernier domino sous la forme
val1:val2
"""M=self.firstwhilenotM.suivisNone:M=M.suivreturn'{}:{}'.format(M.val1,M.val2)defatteindre_domi(self,val2):"""docstring a ajouter
"""D=self.firstwhilenotD.suivisNoneandD.val2!=val2:D=D.suivifD.val2==val2:# domino trouvereturnDelse:# domino non trouve, retourne FalsereturnFalsedefinserer(self,D_a_inserer):"""insere le domino D_a_inserer a la premiere place possible
dans le jeu
param:
D_a_inserer est une instance de la classe Domino. Il s'agit d'un domino double: D_a_inserer.val1 == D_a_inserer.val2
exemple d'utilisation:
etat de la partir avant insertion
4:3=>3:2=>2:1
on insere le domino D4 de valeur 3:3 en trouvant sa place
dans la partie
>>> partie.inserer(D4)
etat de la partie apres insertion
4:3=>3:3=>3:2=>2:1
"""#à completerdef__repr__(self):M=self.firsts='{}:{} '.format(M.val1,M.val2)# à completerreturns
Qu a. On cherche à modéliser la partie de l’image de gauche (voir plus haut).
Les dominos seront instanciés à l’aide des noms D1, D2, D3, … Ecrire les instructions qui instancient tous les dominos de la partie, avec, pour chacun, leurs valeurs et le domino suivant.
Qu b. Ecrire l’instruction qui doit créer l’objet partie1 à partir de ce plateau de jeu. (classe Partie)
Qu c. Compléter la méthode de classe __repr__ qui surcharge la fonction print
Qu d. Commenter la méthode de classe atteindre_domi. A quoi sert-elle? Quelle est sa complexité asymtotique?
Qu e. Imaginons que l’état de la partie soit celui-ci:
Qu f. Insérer le domino 1:1 à sa place, dans la partie.
Qu g. Ajouter une méthode de classe poser qui pose un domino à la suite du dernier domino posé dans la partie, à condition que celui-ci soit bien en correspondance. La fonction va alors retourner l’état de la partie (si le nouveau domino peut être posé), ou bien un message signifiant que la pose est interdite. Tester votre methode de classe poser en choisissant un domino correct, puis un domino non correct.
Corrections
Jeu de dominos classique
classDomino:def__init__(self,val1,val2):self.val1=val1self.val2=val2self.suiv=NoneclassPartie:def__init__(self,first):self.first=firstdeflast(self):"""parcours de la liste chainee jusqu'a la fin
return: str, valeurs du dernier domino sous la forme
val1:val2
"""M=self.firstwhilenotM.suivisNone:M=M.suivreturn'{}:{}'.format(M.val1,M.val2)defatteindre_domi(self,val2):"""docstring a ajouter
"""D=self.firstwhilenotD.suivisNoneandD.val2!=val2:D=D.suivifD.val2==val2:# domino trouvereturnDelse:# domino non trouve, retourne FalsereturnFalsedefinserer(self,D_a_inserer):"""insere le domino D_a_inserer a la premiere place possible
dans le jeu
param:
D_a_inserer est une instance de la classe Domino. Il s'agit d'un domino double: D_a_inserer.val1 == D_a_inserer.val2
exemple d'utilisation:
etat de la partir avant insertion
4:3=>3:2=>2:1
on insere le domino D4 de valeur 3:3 en trouvant sa place
dans la partie
>>> partie.inserer(D4)
etat de la partie apres insertion
4:3=>3:3=>3:2=>2:1
"""ifself.atteindre_domi(D_a_inserer.val2):D=self.atteindre_domi(D_a_inserer.val2)D_a_inserer.suiv=D.suivD.suiv=D_a_insererreturnself.__repr__()else:return"insertion impossible"defposer(self,D_a_poser):D=self.firstwhilenotD.suivisNone:D=D.suivifD.val2==D_a_poser.val1:D.suiv=D_a_poserreturnself.__repr__()else:return"pose impossible"def__repr__(self):M=self.firsts='{}:{} '.format(M.val1,M.val2)whilenotM.suivisNone:M=M.suivs+='=> {}:{} '.format(M.val1,M.val2)returnsD1=Domino(4,4)D2=Domino(4,6)D3=Domino(6,1)D4=Domino(1,5)D5=Domino(5,4)D6=Domino(4,2)D7=Domino(2,1)D8=Domino(1,3)D9=Domino(1,1)# domino double pour insertionD10=Domino(3,6)# domino correct pour pose apres D8D11=Domino(5,3)# domino incorrect pour poseD1.suiv=D2D2.suiv=D3D3.suiv=D4D4.suiv=D5D5.suiv=D6D6.suiv=D7D7.suiv=D8partie1=Partie(D1)