IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Programmation multimédia/Jeux Python Discussion :

Jeu de carte simple : la bataille


Sujet :

Programmation multimédia/Jeux Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2023
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2023
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Jeu de carte simple : la bataille
    Bonjour,

    Je débute en programmation python et j'essaye de faire un jeu simple de bataille (sans graphique, juste le script).

    J'ai une erreur dans mon script car il y a énormément de partie sans qu'un gagnant ne ressorte.

    Autre chose, lorsqu'il y a un execo, c'est forcement avec la carte 7, ce que je ne comprends pas.

    Pouvez vous m'aider ?

    J'ai mis pas mal de fonction print et de commentaires pour essayer de faciliter la lecture.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
     
    import random
     
    # fonction input a venir
    joueur1 = "Alphonse"
    joueur2 = "Julien"
     
    jeu_de_carte = []
     
    # def du nombre de carte
    def nombre_jeu_carte(y):
        z = 0
        while y*4 > z:
            for x in range(1, 14):
                jeu_de_carte.append(x)
            z +=1
     
    nombre_jeu_carte(1)
     
    # je mélange les cartes
    random.shuffle(jeu_de_carte)
     
    jeu_joueur1 = []
    jeu_joueur2 = []
     
    nombre_carte_joueur1 = []
    nombre_carte_joueur2 = []
    nombre_carte_dock = []
     
    #distribution du jeu
    while len(jeu_de_carte) != 0:
        x = random.choice(jeu_de_carte)
        jeu_joueur1.append(x)
        jeu_de_carte.remove(x)
        y = random.choice(jeu_de_carte)
        jeu_joueur2.append(y)
        jeu_de_carte.remove(y)
     
    del jeu_de_carte # je supprime la liste que est devenu vide
     
    # le dock correspond aux cartes du milieu que les joueurs vont comparer pour savoir qui gagne
    dock = []
     
    print(jeu_joueur1)
    print(jeu_joueur2)
     
    #compteur
    tour = 0
     
    #boucle pour jouer
    while len(jeu_joueur1) != 0 or len(jeu_joueur2) != 0:
        tour += 1
        nombre_carte_joueur1.append(len(jeu_joueur1))
        nombre_carte_joueur2.append(len(jeu_joueur2))
        nombre_carte_dock.append((len(dock)))
        print(f"nombre de carte mini de {joueur1} sont {min(nombre_carte_joueur1)}")
        print(f"nombre de carte mini de {joueur2} sont {min(nombre_carte_joueur2)}")
        print(f"nombre de carte max du dock sont {max(nombre_carte_dock)}")
        print(f"Tour n°{tour}")
        dock.append(jeu_joueur1[0])
        dock.append(jeu_joueur2[0])
        print(f"Les cartes du milieu sont {dock}")
        print(f"nombre de carte dans le jeu :  {len(jeu_joueur1) + len(jeu_joueur2) + len(dock)}")
        print(f"nombre de carte de {joueur1} = {len(jeu_joueur1)}")
        print(f"le jeu de {joueur1} est composé de ces cartes : \n {jeu_joueur1}")
        print(f"nombre de carte de {joueur2} = {len(jeu_joueur2)}")
        print(f"le jeu de {joueur2} est composé de ces cartes : \n {jeu_joueur2}")
        if jeu_joueur1[0] > jeu_joueur2[0]:
            print(f"{joueur1} remporte la manche car {jeu_joueur1[0]} est plus grand que {jeu_joueur2[0]}")
            jeu_joueur1 += dock # les cartes du milieu sont rajoutées au jeu du joueur 1
            dock = [] # il n'y a plus de cartes au milieu
        elif jeu_joueur1[0] < jeu_joueur2[0]:
            print(f"{joueur2} remporte la manche car {jeu_joueur2[0]} est plus grand que {jeu_joueur1[0]}")
            jeu_joueur2 += dock # les cartes du milieu sont rajoutées au jeu du joueur 2
            dock = []
        else:
            print(f"execo les cartes tirées sont {jeu_joueur1[0]} et {jeu_joueur2[0]}")
     
        del jeu_joueur1[0] # on supprime du jeu de carte la carte utilisée pour la partie
        del jeu_joueur2[0]
        print("_______________________________")
     
     
     
    if len(jeu_joueur1) == 0:
        print(f"{joueur1} a gagné la partie en {tour} tours")
        if len(jeu_joueur2) == 0:
            print(f"{joueur2} a gagné la partie en {tour} tours")

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 563
    Points : 2 003
    Points
    2 003
    Par défaut
    Bonjour,

    pb d'indentation lignes 87 et 88. Le joueur 2 ne peut jamais se retrouver sans cartes puisqu'il faut au préalable que le joueur 1 n'en ait plus une seule.

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2023
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2023
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Merci pour le modification du code.

    En revanche, en la faisant, j'arrive toujours a des partie qui ne se finissent jamais, je ne comprends pas !

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 237
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 237
    Points : 36 687
    Points
    36 687
    Par défaut
    Citation Envoyé par Sanito Voir le message
    En revanche, en la faisant, j'arrive toujours a des partie qui ne se finissent jamais, je ne comprends pas !
    Si la partie ne se termine pas, c'est que la condition de sortie (de la boucle) ne se réalise pas.
    Après, décortiquer le code pour vérifier qu'on joue bien à la bataille, c'est du boulot... et vous avez des tutos qui proposent des exercices corrigés.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 563
    Points : 2 003
    Points
    2 003
    Par défaut
    Pensez à rajouter une condition de sortie de la boucle while si jamais la partie s'éternise.

    Je n'ai jamais vu de jeunes joueurs se lancer dans une bataille et qu'on retrouve 60 ans plus tard assis, à l'état de squelettes, les cartes toujours en mains

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 237
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 237
    Points : 36 687
    Points
    36 687
    Par défaut
    Citation Envoyé par Arioch Voir le message
    Pensez à rajouter une condition de sortie de la boucle while si jamais la partie s'éternise.

    Je n'ai jamais vu de jeunes joueurs se lancer dans une bataille et qu'on retrouve 60 ans plus tard assis, à l'état de squelettes, les cartes toujours en mains
    La question est de savoir si ça ne se termine pas parce qu'on est dans un cas où le jeu ne se termine pas ou si ça ne se termine pas parce qu'il y a un "bug" dans le code. C'est là qu'il faut savoir comment jouer au jeu ou chercher sur Internet pour savoir ce qu'il se passe). D'après ChatGPT, ça se termine toujours après plus ou moins de temps... donc "bug"?

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 563
    Points : 2 003
    Points
    2 003
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    D'après ChatGPT, ça se termine toujours après plus ou moins de temps... donc "bug"?
    - W
    N'utilisant pas ChatGLoufé, je ne saurais dire.

    C'était surtout une remarque à destination du demandeur, non pour trouver une manière (même si abrupte) de finir une partie, mais plutôt pour couper la partie et pouvoir consulter le retour des différents print disséminés dans le code afin de suivre, étape par étape, la progression de la partie et des données.

    Hier, j'ai lancé le code et vu une déferlante de print dans la console. C'est ingérable pour débugger.

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 237
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 237
    Points : 36 687
    Points
    36 687
    Par défaut
    Citation Envoyé par Arioch Voir le message
    N'utilisant pas ChatGLoufé, je ne saurais dire.
    Oui mais c'est le seul qui veuille bien prendre le temps de me répondre (moi, j'ai autre chose à faire que chercher...).

    Citation Envoyé par Arioch Voir le message
    Hier, j'ai lancé le code et vu une déferlante de print dans la console. C'est ingérable pour débugger.
    Tout l'art de la programmation est d'arriver à trouver des stratégies et des méthodes pour construire des codes longs et compliqués. Il vaut mieux commencer par s'entraîner avec des codes de quelques lignes que de se retrouver avec une jungle où on ne sait plus où donner de la tête.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 073
    Points : 4 380
    Points
    4 380
    Par défaut
    bonjour
    Citation Envoyé par Arioch Voir le message
    print dans la console. C'est ingérable pour débugger.
    j''ai supprimé les print et ajouté un print en cas de ctrl+C

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    stats = [0,0,0]
    try:
        ...
        if ....:
            stats[0] += 1
        if ....:
            stats[1] += 1
        elsef ....:
            stats[2] += 1
    except KeyboardInterrupt as err:
        print(f"Joueur1: {stats[0]}\nJoueur2: {stats[1]}\nnull:         {stats[2]}")
        print("Joueur1", jeu_joueur1)
        print("Joueur2", jeu_joueur2)
        raise
    résultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Joueur1: 17378817
    Joueur2: 17378823
    null:      198392
    Joueur1 [11, 5, 10, 6, 8, 1, 12, 1, 9, 6, 8, 2, 8, 3, 13, 3, 9, 3, 8, 2]
    Joueur2 [3, 11, 4, 10, 7, 12, 1, 10, 5, 13, 1, 13, 7, 9, 6, 12, 4, 7, 6, 9, 2, 10, 5, 7, 2, 11, 4, 12, 4, 13, 5, 11]
    Au bout de quelques secondes*:
    Il est donc normal qu'il faille attendre "1 an"(avec les print) puisque le joueur 1 gagne 17 millions de fois comme le joueur 2
    17378823 - 17378817 = 6 !
    ps: @Sanito, sans les print() on va quand même au moins 1000 fois plus vite

    Soit un problème d'algo, soit il faut être patient, soit il est statistiquement normal de gagner une fois sur 2 et c'est normal?
    $moi= ( !== ) ? : ;

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 237
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 237
    Points : 36 687
    Points
    36 687
    Par défaut
    Citation Envoyé par papajoker Voir le message
    Soit un problème d'algo, soit il faut être patient, soit il est statistiquement normal de gagner une fois sur 2 et c'est normal?
    Le code botte en touche le côté "bataille" (entre 2 cartes de même valeur) où le gagnant récupère au moins 6 cartes d'un coup. Intuitivement, si ça bouge moins vite, ça se termine plus lentement.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  11. #11
    Membre averti
    Homme Profil pro
    Analyse système
    Inscrit en
    Novembre 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 227
    Points : 311
    Points
    311
    Par défaut
    Citation Envoyé par Sanito Voir le message
    Merci pour le modification du code.

    En revanche, en la faisant, j'arrive toujours a des partie qui ne se finissent jamais, je ne comprends pas !

    Ce n'est pas forcément anormale.
    D'abord, il manque un biais : Lors qu'il y a bataille, chaque joueurs doit mettre une de ces cartes face caché, et reposer une autre carte afin de déterminer qui remporte, ceci est le seul moyen de lever une situation de bloquage.

    Par exemple, imaginons que le joueur 1 est 3 AS soit 3 cartes de valeurs 13, sans ce phénomène de bataille, il sera impossible au joueur 2 de prendre un des AS au joueur 1 (mais le cas inverse deviendrait possible), ce qui fait que le joueur 1 ne pourra jamais perdre, car ces 3 AS ne peuvent être pris.
    La seule façon dans ce cas pour que la partie finisse (en quelque sorte que l'algorithme converge) et que le joueur 1 gagne le 4 ième AS, puis dans l'ordre les 4 carte les plus fortes etc.... Ce qui en terme de combinatoire et de statistique devient assez délirant ...

    Le programme marche bien est applique les règles hormis le problème de la bataille qui n'est pas traité ....

  12. #12
    Membre averti
    Homme Profil pro
    Analyse système
    Inscrit en
    Novembre 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 227
    Points : 311
    Points
    311
    Par défaut
    Citation Envoyé par Arioch Voir le message
    Pensez à rajouter une condition de sortie de la boucle while si jamais la partie s'éternise.

    Je n'ai jamais vu de jeunes joueurs se lancer dans une bataille et qu'on retrouve 60 ans plus tard assis, à l'état de squelettes, les cartes toujours en mains
    Entièrement d'accord, mais j'ai aussi le souvenir de n'a pas avoir souvent été au bout des parties à deux et on jouait avec 32 cartes seulement...

Discussions similaires

  1. Jeu de Carte simple
    Par edenyorke dans le forum Développement 2D, 3D et Jeux
    Réponses: 2
    Dernier message: 03/03/2008, 10h33
  2. [C++] Urgent Développeur pour Jeu de cartes simple
    Par koros21 dans le forum Projets
    Réponses: 6
    Dernier message: 10/09/2006, 14h19
  3. [structure de donnée] jeu de carte
    Par .:dev:. dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 20/05/2006, 16h44
  4. [VB] Recrutement pour un Jeu de cartes WHIST
    Par Vesta dans le forum Projets
    Réponses: 5
    Dernier message: 13/09/2005, 20h43
  5. IA avec un jeu de cartes
    Par Captain_JS dans le forum Intelligence artificielle
    Réponses: 3
    Dernier message: 07/02/2005, 11h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo