Un jeu de bataille spéciale en python [Résolu]

Signaler
Messages postés
14
Date d'inscription
dimanche 16 décembre 2018
Statut
Membre
Dernière intervention
31 octobre 2020
-
Messages postés
13415
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
3 décembre 2020
-
Bonjour,

Je dois faire une simulation d'un jeu de bataille en python.
Les règles sont un peu différente d'une partie normale:

- une carte noire est toujours plus forte qu'une rouge.
- si les deux cartes sont rouges, la plus forte est celle avec la plus petite valeur
- si les deux cartes sont noirs, la plus forte est celle avec la plus grande valeur.

Celui qui a la plus forte carte gagne les deux cartes mais ne les remet pas dans son paquet.
Si il y a égalité, les deux cartes sont écartées.
Et enfin la manche s'arrête quand les 2 joueurs sont arriver à la fin de leur paquet.

Voici le code que j'ai déjà fait:

from random import *
jeu = []
for c in ["pique", "coeur", "trèfle", "carreau"]:
for v in range (1,14):
carte = (v,c)
jeu.append(carte)

joueur1 = []
joueur2 = []

def distribution():
shuffle(jeu)
for i in range(0,52,2):
cartej1 = jeu[i]
joueur1.append(cartej1)
cartej2 = jeu[i+1]
joueur2.append(cartej2)
return joueur1, joueur2

gainj1 = []
gainj2 = []
cartes_ecartees = []

def partie():
for k in range(0, 26):
carte1 = joueur1[k]
carte2 = joueur2[k]
if carte1[1] == "pique" or "trèfle":
if carte2[1] == "coeur" or "carreau":
gainj1.append(carte1)
gainj1.append(carte2)
elif carte2[1] == "pique" or "trèfle":
if carte1[0] > carte2[0]:
gainj1.append(carte1)
gainj1.append(carte2)
elif carte1[0] < carte2[0]:
gainj2.append(carte1)
gainj2.append(carte2)
elif carte1[0] == carte2[0]:
cartes_ecartees.append(carte1)
cartes_ecartees.append(carte2)

elif carte1[1] == "coeur" or "carreau":
if carte2[1] == "pique" or "trèfle":
gainj2.append(carte1)
gainj2.append(carte2)
elif carte2[1] == "coeur" or "carreau":
if carte1[0] < carte2[0]:
gainj1.append(carte1)
gainj1.append(carte2)
elif carte1[0] > carte2[0]:
gainj2.append(carte1)
gainj2.append(carte2)
elif carte1[0] == carte2[0]:
cartes_ecartees.append(carte1)
cartes_ecartees.append(carte2)
return len(gainj1), len(gainj2)


Mon problème est que le joueur 1 gagne toujours toutes les cartes (gainj1 = 52 quand on exécute la fonction "partie()" ) et je ne comprends pas pourquoi.

En espérant que vous pourrez m'aider,
Merci d'avance.

3 réponses

Messages postés
13415
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
3 décembre 2020
750
bonjour,
pourquoi ne nous montres-tu pas le programme complet?
merci de bien spécifier le langage quand tu partages du code: https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
Messages postés
14
Date d'inscription
dimanche 16 décembre 2018
Statut
Membre
Dernière intervention
31 octobre 2020

Désolé mais je ne comprends pas, j'ai mis l'entièreté du programme que j'ai fais. Que manquerais t-il ?
Merci pour le conseil, je ne vois pas de manière de modifier la question, dois-je en recréer une ?
Messages postés
13415
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
3 décembre 2020
750 >
Messages postés
14
Date d'inscription
dimanche 16 décembre 2018
Statut
Membre
Dernière intervention
31 octobre 2020

il manque l'appel à la fonction partie(). chez moi, cet appel provoque une erreur.
pas utile de modifier la question, tu peux éventuellement montrer le code dans un commentaire.
Messages postés
14
Date d'inscription
dimanche 16 décembre 2018
Statut
Membre
Dernière intervention
31 octobre 2020
>
Messages postés
13415
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
3 décembre 2020

L'appel de la fonction partie() se fait dans la console pour moi... tout comme l'appel de la fonction distribution(). Savez vous quelle erreur elle provoque ?

d'accord merci, voici le code avec le bon language:

from random import *
jeu = []
for c in ["pique", "coeur", "trèfle", "carreau"]:
    for v in range (1,14):
        carte = (v,c)
        jeu.append(carte)

joueur1 = []
joueur2 = []

def distribution():
    shuffle(jeu)
    for i in range(0,52,2):
        cartej1 = jeu[i]
        joueur1.append(cartej1)
        cartej2 = jeu[i+1]
        joueur2.append(cartej2)
    return joueur1, joueur2

gainj1 = []
gainj2 = []
cartes_ecartees = []

def partie():
    for k in range(0, 26):
        carte1 = joueur1[k]
        carte2 = joueur2[k]
        if carte1[1] == "pique" or "trèfle":
            if carte2[1] == "coeur" or "carreau":
                gainj1.append(carte1)
                gainj1.append(carte2)
            elif carte2[1] == "pique" or "trèfle":
                if carte1[0] > carte2[0]:
                    gainj1.append(carte1)
                    gainj1.append(carte2)
                elif carte1[0] < carte2[0]:
                    gainj2.append(carte1)
                    gainj2.append(carte2)
                elif carte1[0] == carte2[0]:
                    cartes_ecartees.append(carte1)
                    cartes_ecartees.append(carte2)

        elif carte1[1] == "coeur" or "carreau":
            if carte2[1] == "pique" or "trèfle":
                gainj2.append(carte1)
                gainj2.append(carte2)
            elif carte2[1] == "coeur" or "carreau":
                if carte1[0] < carte2[0]:
                    gainj1.append(carte1)
                    gainj1.append(carte2)
                elif carte1[0] > carte2[0]:
                    gainj2.append(carte1)
                    gainj2.append(carte2)
                elif carte1[0] == carte2[0]:
                    cartes_ecartees.append(carte1)
                    cartes_ecartees.append(carte2)
    return len(gainj1), len(gainj2)
