Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème tableau 2 dimensions

    21 novembre 2010 à 0:30:25

    bonjour,

    je viens ici car j'ai un problème et je n'arrive pas à avancer à cause de ça malgré plusieurs moments de réflexion. Mon but est de créer une sorte de Puissance4, d'abord simplement directement sous python, puis ensuite avec une interface graphique. N'étant pas très doué en programmation, je bug presque dès le début. Testez le programme que je vous envoie, ça affiche une matrice de la taille demandée, puis ça place le premier élément là où vous le voulez. Là où je bloque c'est quand le deuxième joueur veut jouer et rajouter son propre "jeton". En fait mon programme n'affiche que l'élément du deuxième joueur en enlevant celui du 1er. Je me doute que c'est un problème dans la deuxième boucle dans le "else"de la fonction "placer_element". Il faudrait mettre "si je suis au bon endroit je mets le jeton du joueur, sinon je laisse comme c'est". Justement c'est ce "je laisse comme c'est" qui me pose problème. Comment faire ? Ne faites pas trop attention au contenu, c'est un peu brouillon et je compte simplifier par la suite mais c'est normal. Et biensur, le deuxième joueur n'aura pas les memes jetons que le 1er etc etc... ce que je veux pour le moment, c'est juste COMMENT GARDER l'élement du 1er joueur pour afficher les 2 élements après que les 2 joueurs aient joué. Il doit y avoir une astuce et je ne la trouve pas. Désolé, ça doit paraître stupide pour certains d'entre vous...
    voici mon code:



    def matrice(n,p):
    
        col_sep, row_sep = '|', "\n%s+\n" % ('+---'*n)
        rows = []
        alphabet='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
        i=0
        t=''
        while (i<n):
            t+= '  ' + alphabet[i] + ' '
            
            i+=1
        print t    
        
        for q in range(1, p+1):
            cols = []
            for r in range(1, n+1):
              cols += ["   "]
          #print "## q:%d cols:%r" % (q, cols)
            rows += ["%s%s%s" % (col_sep, col_sep.join(cols), col_sep)]
        #print "## p:%d rows:%r" % (p, rows)
            
    
        return "%s%s%s" % (row_sep, row_sep.join(rows), row_sep)
    
    #---------------------------------------------------------------------------
    
    
    def placer_element(n,p,p1):
    
        col_sep, row_sep = '|', "\n%s+\n" % ('+---'*n)
        rows = []
        alphabet='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
        i=0
        t=''
        while (i<n):
            t+= '  ' + alphabet[i] + ' '
            
            i+=1
        print t
        j=0
        while (j<=len(alphabet)) and (p1!=alphabet[j]):
            j+=1
            
                
        
        for q in range(1, p+1):
            cols = []
            for r in range(1, n+1):
                
                if (q==p)and (r==j+1):
                    cols+=[" X "]
                else:
                    cols+=["   "]
                
                  
          #print "## q:%d cols:%r" % (q, cols)
            rows += ["%s%s%s" % (col_sep, col_sep.join(cols), col_sep)]
        #print "## p:%d rows:%r" % (p, rows)
    
            
            
    
        return "%s%s%s" % (row_sep, row_sep.join(rows), row_sep)
    
    
    #-----------------------------------------------------------------------------
    
     
        
    
    # ------------------------------------------------------------------------------
    def main():
      """main program of the "tabmul" module"""
     #print "%s\n%s%s\n%s" % ('='*80, __doc__, __usage__, '='*80)
      
      while True :
        try:
            
            line = raw_input("<> Enter number of colonnesXlignes : ")
        #line=int(line)
            if line == '': break
            colonnes,lignes=line.split('X')
            lignes=int(lignes)
            colonnes=int(colonnes)
            s=matrice(colonnes,lignes)
            print s
        except ValueError:
            print "Respectez la consigne et la sythaxe exigée"
        
            
        player1 = raw_input(" <> Player 1 : ")
        if player1=='':break
        #player1=int(player1)
        t=placer_element(colonnes, lignes, player1)
        print t
    
        player1 = raw_input("<> Player 2 : ")
        if player1=='':break
        t=placer_element(colonnes,lignes,player1)
        print t
        print "Ciao"
    # ------------------------------------------------------------------------------
    if __name__ == '__main__':
      main()
    # ==============================================================================
    
    • Partager sur Facebook
    • Partager sur Twitter
      21 novembre 2010 à 0:30:25

      Le message qui suit est une réponse automatique activée par un modérateur.
      Les réponses automatiques permettent d'éviter aux modérateurs d'avoir à répéter de nombreuses fois la même chose, et donc de leur faire gagner beaucoup de temps.
      Nous sommes néanmoins ouverts et si vous avez une question ou une remarque, n'hésitez pas à contacter le modérateur en question par MP.


      Merci d'utiliser les balises de code


      Bonjour,

      Les forums du Site du Zér0 disposent d'une fonctionnalité permettant de colorer et mettre en forme les codes source.
      Vous avez posté un code source sans utiliser cette fonctionnalité. Pourriez-vous éditer votre message en entourant votre code des balises <code > et </code > ?

      Cela aura pour effet de "colorer" votre code et donc d'en faciliter grandement la lecture. Vous aurez ainsi beaucoup plus de chances d'avoir des réponses.

      Voici un exemple de code non coloré avec la balise "citation" (mauvais exemple) :

      Citation

      int main(int argc, char *argv[])
      {
      long choixOperation;

      printf("Choisissez l'operation a effectuer");
      /* etc. */
      }



      Voici maintenant le même code coloré, si vous aviez utilisé la balise "code" (bon exemple) :

      int main(int argc, char *argv[])
      {
          long choixOperation;
      
          printf("Choisissez l'operation a effectuer");
          /* etc. */
      }
      


      C'est plus clair n'est-ce pas ? :)
      N'hésitez pas à éditer votre message pour changer la balise afin de colorer votre code.

      Plus d'informations à ce sujet


      Merci de votre compréhension :)
      Les modérateurs.
      • Partager sur Facebook
      • Partager sur Twitter
        21 novembre 2010 à 5:26:57

        Mmmh... Je ne suis pas rentré dans ton code (je crois que je n'ai pas le niveau de toute façon), mais une approche POO serait pas mal pour ce genre de programme...

        De plus l'indentation est pas terrible terrible.
        Sur-ce je laisse d'autre plus compétent que moi te répondre, bonne chance :)

        Edit:
        C'est inutile ça o_O
        s=matrice(colonnes,lignes)
        print s
        


        Fait directos:
        matrice(colonnes,lignes)
        
        • Partager sur Facebook
        • Partager sur Twitter
          21 novembre 2010 à 6:35:47

          A mon avis tu t'y prends mal. Tu devrais séparer complètement ton affichage et ton jeu en tant que tel.
          Donc par exemple, tu crées une liste de booléens à deux dimensions, dans lequel tu effectues tes changements selon ce qu'a entré le joueur, puis quand tout est bon tu passes cette liste à une fonction qui a pour seul et unique but d'afficher ton jeu.
          Tes fonctions doivent avoir un seul et rôle, sinon ça va vite devenir n'importe quoi.
          Après, comme l'a dit ShikiSokuZeku, tu pourrais avoir une approche un peu plus orientée objet de la chose, et créer une classe Jeu avec ton tableau, et les méthodes qui vont avec (donc placer un nouveau jeton etc..).

          Edit : Ah, désolé en fait le jeu étant un puissance 4 il faut pouvoir différencier les jetons donc une liste de booléens n'est pas ce qu'il y a de plus approprié, mais tu peux simplement faire une liste d'entiers avec 0 pour une case vide, 1 pour les jetons du joueur 1 et 2 pour les jetons du joueur 2, ou quelque chose comme ça.
          • Partager sur Facebook
          • Partager sur Twitter
            21 novembre 2010 à 6:56:33

            placer_element() redessine une matrice vierge à chaque fois avant de placer le pion ...
            de plus ta matrice n'a pas d'existance.

            suggestion:
            comme le dit Shaddan,
            d'abord maitriser la manipulation de listes, la POO est optionnelle.
            Puis, créer une fonction autonome pour visualiser ton jeu.


            je partirai plutôt d'une liste de listes vides ...
            [[],[],[],[],...]
            avec [].insert(0,pion) et une variable longeur_max ça devrait le faire ;)
            • Partager sur Facebook
            • Partager sur Twitter

            Python c'est bon, mangez-en. 

              21 novembre 2010 à 7:10:12

              Citation : josmiley


              je partirai plutôt d'une liste de listes vides ...
              [[],[],[],[],...]
              avec [].insert(0,pion) et une variable longeur_max ça devrait le faire ;)


              En effet j'y avais pas pensé mais ça devrait être beaucoup plus simple de poser les jetons en s'y prenant comme ça. Par contre plutôt que insert , append me parait plus clair :
              table = [[],[],[],[]]
              table[colonne].append(pion)
              

              • Partager sur Facebook
              • Partager sur Twitter
                21 novembre 2010 à 7:23:03

                oops ...
                finalement l'idée des zéro pour les cases vides facilite la recherche car on manipule la matrice plus facilement.
                • Partager sur Facebook
                • Partager sur Twitter

                Python c'est bon, mangez-en. 

                  22 novembre 2010 à 19:07:00

                  merci pour vos réponses, je vais essayer de prendre en considération vos conseils. Je voulais savoir autre chose en passant. Comment initialise-t-on (déclare-t-on) une liste de listes (tableau à 2 dimensions). Genre en C++ il me semble que c'est : liste[6][5] pour créer un tableau de 6 lignes et 5 colonnes mais comment fait-on en Python ?

                  Merci!
                  • Partager sur Facebook
                  • Partager sur Twitter
                    22 novembre 2010 à 19:32:20

                    Citation : gital33

                    merci pour vos réponses, je vais essayer de prendre en considération vos conseils. Je voulais savoir autre chose en passant. Comment initialise-t-on (déclare-t-on) une liste de listes (tableau à 2 dimensions). Genre en C++ il me semble que c'est : liste[6][5] pour créer un tableau de 6 lignes et 5 colonnes mais comment fait-on en Python ?



                    ça ne se 'déclare' pas, ça s'affecte.
                    malistedelistes = [[1,2,6,5,8],[6,8,4,3,2],[8,7,4,5,0]] # genre matrice

                    je me suis amusé à en faire un.
                    j'ai mis quelque coms, si ça peut t'aider.
                    class Grid:
                        
                        def __init__(self,haute,large,ligne):
                            '''
                            haute = hauteur de la grille
                            large = largeur de la grille <= 26
                            ligne = nombre de pions a aligner pour gagner
                            '''
                            # genere 4 matrices ...
                            # 1 grille verticale, 1 horiontale, et les 2 diagonales
                            self.haute = haute
                            self.large = large if large <= 26 else 26
                            self.ligne = ligne
                            self.alpha = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[:self.large] # pour l'affichage
                            self.horiz = [bytearray(' '*self.large) for _ in range(self.haute)]
                            self.verti = [bytearray(' '*self.haute) for _ in range(self.large)]
                            self.diag1 = [bytearray(' '*(self.haute)) for _ in range(self.large+self.haute-1)]
                            self.diag2 = [bytearray(' '*(self.haute)) for _ in range(self.large+self.haute-1)]
                    
                        def put_at(self,lettre_colonne,pion):
                            '''
                            lettre_colonne = lettre alphabetique representant la colonne dans laquelle poser le pion
                            pion doit etre un caractere unique, 1 caractere pour chaque jouer
                            '''
                            # retourne 1 si le pion ne peut etre place
                            # retourne 0 si le pion a ete place
                            # retourne pion si le pion place donne la victoire
                            # les 4 matrices sont updatees a chaque fois qu'un pion peut etre place
                            # en verifiant si c'est gagnant
                            try:
                                lettre_colonne = self.alpha.index(lettre_colonne.upper())
                                y = self.verti[lettre_colonne].rfind(' ') # teste s'il reste de la place dans la colonne
                                y = y/(y>-1) # sinon genere une erreur
                            except: return 1 # plus de place dans cette rangee ou entree non valide
                            self.verti[lettre_colonne][y] = pion
                            if self.ligne*pion in self.verti[lettre_colonne]: return pion # place gagnant
                            self.horiz[y][lettre_colonne] = pion
                            if self.ligne*pion in self.horiz[y]: return pion
                            self.diag1[y+lettre_colonne][y] = pion
                            if self.ligne*pion in self.diag1[y+lettre_colonne]: return pion
                            self.diag2[lettre_colonne-y+self.haute-1][y] = pion
                            if self.ligne*pion in self.diag2[lettre_colonne-y+self.haute-1]: return pion
                            return 0 # pion place
                    
                        def show(self):
                            print self.alpha.replace('',' ')
                            for _ in self.horiz:
                                print _.replace('','|')
                                print '-'*(self.large*2+1)
                    
                    grid = Grid(8,8,4)
                    grid.show()
                    player = ['x','o'] # caracteres utilises pour chaque joueur
                    c = 0 # joueur 'x' commence
                    while True:
                        state = grid.put_at(raw_input("joueur '"+player[c]+"' : "),player[c])
                        grid.show()
                        if state == player[c]:
                            print "joueur '"+player[c]+"' gagne"
                            break
                        elif not state:
                            c = not c
                    

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Python c'est bon, mangez-en. 

                      22 novembre 2010 à 19:58:09

                      Dans ce cas là, comment créer une liste de liste de dimension n*p ?

                      je jeterai un coup d'oeil à ton code, mais comme je n'en suis qu'au début des classes, je pense que j'aurai du mal à comprendre la totalité, mais merci quand meme!
                      • Partager sur Facebook
                      • Partager sur Twitter
                        22 novembre 2010 à 20:12:00

                        Tu peux par exemple déclarer ta liste comme ça :
                        array = [[0]*p for _ in range(n)]
                        

                        qui te donnera une liste de n*p cases remplies de 0.
                        • Partager sur Facebook
                        • Partager sur Twitter

                        Problème tableau 2 dimensions

                        × 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