Informatique Terminale : Compléments de programmation
Code complet du sujet 2 :
from random import randint
def melange(liste):
n = len(liste) for k in range(3*n):
i, j = randint(0, n-1), randint(0, n-1) liste[i], liste[j] = liste[j], liste[i]
class Domino:
def __init__(self, n1, n2):
self.n1 = n1 self.n2 = n2
def somme(self):
return self.n1 + self.n2
def representation(self):
return str(self.n1) + ':' + str(self.n2)
class Joueur:
def __init__(self, numero, nom, jeu):
self.jeu = jeu self.numero = numero
def affiche_jeu(self):
ligne = 'J'+ str(self.numero) + " > | "
for x in self.jeu:
ligne += x.representation() + ' | ' return ligne
def plus_grand(self):
m = 0
for domino in self.jeu:
if domino.somme()>m:
m = domino.somme() d = domino
return d
def domino(self, chiffres):
for x in self.jeu:
if x.n1==int(chiffres[0]) and x.n2==int(chiffres[-1]):
return x
def joue(self):
ligne = self.affiche_jeu()
domino = self.domino(input(ligne)) while domino not in self.jeu:
domino = self.domino(input(ligne)) return domino
def score(self):
s = 0
for domino in self.jeu:
s += domino.somme() return s
class Partie:
def __init__(self, nbre_joueurs):
self.nbre_joueurs = nbre_joueurs jeu = self.distribution()
self.joueur = []
for i in range(nbre_joueurs):
self.joueur.append(Joueur(i, 'J'+str(i), jeu[i])) self.chaine = []
self.chaine1 = []
def distribution(self):
L = []
for i in range(7):
for j in range(i, 7):
L.append(Domino(i, j)) melange(L)
n = self.nbre_joueurs jeu = []
m = 28//n
for i in range(n):
jeu.append(L[m*i: m*(i+1)]) return jeu
def fin(self):
test = 0
for i in range(self.nbre_joueurs):
if not self.joueur[i].jeu: return 1
if not self.peutJouer(self.joueur[i]): test += 1 if test==self.nbre_joueurs: return 1
return 0
def test(self, domino):
if domino.n1==int(self.chaine[0][0]) : return 1 if domino.n2==int(self.chaine[0][0]) : return 1 if domino.n1==int(self.chaine[-1][-1]) : return 1 if domino.n2==int(self.chaine[-1][-1]) : return 1 return 0
def peutJouer(self, joueur):
for domino in joueur.jeu:
if self.test(domino): return 1 return 0
def ajoute(self, domino):
possibilite = []
if domino.n1==int(self.chaine[0][0]): possibilite.append(0) if domino.n2==int(self.chaine[0][0]): possibilite.append(1) if domino.n1==int(self.chaine[-1][-1]): possibilite.append(2) if domino.n2==int(self.chaine[-1][-1]): possibilite.append(3) if len(possibilite)==1 or self.chaine[0][0]==self.chaine[-1][-1]
or domino.n1==domino.n2:
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':
self.chaine.insert(0, str(domino.n2) + ':' + str(domino.n1)) if possibilite[0]==0 and place=='d':
self.chaine.append(str(domino.n2) + ':' + str(domino.n1)) if possibilite[0]==1 and place=='g':
self.chaine.insert(0,str(domino.n1) + ':' + str(domino.n2)) if possibilite[0]==1 and place=='d':
self.chaine.append(str(domino.n1) + ':' + str(domino.n2)) self.chaine1.append(domino.representation())
def score(self):
score = []
print('Score final')
for i in range(self.nbre_joueurs):
score.append(self.joueur[i].score())
print(' Joueur J'+ str(self.joueur[i].numero) + " : "+ str(score[i])) print("Trace de la partie :")
print(self.chaine) print(self.chaine1)
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)) self.chaine1.append(domino.representation())
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()
def main():
n = int(input('Nombre de joueurs :')) Partie(n).jouer()
if __name__=='__main__': main()