Messages postés
13415
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
3 décembre 2020
750 >
Messages postés
14
Date d'inscription
dimanche 16 décembre 2018
Statut
Membre
Dernière intervention
31 octobre 2020

montre alors comment tu fais ces appels: comment pourrions nous deviner ce que tu fais dans la console?
il est préférable de les inclure dans le code partagé.
Messages postés
14
Date d'inscription
dimanche 16 décembre 2018
Statut
Membre
Dernière intervention
31 octobre 2020
>
Messages postés
13415
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
3 décembre 2020

C'est vrai désolé, j'écris simplement le nom de la fonction dans la console pour qu'elle s'éxecute:

>>>distribution()

ou
>>>partie()
Messages postés
13415
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
3 décembre 2020
750
quand ton programme ne se comporte pas comme tu le souhaites, tu peux ajouter des print() pour comprendre ce qu'il fait et par où il passe.
Messages postés
14
Date d'inscription
dimanche 16 décembre 2018
Statut
Membre
Dernière intervention
31 octobre 2020

Oui j'ai déjà essayé de mettre des print() un peu partout pour voir mais je n'ai toujours pas trouvé. C'est pou ça que je pose la question ici.
Messages postés
13415
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
3 décembre 2020
750 >
Messages postés
14
Date d'inscription
dimanche 16 décembre 2018
Statut
Membre
Dernière intervention
31 octobre 2020

je ne vois pas ces print() dans le code que tu as partagé.
Messages postés
14
Date d'inscription
dimanche 16 décembre 2018
Statut
Membre
Dernière intervention
31 octobre 2020

Je viens finalement de trouver la solution de mon problème.
Il suffisait simplement de rajouter carte1[1] == ou carte2[1] après chaque "or"
voici le programme au complet. J'ai aussi rajouter une fonction permettant d'écrire le rapport de la partie dans un fichier texte.

from random import *
jeu = []
for c in ["pique", "coeur", "trèfle", "carreau"]:
    for v in range (1,14):
        carte = (v,c)
        jeu.append(carte)

joueur1 = []
joueur2 = []

def distribution():
    shuffle(jeu)
    for i in range(0,52,2):
        cartej1 = jeu[i]
        joueur1.append(cartej1)
        cartej2 = jeu[i+1]
        joueur2.append(cartej2)
    return joueur1, joueur2

gainj1 = []
gainj2 = []
cartes_ecartees = []

def partie():
    for k in range(0, 26):
        carte1 = joueur1[k]
        carte2 = joueur2[k]
        if carte1[1] == "pique" or carte1[1] == "trèfle":
            if carte2[1] == "coeur" or carte2[1] == "carreau":
                gainj1.append(carte1)
                gainj1.append(carte2)
            elif carte2[1] == "pique" or carte2[1] == "trèfle":
                if carte1[0] > carte2[0]:
                    gainj1.append(carte1)
                    gainj1.append(carte2)
                elif carte1[0] < carte2[0]:
                    gainj2.append(carte1)
                    gainj2.append(carte2)
                elif carte1[0] == carte2[0]:
                    cartes_ecartees.append(carte1)
                    cartes_ecartees.append(carte2)

        elif carte1[1] == "coeur" or carte1[1] == "carreau":
            if carte2[1] == "pique" or carte2[1] == "trèfle":
                gainj2.append(carte1)
                gainj2.append(carte2)
            elif carte2[1] == "coeur" or carte2[1] == "carreau":
                if carte1[0] < carte2[0]:
                    gainj1.append(carte1)
                    gainj1.append(carte2)
                elif carte1[0] > carte2[0]:
                    gainj2.append(carte1)
                    gainj2.append(carte2)
                elif carte1[0] == carte2[0]:
                    cartes_ecartees.append(carte1)
                    cartes_ecartees.append(carte2)
    return len(gainj1), len(gainj2)

def fichier_texte():

    filin = open("rapport_partie.txt", "w", encoding = "utf-8")

    print("Rapport de la partie de bataille:\n", file = filin)
    print("Nombre de cartes empochées par le joueur 1:", file = filin)
    print(len(gainj1), file = filin)
    print("\nCartes empochées par le joueur 1:", file = filin)
    print(gainj1, file = filin)
    print("\nNombre de cartes empochées par le joueur 2:", file = filin)
    print(len(gainj2), file = filin)
    print("\nCartes empochées par le joueur 2:", file = filin)
    print(gainj2, file = filin)
    print("\nNombre de cartes écartées:", file = filin)
    print(len(cartes_ecartees), file = filin)
    print("\nCartes écartées:", file = filin)
    print(cartes_ecartees, file = filin)

    if gainj1 > gainj2:
        print("\nLe joueur 1 a gagné", file = filin)
    elif gainj1 < gainj2:
        print("\nLe joueur 2 a gagné", file = filin)
    elif gainj1 == gainj2:
        print("\nIl y a égalité", file = filin)

    filin.close()
Messages postés
13415
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
3 décembre 2020
750
en effet, tu aurais pu rapidement t'en rendre compte avec un print placé après la ligne 28.
tu peux aussi écrire:
if carte1[1] in ( "pique" , "trèfle"):