Aller au contenu

Jeu de la bataille⚓︎

D'après 2022, Centres étrangers, J2, Ex. 4

Simon souhaite créer en Python le jeu de cartes « la bataille » pour deux joueurs. Les questions qui suivent demandent de reprogrammer quelques fonctions du jeu.

Règles du jeu de la bataille

Préparation

  • Distribuer toutes les cartes aux deux joueurs.
  • Les joueurs ne prennent pas connaissance de leurs cartes et les laissent en tas face cachée devant eux.

Déroulement

  • À chaque tour, chaque joueur dévoile la carte du haut de son tas.
  • Le joueur qui présente la carte ayant la plus haute valeur emporte les deux cartes qu'il place sous son tas.
  • Les valeurs des cartes sont : dans l'ordre de la plus forte à la plus faible : As, Roi, Dame, Valet, 10, 9, 8, 7, 6, 5, 4, 3 et 2 (la plus faible)

Si deux cartes sont de même valeur, il y a « bataille ».

  • Chaque joueur pose alors une carte face cachée, suivie d'une carte face visible sur la carte dévoilée précédemment.
  • On recommence l'opération s'il y a de nouveau une bataille sinon, le joueur ayant la valeur la plus forte emporte tout le tas.

Lorsque l'un des joueurs possède toutes les cartes du jeu, la partie s'arrête et ce dernier gagne.

Pour cela Simon crée une classe Python Carte. Chaque instance de la classe a deux attributs : un pour sa valeur et un pour sa couleur. Il donne au valet la valeur \(11\), à la dame la valeur \(12\), au roi la valeur \(13\) et à l'as la valeur \(14\). La couleur est une chaine de caractères : "trefle", "carreau", "coeur" ou "pique".

1. Simon a écrit la classe Python Carte suivante, ayant deux attributs valeur et couleur, et dont le constructeur prend deux arguments : val et coul.

1.a. Recopier et compléter les ... des lignes 3 et 4 ci-dessous.

🐍 Script Python
1
2
3
4
class Carte:
    def __init__(self, val, coul):
        ... .valeur = ...
        ... = coul
Réponse
🐍 Script Python
1
2
3
4
class Carte:
    def __init__(self, val, coul):
        self.valeur = val
        self.couleur = coul

1.b. Parmi les propositions ci-dessous quelle instruction permet de créer l'objet « 7 de cœur » sous le nom c7 ?

  • c7.__init__(self, 7, "coeur")
  • c7 = Carte(self, 7, "coeur")
  • c7 = Carte(7, "coeur")
  • from Carte import 7, "coeur"
Réponse

c7 = Carte(7, "coeur") crée une instance de la classe Carte de valeur \(7\) et de couleur "coeur", puis l'affecte à la variable c7.

2. On souhaite créer le jeu de cartes. Pour cela, on écrit une fonction initialiser :

  • sans paramètre
  • qui renvoie une liste de 52 objets de la classe Carte représentant les 52 cartes du jeu.

Voici une proposition de code. Recopier et compléter les lignes suivantes pour que la fonction réponde à la demande :

🐍 Script Python
def initialiser() :
    jeu = []
    for coul in ["coeur", "carreau", "trefle", "pique"]:
        for val in range(...):
            carte_cree = ...
            jeu.append(carte_cree)
    return jeu
Réponse
🐍 Script Python
def initialiser() :
    jeu = []
    for coul in ["coeur", "carreau", "trefle", "pique"]:
        for val in range(2, 15):
            carte_cree = Carte(val, coul)
            jeu.append(carte_cree)
    return jeu

3. On rappelle que dans une partie de bataille, les deux joueurs tirent chacun une carte du dessus de leur tas, et celui qui tire la carte la plus forte remporte les deux cartes et les place en dessous de son tas.

Parmi les structures linéaires de données suivantes : Tableau, File, Pile, quelle est celle qui modélise le mieux un tas de cartes dans ce jeu de la bataille ? Justifier votre choix.

Réponse

On a besoin d'une structure linéaire pour

  • extraire une carte à une seule extrémité ;
  • ajouter une carte à l'autre extrémité (elle sera donc loin d'être piochée).

FILO : First In Last Out ; premier entré, dernier sorti, pour la File.

C'est la File qui répond le mieux à la modélisation souhaitée.

4. Écrire une fonction comparer qui prend en paramètres deux objets de la classe Carte : carte_1, carte_2. Cette fonction renvoie :

  • \(0\) si la valeur des deux cartes est identique ;
  • \(1\) si la carte carte_1 a une valeur strictement plus forte que celle de carte_2 ;
  • \(-1\) si la carte carte_2 a une valeur strictement plus faible que celle de carte_1.
Réponse
🐍 Script Python
def comparer(carte_1, carte_2):
    if carte_1.valeur > carte_2.valeur:
        return 1
    elif carte_1.valeur < carte_2.valeur:
        return -1
    else:
        return 0