You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
129 lines
5.0 KiB
129 lines
5.0 KiB
from File import File_chaine as File # importation de la classe File_chaine pour représenter les paquets
|
|
from random import shuffle # importation de shuffle pour mélanger le paquet
|
|
|
|
class Carte:
|
|
def __init__(self, valeur, couleur):
|
|
# initialise une carte avec une valeur et une couleur
|
|
self.valeur = valeur
|
|
self.couleur = couleur
|
|
|
|
def compare(self, autre):
|
|
# compare la carte actuelle avec une autre carte
|
|
# retourne 1 si self > autre, -1 si self < autre et 0 si elles sont égal
|
|
if self.valeur > autre.valeur:
|
|
return 1
|
|
elif self.valeur < autre.valeur:
|
|
return -1
|
|
else:
|
|
return 0
|
|
|
|
def __str__(self):
|
|
# retourne la carte
|
|
return str(self.valeur) + " " + self.couleur
|
|
|
|
|
|
class Jeu:
|
|
def __init__(self, nom1="joueur1", nom2="joueur 2"):
|
|
# initialise un jeu
|
|
self.paquet = [] # liste contenant toutes les cartes
|
|
self.f1 = None # file du joueur 1
|
|
self.f2 = None # file du joueur 2
|
|
self.nom1 = nom1 # nom du joueur 1
|
|
self.nom2 = nom2 # nom du joueur 2
|
|
|
|
def distribue(self, nb_total_cartes):
|
|
# distribue les cartes entre les deux joueurs
|
|
self.paquet = [] # réinitialisation du paquet
|
|
self.f1 = File() # initialisation de la file du joueur 1
|
|
self.f2 = File() # initialisation de la file du joueur 2
|
|
|
|
couleurs = ["pique", "carreau", "coeur", "trèfle"] # Couleurs des cartes
|
|
|
|
nombre = nb_total_cartes // 4 # Nombre de cartes par couleur
|
|
|
|
# création du paquet complet
|
|
for valeur in range(nombre):
|
|
for couleur in couleurs:
|
|
self.paquet.append(Carte(valeur, couleur))
|
|
|
|
shuffle(self.paquet) # mélange du paquet
|
|
|
|
# distribue la moitié def cartes pour f1
|
|
for i in range(nombre * 2):
|
|
self.f1.enfiler(self.paquet[i])
|
|
|
|
# et l'autre moitié pour f2
|
|
for i in range(nombre * 2, nombre * 4):
|
|
self.f2.enfiler(self.paquet[i])
|
|
|
|
return self.f1, self.f2 # Retourne les deux files
|
|
|
|
def partie(self):
|
|
# lance la partie de bataille jusqu'à ce qu'un joueur gagne
|
|
while not self.f1.est_vide() and not self.f2.est_vide():
|
|
c1 = self.f1.defiler() # carte du joueur 1
|
|
c2 = self.f2.defiler() # carte du joueur 2
|
|
print(c1, c2, "\n")
|
|
|
|
if c1.compare(c2) == 1:
|
|
# joueur 1 gagne le tour et remet les cartes dans sa file
|
|
self.f1.enfiler(c1)
|
|
self.f1.enfiler(c2)
|
|
|
|
elif c1.compare(c2) == -1:
|
|
# joueur 2 gagne le tour et remet les cartes dans sa file
|
|
self.f2.enfiler(c1)
|
|
self.f2.enfiler(c2)
|
|
|
|
else:
|
|
# en cas d'égalité
|
|
while True:
|
|
pot = [c1, c2] # pot temporaire contenant les cartes en jeu
|
|
|
|
# vérifie si un joueur a assez de cartes pour continuer la bataille
|
|
if self.f1.taille() < 2:
|
|
return "{} gagne ({} n'a pas assez de carte)".format(self.nom2, self.nom1)
|
|
if self.f2.taille() < 2:
|
|
return "{} gagne ({} n'a pas assez de carte)".format(self.nom1, self.nom2)
|
|
|
|
# chaque joueur place une carte face cachée dans le pot
|
|
pot.append(self.f1.defiler())
|
|
pot.append(self.f2.defiler())
|
|
|
|
# chaque joueur place ensuite une carte face visible
|
|
c1 = self.f1.defiler()
|
|
c2 = self.f2.defiler()
|
|
print(c1, c2)
|
|
|
|
pot.extend([c1, c2]) # Ajoute ces cartes au pot
|
|
|
|
# vérifie qui gagne cette bataille
|
|
if c1.compare(c2) == 1:
|
|
for c in pot:
|
|
self.f1.enfiler(c)
|
|
break
|
|
|
|
elif c1.compare(c2) == -1:
|
|
for c in pot:
|
|
self.f2.enfiler(c)
|
|
break
|
|
|
|
# affiche l'état actuel des deux files
|
|
print(self.f1, "\n\n", self.f2, "\n")
|
|
|
|
# détermine le gagnant final
|
|
if self.f1.est_vide():
|
|
return "{} gagne".format(self.nom2)
|
|
else:
|
|
return "{} gagne".format(self.nom1)
|
|
|
|
|
|
nom1 = input("Nom du joueur 1 : ") # demande le nom du joueur 1
|
|
nom2 = input("Nom du joueur 2 : ") # demande le nom du joueur 2
|
|
nb_total_cartes = int(input("Nombre total de cartes dans le paquet : ")) # Nombre total de cartes
|
|
|
|
jeu = Jeu(nom1, nom2) # création du jeu avec les noms des joueurs
|
|
f1, f2 = jeu.distribue(nb_total_cartes) # distribution des cartes
|
|
print(f"{nom1} :", f1) # affiche la file du joueur 1
|
|
print(f"{nom2} :", f2) # affiche la file du joueur 2
|
|
print(jeu.partie()) # lance la partie et affiche le résultat final
|
|
|