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): # On définit la correspondance entre valeur (0-12) et nom noms = { 0: "As", 1: "2", 2: "3", 3: "4", 4: "5", 5: "6", 6: "7", 7: "8", 8: "9", 9: "10", 10: "Valet", 11: "Dame", 12: "Roi" } # On récupère le nom correspondant à la valeur nom_carte = noms.get(self.valeur, str(self.valeur)) return nom_carte + " de " + 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 = ["♠", "♦", "♥", "♣"] # 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 and self.f1.taille() < 2: return "égalité" elif self.f1.taille() < 2: return "{} gagne ({} n'a pas assez de carte)".format(self.nom2, self.nom1) elif 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) if __name__ == "__main__": 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