Informatique Terminale : Compléments de programmation
Sujet 2 : Jeu de dominos
Le but du sujet est de réaliser une partie de dominos à plusieurs joueurs en Python.
1. Écrire le code de la classe
Dominodont les objets ont deux attributs
n1et
n2qui sont des entiers compris entre
0et
6avec une méthode
sommequi renvoie la somme de ces attributs et une méthode
representation
qui renvoie une chaîne de caractères du type
n1:n22. Écrire le code de la classe
Joueuravec les méthodes indiquées ci-dessous :
class Joueur:
def __init__(self, numero, jeu): # jeu est une liste d’instances de Domino # les attributs de l’objet ont le même nom que les paramètres
def affiche_jeu(self): # renvoie une chaîne de caractères avec les dominos du joueur # sous la forme J5 > | 1:2 | 3:4 | où 5 est le numéro du joueur
def plus_grand(self):
# renvoie la première instance de Domino de la liste jeu qui a la plus grande somme
def domino(self, chiffres): # chiffres est une chaîne de caractères de la forme n1:n2 # renvoie l’instance Domino(n1, n2) de la liste jeu si elle existe et None sinon
def joue(self): # renvoie le domino entré par un joueur dans un input
# dont le texte affiché est la chaîne renvoyée par la méthode affiche_jeu
# l’input est affiché tant que le domino entré par le joueur n’est pas dans son jeu def score(self): # renvoie le total de tous les points des dominos du joueur
3. Écrire un code Python d’une fonction
melangequi prend une liste
listeen paramètre et échange aléatoirement
3*néléments de la liste,
nétant la longueur de cette liste.
4. a) Écrire le code du constructeur de la classe
Partiequi prend la variable
nbre_joueursen
paramètre. Les attributs des instances de la classe
Partiesont :
nbre_joueurs[le paramètre],
joueur[une liste de
nbre_joueursinstances de la classe
Joueurdont l’attribut
jeuest un élément de la liste
jeu
renvoyée par la méthode
distributionde la classe
Partie(voir b) ; cette méthode ne prend pas d’autre paramètre que
self] et
chaine[une liste vide qui sera complétée au fur et à mesure de la partie par des chaînes de caractères de la forme
2:1ou
1:2].
b) Écrire le code de la méthode
distributiondécrite en a). Elle répartit les
28dominos
Domino(i, j)avec
0 <= i < j <= 6en en distribuant autant à chaque joueur aléatoirement.
c) Écrire le code de la méthode
test(pour la classe
Partie) qui prend en paramètre une instance
domino
de la classe
Dominoet renvoie
1si le domino correspondant peut être ajouté à la liste
chaineet renvoie
0sinon. Un domino peut-être ajouté à la liste
chainesi un des ses numéros est le premier ou le dernier de la chaîne de dominos correspondante.
d) Écrire le code de la méthode
peutJouerqui prend en paramètre une instance
joueurde la classe
Joueur
et renvoie
1si le joueur possède un domino qui peut être joué et
0sinon.
e) Écrire le code de la méthode
finqui renvoie
1si un joueur n’a plus de domino ou si aucun joueur
ne peut jouer et renvoie
0sinon.
5. Le code de la méthode
jouerest le suivant :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
def jouer(self):
n = self.nbre_joueurs ordre = list(range(n)) melange(ordre)
joueur = self.joueur[ordre[0]]
domino = joueur.plus_grand()
self.chaine.append(str(domino.n1) + ':' + str(domino.n2)) joueur.jeu.remove(domino)
print('Le joueur J' + str(joueur.numero) + ' a joué son plus grand domino ') i = 1
while not self.fin():
print('Dominos joués : ' + str(self.chaine)) joueur = self.joueur[ordre[i%n]]
if self.peutJouer(joueur):
domino = joueur.joue()
while not self.test(domino): domino = joueur.joue() joueur.jeu.remove(domino)
self.ajoute(domino) else:
print('Le joueur J' + str(joueur.numero) + ' ne peut pas jouer') i+= 1
self.score()
a) Le code principal du jeu est
if __name__=='__main__': main()Écrire le code de la fonction
mainpour qu’elle permette à l’utilisateur de rentrer le nombre de joueurs dans un input et qu’elle exécute la méthode
jouer.
b) Quelle ligne de code faudrait-il ajouter au début de la méthode
jouerpour afficher les jeux de tous les joueurs ?
c) Préciser l’utilité de la variable
ordredéfinie ligne
3. d) Expliquer la ligne
13.
e) Expliquer la ligne
16et notamment pourquoi la boucle n’est pas infinie.
f) Expliquer la ligne
17.
g) On donne le code de la méthode
ajouteci-dessous. Par quoi faut-il remplacer les variables booléennes
b1,
b2,
b3,
b4,
b5et
b6et les instructions
i1,
i2,
i3et
i4pour que le programme fonctionne ?
def ajoute(self, domino):
possibilite = []
if b1: possibilite.append(0) if b2: possibilite.append(1) if b3: possibilite.append(2) if b4: possibilite.append(3)
if len(possibilite)==1 or b5 or b6:
if possibilite[0] == 0:
self.chaine.insert(0, str(domino.n2) + ':' + str(domino.n1)) if possibilite[0] == 1:
self.chaine.insert(0, str(domino.n1) + ':' + str(domino.n2)) if possibilite[0] == 2:
self.chaine.append(str(domino.n1) + ':' + str(domino.n2)) if possibilite[0] == 3:
self.chaine.append(str(domino.n2) + ':' + str(domino.n1)) else:
place = input('Placer le domino à gauche (g) ou à droite (d) ? ') while place not in ['g', 'd']:
place = input('Placer le domino à gauche (g) ou à droite (d) ? ') if possibilite[0]==0 and place=='g': i1
if possibilite[0]==0 and place=='d': i2 if possibilite[0]==1 and place=='g': i3 if possibilite[0]==1 and place=='d': i4