Projet : Un jeu de cartes "8 Américain"

Numérique et sciences informatiques

donnees

Projet : Réaliser un jeu de bataille avec un jeu de 52 cartes

Les règles du jeu sont expliqués sur wikipedia : https://fr.wikipedia.org/wiki/8_am%C3%A9ricain
Le jeu de cartes à l’origine du Uno. Pour y jouer, celui qui commence peut recouvrir le talon soit par une carte de la même couleur, de la même valeur ou jouer une carte spéciale (valet, roi, joker, reine). Lorsqu’il ne peut pas jouer, il doit prendre une carte de la pioche. Si celle-ci est jouable, il peut la poser, sinon il passe son tour en gardant la carte piochée. Le but est très simple : se débarrasser de toutes ses cartes. Celui qui n’a plus qu’une seule carte doit dire “Carte” à voix haute. S’il ne le fait pas, l’autre lui fait remarquer, ce qui l’oblige à piocher deux cartes supplémentaires. Le joueur qui totalise le moins de points à la fin de la partie a gagné. Sachez qu’il existe de nombreuses variantes et règles différentes.
On utilisera un jeu de 52 cartes (pas de joker).

Cahier des charges :

  • Pour simuler le jeu, les structures de données utilisées sont des files et des piles.
  • Le jeu de chaque joueur peut être représenté par une file.
  • Le talon est une pile car on y ajoute des cartes.
  • La pioche est une pile, car on pioche toujours sur le sommet du paquet.

Le code du programme :

Entraînement 1 :

Créer une méthode pour la distribution aléatoire des cartes dans les files jeu1 et jeu2 à l'aide des classes suivantes.
VALEURS = ['','', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'Valet', 'Dame', 'Roi', 'As']
COULEURS = ['', 'pique', 'coeur', 'carreau', 'trefle']

class Carte:
    """Initialise couleur (de 1 à 4), et valeur (de 2 à 14)"""

    def __init__(self, couleur, valeur):
        self.couleur = couleur
        self.valeur = valeur

    def get_nom(self):
        """Renvoie le nom de la Carte As, 2, ... 10, Valet, Dame, Roi"""
        return VALEURS[self.valeur]

    def get_couleur(self):
        """Renvoie la couleur de la Carte (parmi pique, coeur, carreau, trefle)"""
        return COULEURS[self.couleur]

class PaquetDeCarte:
    """Initialise un paquet de cartes, avec un attribut contenu, de type list, vide"""

    def __init__(self):
        self.contenu = []

    def remplir(self):
        """Remplit le paquet de cartes : en parcourant les couleurs puis les valeurs"""
        self.contenu = [Carte(couleur, valeur) for couleur in range(1, 5) for valeur in range(2, 15)]

    def get_carte_at(self, pos):
        """Renvoie la Carte qui se trouve à la position donnée"""
        if 0 <= pos < 52:
            return self.contenu[pos]

Entraînement 2 :

Implémenter le code pour la bataille
Algorithme de la bataille

tant que le jeu 1 n’est pas vide ou le jeu 2 n’est pas vide faire
	Tirer une carte du paquet de J1 sur le tapis
	Tirer une carte du paquet de J2 sur le tapis
	Comparer les valeurs
	tant que les 2 cartes du dessus des piles du tapis sont  égales faire
			Tirer 2 fois une carte du paquet de J1 sur le tapis
			Tirer 2 fois une carte du paquet de J2 sur le tapis
	fin tant que
	Si tapis j1 > tapis j2
		tant que la pile du tapis j1 n’est pas vide faire
			Prendre la carte sur le dessus de la pile du tapis 1
			La glisser face cachée sous le paquet d e j1
		fin tant que
		tant que la pile du tapis j2 n’est pas vide faire
			Prendre la carte sur le dessus de la pile du tapis 2
			La glisser sous le paquet de J1
		fin tant que
	Sinon :
		tant que la pile du tapis j1 n’est pas vide faire
			Prendre la carte sur le dessus de la pile du tapis 1
			La glisser face cachée sous le paquet de j2
		fin tant que
		tant que la pile du tapis j2 n’est pas vide faire
			Prendre la carte sur le dessus de la pile du tapis 2
			La glisser sous le paquet de J2
		fin tant que
fin tant que
Le gagnant est celui qui a toutes les cartes dans son jeu

Amélioration

Amélioration 1 :

Utiliser tkinter (par exemple) pour créer une interface graphique.

    def image(self) :
        """
        méthode permettant l'affichage d'une carte"
        """
        fichier = "cartes/"+ str(self.valeur) + self.couleur+".GIF"
        fenetre = tk.Tk( )
        #fenetre.geometry ("935 x 692 ")
        image_carte = tk.PhotoImage( file = fichier )
        label = tk.Label ( fenetre , image = image_carte )
        label.pack ( )
        fenetre.mainloop ( )