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

Python Discussion :

probleme pour un jeu de dames en python


Sujet :

Python

  1. #1
    Candidat au Club
    Inscrit en
    Avril 2005
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 4
    Points : 2
    Points
    2
    Par défaut probleme pour un jeu de dames en python
    bonjour, je suis nouvelle sur ce forum et je vous écris car j'ai un problème.
    Je dois réaliser un jeu de dames en python et je bloque à un endroit du programme.
    voici la manière dont j'ai fabriqué mes pions:

    for i in range(10):
    for j in range (10):
    if (i+j)%2==0 and j<3:
    orange =damier.create_oval(i*40,j*40,i*40+30,j*40+38,width=2,fill="orange")
    elif (i+j)%2==0 and j>=7:
    purple =damier.create_oval(i*40,j*40,i*40+30,j*40+38,width=2,fill="purple")

    J'utilise TKinter pour l'affichage de l'interface. Le problème est que, ayant créé mes pions de cette manière, je n'arrive pas à utiliser le nom "orange" ou "purple" pour fabriquer mes fonctions de déplacement.
    Comment puis-je faire pour définir mes 2 sortes de pions (orange et violet) afin de dire au programme qu'un pion ne peut pas se déplacer sur une case déjà prise par un pion de la même couleur???
    Merci de votre aide et à bientot
    Audrey

  2. #2
    Candidat au Club
    Inscrit en
    Avril 2005
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 4
    Points : 2
    Points
    2
    Par défaut re-probleme pour jeu de dames
    je vous joins mon programme pour que vous ayez une meilleure idée du jeu.


    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
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    from Tkinter import *
     
     
    def click(event):
        global firstclick
        global source_i
        global source_j
        global dest_i
        global dest_j
        global joueur1
        print event.x, event.y
        print "case :", event.x/40,event.y/40
        if firstclick == True:
            firstclick = False
            source_i = event.x/40
            source_j = event.y/40
        else:
            firstclick = True
            dest_i = event.x/40
            dest_j = event.y/40
            if joueur1 == True:
                ok = deplacementJ1(damier, source_i, source_j, dest_i, dest_j)
            else:
                ok = deplacementJ2(damier, source_i, source_j, dest_i, dest_j)
            if ok == False:
                return
            if joueur1 == True:
                joueur1 = False
                print "c'est au tour du joueur violet"
            else:
                joueur1 = True
                print" c'est au tour du joueur orange"
     
    def visu(damier):
        for ligne in damier:
            for case in ligne:
                print case,
            print "\n",
     
    def redraw(damier, i, j, k, l, couleur):
        damier.create_oval(k*40,l*40,k*40+30,l*40+38,width=2,fill=couleur)
        damier.create_rectangle(i*40,j*40,i*40+39,j*40+39,fill="black")
     
     
     
    def deplacementJ1(damier,i,j,k,l):#deplacement joueur1
        if (i+j)%2 != 0:
            return False
        if k==i+1 and l==j+1:#droite
            redraw(damier, i, j, k, l, "orange")
            return True
        if k==i-1 and l==j+1:#gauche
            redraw(damier, i, j, k, l, "orange")
            return True
        if k==i-1 and l==j-1:#recule
            return False
        if k==i+1 and l==j-1:#idem     
            return False
        #if k==i+1 and l==j+1:
          #  if k== pion_orange and l==pion_orange:
            #    return False
        #if k==i-1 and l==j+1:
           # if k== pion_orange and l== pion_orange:
              #  return False
        return False
     
    def deplacementJ2(damier,i,j,k,l):#deplacement joueur2
        if (i+j)%2 != 0:
            return False
        if k==i+1 and l==j-1:#droite
            redraw(damier, i, j, k, l, "purple")
            return True
        if k==i-1 and l==j-1:#gauche
            redraw(damier, i, j, k, l, "purple")
            return True
        if k==i-1 and l==j-1:#recule
            return False
        if k==i+1 and l==j-1:#idem     
            return False
        return False
     
     
    fen=Tk()
    fen.title("jeu de dames")
    damier=Canvas(fen,bg="dark grey",height=400,width=400)
     
     
     
    for i in range(10):
        for j in range (10):
            print i,j
     
    x=0
    y=0
    for i in range (10): 
        damier.create_line(x,i*40,x+400,i*40)
        damier.create_line(i*40,y,i*40,y+400)
     
    for i in range (10):
        for j in range (10):
            if (i+j)%2==0:
                damier.create_rectangle(i*40,j*40,i*40+39,j*40+39,fill="black")
            else:
                damier.create_rectangle(i*40,j*40,i*40+39,j*40+39,fill="white")
     
    for i in range(10):
        for j in range (10):
            if (i+j)%2==0 and j<3:
                orange =damier.create_oval(i*40,j*40,i*40+30,j*40+38,width=2,fill="orange")
            elif (i+j)%2==0 and j>=7:
                purple =damier.create_oval(i*40,j*40,i*40+30,j*40+38,width=2,fill="purple")
     
     
    arreter=Button(fen,text="arreter",command=fen.destroy)
    arreter.pack()
    damier.pack()
    firstclick = True
    joueur1 = True
    source_i = -1
    source_j = -1
    dest_i = -1
    dest_j = -1
    damier.bind("<Button-1>",click)
    ##fen.mainloop()

  3. #3
    Expert éminent sénior
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Points : 10 067
    Points
    10 067
    Par défaut
    un peu comme celui-qui a programmé un pac-man, créé toi un tableau à 2 demensions (qui représente ton damier), dans lequel un 0 représente un case vide, un 1 une case avec un pion noir et un 2 une case avec un pion blanc.
    Ensuite quand tu essaie de déplacer un pion sur ton damier, tu n'as qu'à vérifier si la case de ton tableau n'est pas déjà prise avant d'éffectuer l'opération.
    En plus, ca te permettra de savoir si tu as sélectionné un pion de la bonne couleur (car pour l'instant si j'ai bien compris, si tu fais descendre le pion sélectionné, le programme pense que c'est un pion orange, sinon que c'est un pion violet(et si on fait descendre un pion violet, il se deviendra orange, bref, c'est un peu le bordel))).

    une autre chose
    c'est à bannir
    =>

  4. #4
    Candidat au Club
    Inscrit en
    Avril 2005
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 4
    Points : 2
    Points
    2
    Par défaut jeu de dames
    Merci de ton aide guigui ms je n'arrive pas à créer un tableau en 2D.
    J'ai regardé le post sur le jeu pacman et c'est le même probleme car mon jeu n'est créé que graphiquement pour le moment.
    Comment créé ce tableau en 2D et attribué à chaque case un 0 , un 1 ou un 2?
    De même comment faire pour vérifier si la case est prise avant de lancer la fonction deplacement?
    Merci beaucoup

  5. #5
    Expert éminent sénior
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Points : 10 067
    Points
    10 067
    Par défaut Re: jeu de dames
    Citation Envoyé par doudou152
    Merci de ton aide guigui ms je n'arrive pas à créer un tableau en 2D.
    J'ai regardé le post sur le jeu pacman et c'est le même probleme car mon jeu n'est créé que graphiquement pour le moment.
    Comment créé ce tableau en 2D et attribué à chaque case un 0 , un 1 ou un 2?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    plateau=[]
    for i in range(10):
        plateau.append(10*[0]) ## initialisation du plateau
     
    for i in range(3):
        for j in range(5):
            plateau[i][2*5+1-j%2]=1 ## placement des pions oranges
            plateau[9-i][2*5+1-j%2]=2 ##placement des pions violets
    à vérifier que j'ai placer les pions au bon endroit
    Citation Envoyé par doudou152
    De même comment faire pour vérifier si la case est prise avant de lancer la fonction deplacement?
    Merci beaucoup
    quand tu cliques sur une case, tu sais sur laquelle tu as cliqué (vu que tu le fais déjà avec le x=event.x/40 et y=event.y/40)
    Donc tu n'as qu'à tester Plateau[y][x] pour savoir ce qu'il y a dessus et après tu fais les traitements que tu veux et ne pas oublier de modifier la variable plateau quand un déplacement a été effectué

  6. #6
    Candidat au Club
    Inscrit en
    Avril 2005
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 4
    Points : 2
    Points
    2
    Par défaut jeu de dames
    j'ai ecris ton code pour créer le tableau et ca m'ecris : list assignment index out of range
    que cela signifie et comment y remedier?
    Merci

  7. #7
    Expert éminent sénior
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Points : 10 067
    Points
    10 067
    Par défaut
    list index out of range: c'est simplement qu'il a accéder à un élement qui est en dehors du tableau
    oups, il faut remplacer les 2*5 par 2*j (y'a peut-être d'autres erreurs, j'ai aps testé) et le j%2 par i%2
    après si tu fais print tableau, tu peux voir si les nombres sont correctement rentré

  8. #8
    Membre averti
    Avatar de Alain_72
    Inscrit en
    Août 2004
    Messages
    180
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 180
    Points : 342
    Points
    342
    Par défaut
    La solution qui t'est donnée par GuiGui est la bonne...

    Ci-dessous ton code remanié sous forme de classe, avec utilisation de tableaux (liste dans une liste) pour stocker les positions et les contenus...

    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
    89
    90
    91
    92
    # -*- coding: iso-8859-1 -*-
     
    from Tkinter import *
     
    class Damier(Frame):
      """ Classe représentant un damier et ses pions"""
      def __init__(self, master):
        Frame.__init__(self, master)
        master.title("jeu de dames")
        self.pack()
        self.cases = []   # dans cette liste, chaque ligne du damier est une représentation des cases qui le composent 
        self.pions = []   # idem la liste case, mais contient les ID des pions
        self.secondClick = False
        self.source_X = 0
        self.source_Y = 0
        self.dest_X = 0
        self.dest_Y = 0
        self.joueur = "purple"
        self.damier=Canvas(self,bg="dark grey",height=400,width=400)
        # Création des cases du damier avec constitution de la liste des cases (True pour noires, false pour blanches)
        for i in range (10):
          liste = []
          for j in range (10):
            if (i+j)%2==0:
              self.damier.create_rectangle(i*40,j*40,i*40+39,j*40+39,fill="black")
              liste.append(True)
            else:
              self.damier.create_rectangle(i*40,j*40,i*40+39,j*40+39,fill="white")
              liste.append(False)
          self.cases.append(liste)
        # Création des pions et constitution de la liste des pions sur leurs cases (ID du pion ou None)
        for i in range(10):
          liste = []
          for j in range (10):
            if (i+j)%2==0 and j<3:
              orange = self.damier.create_oval(i*40,j*40,i*40+30,j*40+38,width=2,fill="orange")
              liste.append(orange)
            elif (i+j)%2==0 and j>=7:
              purple = self.damier.create_oval(i*40,j*40,i*40+30,j*40+38,width=2,fill="purple")
              liste.append(purple)
            else:
              liste.append(None)
          self.pions.append(liste)
        self.damier.pack()
        self.bind_all("<Button-1>",self.click)
     
      def click(self, event):
        if self.cases[event.x/40][event.y/40]:
          if self.secondClick :
            if self.pions[event.x/40][event.y/40] == None:
              self.dest_X = event.x/40
              self.dest_Y = event.y/40
              ok = self.TestDeplacement()
              if ok :
                self.damier.coords(self.pions[self.source_X][self.source_Y],
                                        self.dest_X*40,self.dest_Y*40,
                                        (self.dest_X*40)+30,(self.dest_Y*40)+38)
                self.secondClick = False
                self.pions[self.dest_X][self.dest_Y] = self.pions[self.source_X][self.source_Y]
                self.pions[self.source_X][self.source_Y] = None
                if self.joueur == "orange":
                  self.joueur = "purple"
                  print "c'est au tour du joueur violet"
                else:
                  self.joueur = "orange"
                  print" c'est au tour du joueur orange"
          else:
            if self.pions[event.x/40][event.y/40] != None:
              if self.joueur == self.damier.itemcget(self.pions[event.x/40][event.y/40], "fill"):
                self.secondClick = True
                self.source_X = event.x/40
                self.source_Y = event.y/40
     
      def TestDeplacement(self): 
        print "source_X = " + str(self.source_X)
        print "source_Y = " + str(self.source_Y)
        print "dest_X = " + str(self.dest_X)
        print "dest_Y = " + str(self.dest_Y)
        if self.joueur == "orange":
          if self.dest_Y == self.source_Y+1 and (self.dest_X == self.source_X+1 or self.dest_X == self.source_X-1) :
            return True
          else:
            return False
        else:
          if self.dest_Y == self.source_Y-1 and (self.dest_X == self.source_X+1 or self.dest_X == self.source_X-1) :
            return True
          else:
            return False
     
    root = Tk()
    app = Damier(root)
    app.mainloop()
    Je ne traite pas les problèmes techniques par MP...
    Les forums sont là pour ça...

    Les contributions du bipede

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Jeu de Dames en Python
    Par kowent1 dans le forum Général Python
    Réponses: 0
    Dernier message: 25/05/2014, 12h53
  2. Jeu de dames en Python
    Par panam's dans le forum Programmation multimédia/Jeux
    Réponses: 2
    Dernier message: 06/04/2014, 17h02
  3. probleme pour le transfert dune array de Python vers C
    Par jyjeanphi dans le forum Interfaçage autre langage
    Réponses: 3
    Dernier message: 31/03/2009, 23h54
  4. problème pour faire un jeu
    Par Narkoleptik dans le forum SDL
    Réponses: 9
    Dernier message: 15/06/2006, 02h40

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