Problème programme python jeu de la bataille

Résolu
Sunny -  
 Utilisateur anonyme -
Bonjour,

Je suis bloqué sur un exercice de programmation en python. On doit créer un programme qui simule un jeu de bataille de cartes. J'ai déjà essayé de faire l'exercice, j'aimerais avoir des conseils.

Merci d'avance

Les règles :

Une manche consiste à retourner une par une les cartes de son jeu.
  • Celui dont la valeur de la carte est supérieure remporte les deux cartes.
  • Si les cartes sont de même valeur, elles sont écartées.
  • En fin de manche celui qui a le plus de cartes a gagné la manche.


Écrire un programme qui simule ce jeu de bataille.

Le code :

import random

def jeuCartes():
    jeu = []
    couleurs = ["Pique","Coeur","Carreau","Trefle"]
    valeurs = [(2, "Deux"), (3, "Trois"), (4, "Quatre"), (5, "Cinq"), (6, "Six"), (7, "Sept"), (8, "Huit"), (9, "Neuf"), (10, "Dix"), (11, "Valet"), (12, "Dame"), (13, "Roi"), (14, "As")]
    for c in couleurs:
        for v in valeurs:
            jeu.append((c,)+v)
    return jeu
​
jeu = jeuCartes
​
random.shuffle(jeu)
print(jeu)
joueur1 = []
joueur2 = []
​
for i in range(0, 52, 2):
    joueur1.append(jeu[i])
for i in range(1, 52, 2):
    joueur2.append(jeu[i])
​
pioche = 0
comptejoueur1 = 0
comptejoueur2 = 0
random.shuffle(joueur1)
random.shuffle(joueur2)
for i in renversed(range(1, len(0)):
    cartejoueur1 = joueur1[i]
    cartejoueur2 = joueur2[i]
    if cartejoueur1[1] > cartejoueur2[1]:
         comptejoueur1 += 2
    if cartejoueur1[1] < cartejoueur2[1]:
         comptejoueur2 += 2
    if cartejoueur1[1] == cartejoueur2[1]:
         pioche += 2
            
return len(comptejoueur1), len(comptejoueur2)
A voir également:

2 réponses

Utilisateur anonyme
 
Bonsoir

tout d'abord, merci à KX d'avoir ajouter les balises de code, pour Python c'est indispensable sinon on ne voit pas l'indentation. Voir ce lien pour tes prochains messages.

Le code que tu présentes ne dit pas qui a gagné, c'est pourtant la finalité de ton exercice.

D'ailleurs il se termine par un
return
, comme s'il s'agissait d'une fonction, or il n'y a pas de début de fonction.

Pour le code de la donne :

for i in range(0, 52, 2):
    joueur1.append(jeu[i])
for i in range(1, 52, 2):
    joueur2.append(jeu[i])


Une seule boucle suffit
for i in range(0,52,2):
    joueur1.append(jeu[i])
    joueur2.append(jeu[i + 1])


Une seule boucle => temps d'exécution réduit.


for i in renversed(range(1, len(0)):
    cartejoueur1 = joueur1[i]
    cartejoueur2 = joueur2[i]
    if cartejoueur1[1] > cartejoueur2[1]:
         comptejoueur1 += 2
    if cartejoueur1[1] < cartejoueur2[1]:
         comptejoueur2 += 2
    if cartejoueur1[1] == cartejoueur2[1]:
         pioche += 2

tu devrais mettre des print un peu partout pour analyser ce qui se passe. Notamment à
len(0)
.

0
mamiemando Messages postés 33766 Date d'inscription   Statut Modérateur Dernière intervention   7 878
 
Bonjour,

Il y a quelques petites erreurs
  • attention à l'indentation (j'ai corrigé ton message) ; de manière générale, essaye de suivre les conventions PEP8.
  • l12: il faut appeler la fonction, sinon jeu contient un pointeur vers la fonction, et non le résultat qu'elle retourne :
    jeu = jeuCartes()
  • renversed
    n'est pas défini ; voulais-tu utiliser
    reverse
    ? Plus simplement, tu passer à
    range
    mettre un pas négatif. D'un point de vue "mathématique", il n'y a pas vraiment d'intérêt à renverser l'ordre des pioches, ça ne change rien en termes de statistiques.


Quelques remarques supplémentaires :
  • Il n'y a pas vraiment d'utilité à stocker des couples pour les noms des cartes. Tu peux représenter chaque carte par un couple (si tu veux vraiment garder la notion de couleur), voire ne pas les "colorer" car ça n'a pas d'importance dans le jeu de la bataille (tu aurais donc 4 cartes de hauteur 1 à 13 inclues).
  • La règle de la "bataille" semble un peu modifiée, après c'est peut-être que les règles que je connais sont un peu familiales. Pour moi, quand il y a égalité, on met par dessus les carte ex-æquo une carte face cachée, puis on relance une bataille entre les deux cartes suivantes, et on répète cette procédure tant qu'il n'y a pas de vainqueur. Si un joueur est à court de carte, celui qui en a le plus gagne. Si les deux joueurs ont épuisés toutes leurs cartes et restent parfaitement ex-æquo, il y a égalité parfaite. J'imagine que la règle a été modifiée pour simplifier l'exercice.


Bonne chances
0
Utilisateur anonyme
 
Bonjour
J’avais pas fait gaffe pour le pointeur… bien vu.

Concernant les règles, je pense que le prof a simplifié pour l’exercice.
0