Partage
  • Partager sur Facebook
  • Partager sur Twitter

Black Jack tkinter

    22 février 2020 à 17:55:32

    Bonjour, 

    Je suis les cours de NSI en première et nous avons un projet dans lequel nous devons programmer un jeu.

    J'aimerais bien savoir comment terminer mon BlackJack en tkinter, je suis bloqué depuis 2 semaines à cause d'un booléen et je n'ai rien trouvé sur internet 

    Merci d'avance pour vos réponses 

    import random
    from tkinter import*
    
    def tirage():  # Tire une carte aléatoire et la sort du jeu
        if len(jeu) == 0:
            print('Le jeu est vide')
        z = random.randint(0, len(jeu) - 1)
        carte = jeu[z]
        jeu.pop(z)
        return carte
    
    
    def banque(main): #défini ce que fait la banque durant le tour
        s = calcul_main(main)
        while s < 17:
            carte = tirage()
            print("La banque tire une carte")
            main.append(carte)
            print(main)
            s = calcul_main(main)
        return s
    
    
    def choix_joueur(joueur): #Demande à l'utilisateur si il veut une carte ou non 
        print("\n\nC'est à", joueur[0], "de jouer")
        continuer = True
        s = calcul_main(joueur[2])
        if s == 1:
            continuer = False
        while continuer == True and s < 21:
            reponse = input("Voulez-vous prendre une autre carte ? [o/n] ")
            reponse = reponse.strip().lower()
            if reponse.startswith('o'):
                carte = tirage()
                print("Voici votre carte:")
                print(carte)
                joueur[2].append(carte)
                s = calcul_main(joueur[2])
            elif reponse.startswith('n') or reponse == '':
                continuer = False
            else:
                print("Répondez par 'o' ou 'n'")
        return joueur
    
    
    def calcul_main(main):  # On calcule la valeur de la main
        somme = 0
        AS = []
        for item in main:
            if item[0] == '1':
                val = 11
                AS.append(1)
            if item[0] == '2':
                val = 2
            if item[0] == '3':
                val = 3
            if item[0] == '4':
                val = 4
            if item[0] == '5':
                val = 5
            if item[0] == '6':
                val = 6
            if item[0] == '7':
                val = 7
            if item[0] == '8':
                val = 8
            if item[0] == '9':
                val = 9
            if item[0] == '0':
                val = 10
            if item[0] == 'J':
                val = 10
            if item[0] == 'Q':
                val = 10
            if item[0] == 'K':
                val = 10
            somme = somme + val
        if somme == 21 and len(main) == 2:
            print("Black Jack!")
            return (1)
        if somme > 21:
            somme = somme - 10 * len(AS)
        if somme > 21:
            print("Vous avez dépassé 21, vous avez donc perdu.")
            return somme
        print("Votre main a une valeur de :", somme)
        return somme
    
    
    def tour_jeu(): #Montre le pactole de chaque joueur et lui demande combien veut-il miser
        table = []
        for i in range(joueurs):  # Création des mains
            main = []
            print(nom_joueur[i], "a un pactole de :", pactole_joueur[i])
            mise = -1
            while 0 > mise or mise > pactole_joueur[i]: #Empeche l'utilisateur de mettre une valeur en dessous de 0 et au dessus de son pactole
                mise = int(input("\nCombien voulez vous miser ? "))
            for ite in range(2):
                carte = tirage()
                main.append(carte)
            temp_joueur = [nom_joueur[i], pactole_joueur[i] - mise, main, mise]
            table.append(temp_joueur)
        print(table)
    
        main_banque = [tirage()]
        print("La carte visible de la banque est : ", main_banque)
        for i in range(joueurs):  # Jeu de la carte
            temp_joueur = choix_joueur(table[i])
            table[i] = temp_joueur
        print(table)
    
        # Tour de la banque
        carte = tirage()
        main_banque.append(carte)
        val_banque = banque(main_banque)
        print("La banque a une main de valeur :", val_banque)
    
        for i in range(joueurs):  # Qui a gagné ?
            val_joueur = calcul_main(table[i][2])
            if val_joueur > 21:
                print(table[i][0], "a dépassé 21 et a donc perdu")
            elif val_joueur == 1 and val_banque != 1:
                print(table[i][0], "a eu un Black Jack!")
                table[i][1] = table[i][1] + table[i][3] * 2.5
            elif val_joueur == 1 and val_banque == 1:
                print(table[i][0], "a eu un Black Jack en même temps que la banque")
                table[i][1] = table[i][1] + table[i][3]
            elif val_joueur != 1 and val_banque == 1:
                print(table[i][0], "a perdu face au Black Jack de la banque!")
            elif val_banque > 21:
                print(table[i][0], "a gagné car la banque a dépassé 21")
                table[i][1] = table[i][1] + table[i][3] * 2
            elif val_joueur > val_banque:
                print(table[i][0], "a gagné sur la banque")
                table[i][1] = table[i][1] + table[i][3] * 2
            elif val_joueur == val_banque:
                print(table[i][0], "a fait égalité avec la banque")
                table[i][1] = table[i][1] + table[i][3]
            elif val_joueur < val_banque:
                print(table[i][0], "a perdu face à la banque")
            else:
                print('Bizarre si ca arrive revoir la ligne 142 a peu près')
            pactole_joueur[i] = table[i][1]
        return table
    
    
    def melange(jeu_donne, nb):
        talon = []
        for _ in range(nb):
            talon += jeu_donne
        return talon
    
    
    def recup():
        global joueurs, num_q, pactole_depart
        if num_q==1 :
            joueurs=int(entree.get())
            texte_question.set("Quel est le pactole initial?")
            texte.set("")
            num_q=2
        elif num_q==2 :
            pactole_depart=int(entree.get())
            texte_question.set("Quel est le nom du joueur 1?")
            texte.set("")
            num_q=3
        elif num_q==3 :
            if len(nom_joueur<joueurs) :
                nom_joueur.append(entree.get())
                pactole_joueur.append(pactole_depart)
            else :
                pass
    
    
    
    # Construction de la fenêtre principale «root»
    root = Tk()
    root.title('Black Jack')
    
    photo = PhotoImage(file="Tapis.gif")
    Largeur = 1000
    Hauteur = 504
    Canevas = Canvas(root,width = Largeur, height =Hauteur)
    item = Canevas.create_image(0,0,anchor=NW, image=photo)
    print("Image de fond (item",item,")")
    Canevas.pack()
    texte=StringVar()
    texte_question=StringVar()
    texte_question.set("Combien de joueurs?")
    question=Label(root,textvariable=texte_question)
    question.pack(side=LEFT)
    entree=Entry(root, textvariable=texte)
    entree.pack(side=LEFT)
    ok=Button(root, text="OK", command=recup)
    ok.pack(side=LEFT)
    num_q=1
    joueurs=0
    pactole_depart=0
    nom_joueur = []
    pactole_joueur = []
    jeu_initial = ['1T', '2T', '3T', '4T', '5T', '6T', '7T', '8T', '9T', '0T', 'JT', 'QT', 'KT', '1C', '2C', '3C', '4C',
                   '5C', '6C', '7C', '8C', '9C', '0C', 'JC', 'QC', 'KC', '1P', '2P', '3P', '4P', '5P', '6P', '7P', '8P',
                   '9P', '0P', 'JP', 'QP', 'KP', '1D', '2D', '3D', '4D', '5D', '6D', '7D', '8D', '9D', '0D', 'JD', 'QD',
                   'KD']
    affichage={'1T':"1.gif", '1P':"2.gif", '1C':"3.gif", '1D':"4.gif", '2T':"5.gif", '2P':"6.gif", '2C':"7.gif", '2D':"8.gif", '3T':"9.gif", '3P':"10.gif", '3C':"11.gif", '3D':"12.gif", '4T':"13.gif", '4P':"14.gif", '4C':"15.gif", '4D':"16.gif", '5T':"17.gif", '5P':"18.gif", '5C':"19.gif", '5D':"20.gif", '6T':"21.gif", '6P':"22.gif", '6C':"23.gif", '6D':"24.gif", '7T':"25.gif", '7P':"26.gif", '7C':"27.gif", '7D':"28.gif", '8T':"29.gif", '8P':"30.gif", '8C':"31.gif", '8D':"32.gif", '9T':"33.gif", '9P':"34.gif", '9C':"35.gif", '9D':"36.gif", '0T':"37.gif", '0P':"38.gif", '0C':"39.gif", '0D':"40.gif", 'JT':"41.gif", 'JP':"42.gif", 'JC':"43.gif", 'JD':"44.gif", 'QT':"45.gif", 'QP':"46.gif", 'QC':"47.gif", 'QD':"48.gif", 'KT':"49.gif", 'KP':"50.gif", 'KC':"51.gif", 'KD':"52.gif"}
    nombre_jeux = 2
    # Lancement de la «boucle principale»
    root.mainloop()
    
    
    
    
    #print("Combien de joueurs pour cette partie ?")  # Création des joueurs
    #joueurs = int(input())
    
    # print("Quelle est le pactole inital ?")
    # pactole_depart = int(input())
    
    # for ite in range(joueurs):
    #     print("\nNom du joueur numéro ", ite + 1)
    #     temp_name = input()
    #     nom_joueur.append(temp_name)
    #     pactole_joueur.append(pactole_depart)
    
    continuer = True
    while continuer:
        jeu = melange(jeu_initial, nombre_jeux)
        print(jeu)
        table = tour_jeu()
        joueurs_elimines = []
        for i in range(joueurs):
            if table[i][1] == 0:
                print(table[i][0], "est éliminé de cette partie.")
                joueurs_elimines.append(i)  # on liste tous les joueurs éliminés
        joueurs_elimines.reverse()  # on inverse la liste pour commencer a supprimer par la fin (pb d'indices)
        if len(joueurs_elimines) == joueurs:  # Vérification de fin de la partie
            continuer = False
            print('La banque a gagné ! Fin de la partie')
        else:
            for item in joueurs_elimines:  # Suppression des joueurs éliminés
                joueurs -= 1  # réduction du nombre de joueurs
                table.pop(item)  # suppression de la liste joueur dans la table
                nom_joueur.pop(item)  # suppresion du nom du joueur (pour ne pas recréer dans tour_jeu())
                pactole_joueur.pop(item)  # suppresion du pactole du joueur (pour ne pas recréer dans tour_jeu())
            reponse = input("Voulez-vous continuer de jouer ? [o/n] ")
            reponse = reponse.strip().lower()
            if reponse.startswith('o'):
                print("\n\n\tNouvelle mise !")
            elif reponse.startswith('n') or reponse == '':
                continuer = False
            else:
                print("Répondez par 'o' ou 'n'")
    
        
    
    • Partager sur Facebook
    • Partager sur Twitter
      22 février 2020 à 18:00:11

      Tu es bloqué par quoi, un message d'erreur ?

      Décris nous le problème, sinon on sait pas quoi chercher, ni où chercher le problème.

      • Partager sur Facebook
      • Partager sur Twitter

      Blond, bouclé, toujours le sourire aux lèvres...

        22 février 2020 à 18:36:01

        AntoineThomas30 a écrit:

        J'aimerais bien savoir comment terminer mon BlackJack en tkinter, je suis bloqué depuis 2 semaines à cause d'un booléen et je n'ai rien trouvé sur internet 

        Quel booléen ? Quelle erreur ? J'ai essayé ton jeu (au passage, tu n'as pas donné de lien vers les images, donc on peut pas vraiment l'essayer) et j'ai l'erreur suivante :

        Exception in Tkinter callback
        Traceback (most recent call last):
          File "/usr/lib/python3.6/tkinter/__init__.py", line 1705, in __call__
            return self.func(*args)
          File "blackjack.py", line 167, in recup
            if len(nom_joueur<joueurs) :
        TypeError: '<' not supported between instances of 'list' and 'int'
        

        et effectivement, la ligne 

        len(nom_joueur<joueurs)

        a peu de chances de marcher.

        Par ailleurs, toutes lignes après la ligne de 224 sont ignorées de ton interface graphique vu que situées après ta mainloop. 

        • Partager sur Facebook
        • Partager sur Twitter
          22 février 2020 à 22:47:11

          Justement tout ce qui est après ma mainloop je voudrais le mettre avant en faisant par exemple pour la mise un def mise(joueurs) sauf que je ne sais pas comment le passer sous tkinter vu qu'au début j'ai fait juste en python  (si vous voyez d'autres problèmes avant dites le moi aussi)
          • Partager sur Facebook
          • Partager sur Twitter
            22 février 2020 à 23:48:50

            AntoineThomas30 a écrit:

            Justement tout ce qui est après ma mainloop je voudrais le mettre avant en faisant par exemple pour la mise un def mise(joueurs) sauf que je ne sais pas comment le passer sous tkinter vu qu'au début j'ai fait juste en python 

            Ta boucle while ligne 225 ne va pas marcher pareil en Tkinter. Une interface graphique est pilotée par des événements et pas des inputs en console comme tu en as ligne  244. Ta mainloop ligne 207 est une boucle while infinie, tout ton code doit se trouver avant et ton code doit faire en sorte d'interagir avec le joueur via des clics de souris sur des widgets ou via des entrées dans des champs. Si tu n'as jamais fait d'interface graphique, c'est peut-être un projet trop compliqué. Essaye déjà de faire un jeu plus simple, style un jeu plus/moins en Tkinter.
            • Partager sur Facebook
            • Partager sur Twitter
              23 février 2020 à 0:18:12

              PascalOrtiz a écrit:

              AntoineThomas30 a écrit:

              Justement tout ce qui est après ma mainloop je voudrais le mettre avant en faisant par exemple pour la mise un def mise(joueurs) sauf que je ne sais pas comment le passer sous tkinter vu qu'au début j'ai fait juste en python 

              Ta boucle while ligne 225 ne va pas marcher pareil en Tkinter. Une interface graphique est pilotée par des événements et pas des inputs en console comme tu en as ligne  244. Ta mainloop ligne 207 est une boucle while infinie, tout ton code doit se trouver avant et ton code doit faire en sorte d'interagir avec le joueur via des clics de souris sur des widgets ou via des entrées dans des champs. Si tu n'as jamais fait d'interface graphique, c'est peut-être un projet trop compliqué. Essaye déjà de faire un jeu plus simple, style un jeu plus/moins en Tkinter.


              J'aimerais bien faire quelque chose de plus simple mais je n'ai pas le temps de tout recommencer car je dois le rendre mardi, j'ai déjà demandé de l'aide à mon prof mais je n'ai toujours aucune réponse, c'est pourquoi je me tourne vers vous. Alors si vous pouviez m'aiguillez ça m'aiderai à comprendre.

              J'ai d'ailleurs commencer avec les clics de souris pour demander le nombre de joueur, le pactole de départ et le nom du joueur

              def recup():
                  global joueurs, num_q, pactole_depart
                  if num_q==1 :
                      joueurs=int(entree.get())
                      texte_question.set("Quel est le pactole initial?")
                      texte.set("")
                      num_q=2
                  elif num_q==2 :
                      pactole_depart=int(entree.get())
                      texte_question.set("Quel est le nom du joueur 1?")
                      texte.set("")
                      num_q=3
                  elif num_q==3 :
                      if len(nom_joueur<joueurs) :
                          nom_joueur.append(entree.get())
                          pactole_joueur.append(pactole_depart)
                      else :
                          pass



              texte=StringVar()
              texte_question=StringVar()
              texte_question.set("Combien de joueurs?")
              question=Label(root,textvariable=texte_question)
              question.pack(side=LEFT)
              entree=Entry(root, textvariable=texte)
              entree.pack(side=LEFT)
              ok=Button(root, text="OK", command=recup)
              ok.pack(side=LEFT)
              num_q=1
              joueurs=0
              pactole_depart=0
              nom_joueur = []
              pactole_joueur = []

              Mais mon prof n'a pas eu le temps de m'expliquer comment faire pour la suite

              Alors si vous pouvez m'aider je vous en serais vraiment reconaissant

              • Partager sur Facebook
              • Partager sur Twitter

              Black Jack tkinter

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown