Jeu morpion

Résolu
Bonjour,
j'aimerais codé un jeu de morpion qui se joue seul contre l'ordinateur mais il y a un passage que je n'arrive pas à optimisé. A un moment je veux décrire quel est l'ordre de priorité (jsp quel thermes utiliser pour l'appeler donc je vais l'appeler robot) de l'action qu'il va faire. Il commence par regarder si il a déjà deux case et la troisième est disponible, ce qui le fait gagner. Si il ne peut pas gagner à ce tours, il vérifie que sont adversaires ne gagnera pas à sont prochain tours si le robot de réagit pas. Et pour finir il suivra différant plans que j'aurais programmé. C'est dans les deux première priorité du robot que j'ai du mal.
je pourrais faire ça mais c long pas optimisé du tout et très brouillon
a1|a2|a3
__|___|____
b1|b2| b3
__|___|____
c1|c2 |c3
(c'est un reproduction du cadrillage du plateau de jeu pour vous montrer comment j'ai nommé chaque case)

voici à peu près ce que ça donnerait je pourrait un peu l'optimisé mais il serait quand même très mal optimisé :

caseDuJoueur = [ ] #contient toutes les cases du joueur, dans la suite du programme je vais juste écrire cdj pour allé plus vite

CaseDuRobot = [ ] #contient toutes les case du robot, je vais juste écrire cdr pour allé plus vite
CaseChoisi = [ ] #contient toutes les case qui sont déjà prises
dans sa suite du programme je vais juste dire cc pour aller plus vite

if a1 in cdr and a2 in cdr and a3 not in cc:
cdr.append(a3)
print("perdu")
if a1 in cdr and a3 in cdr and a2 not in cc:
cdr.append(a2)
print("perdu")
if a in cdr and a2 in cdr and a1 not in cc:
cdr.append(a1)
print("perdu")
if b1 in cdr and b3 in cdr and b2 not in cc:
cdr.append(b2)
print("perdu")
if b1 in cdr and b2 in cdr and b3 not in cc:
cdr.append(a3)
print("perdu")
etc...

je pense qu'il faut faire un truc avec des matrices mais jsp comment faire et je n'ai rien trouvé qui pourrait m'aider

après j'ai un autre problème d'optimisation pour celui ci vous n'avez pas besoins de mise en contexte ce qui j'ai fait va suffire à vous faire comprendre

if a == "a1":
a = a1
elif a == "a2":
a = a2
elif a == "a3":
a = a3
elif a == "b1":
a = b1
elif a == "b2":
a = b2
elif a == "b3":
a = b3
elif a == "c1":
a = c1
elif a == "c2":
a = c2
elif a == "c3":
a = c3

merci beaucoup pour votre aide

11 réponses

  1. Pour moi le terme matrice est impropre, car il désigne un outil mathématique et là c’est pas des maths

    Par contre, en effet quelque chose qui a un « représentation » matricielle serait probablement plus pratique pour ton exercice.

    Tu pourrais n’avoir qu’un objet qui contient les cases du robot et du joueur, et itérer dessus

    Par exemple, une liste peut contenir pleins de type de données, y compris des listes.

    Mais avec une seule liste tu peux arriver à un résultat similaire.
    Si la liste contient 9 items (par exemple des V pour vides).
    Les 3 premiers sont la première ligne
    Les 3 suivants la 2eme ligne
    Et les 3 derniers la dernière ligne.
    1
    1. Avec 3 listes de 3 items, tu peux avoir une représentation "spatiale" de ton jeu.
      Je vais prendre _ pour une case vide, X pour le joueur, et O pour le robot.

      A un moment de la partie on peut arriver à
      ["X", "_", "X"]
      et
      ["_", "_", "_"]
      et
      ["0", "_", "0"]

      Intuitivement, j'imagine
      X_X
      ___
      O_O

      mais ça peut aussi représenter
      X_O
      ___
      X_O

      ou encore
      O_O
      ___
      X_X

      bref c'est toi qui voit.

      Supposons
      X_X
      ___
      O_O
      Pour savoir s'il y a une ligne gagnante, le robot, regarde chaque liste et dès qu'il en trouve une dans laquelle il y a 2 O et un _ alors il remplace le _ par O et gagne.

      Maintenant supposons
      X_O
      ___
      X_O
      Pour regarder en colonne, il faut prendre l'élément "n" de la liste 1, le "n" de la liste 2 et le "n" de la liste 3 et ensuite c'est pareil dès qu'une colonne contient 2 0 et un _ le robot gagne.

      1
      1. d'accord, merci beaucoup, je fait ça et je reposte correctement mon code
        0
        1. je le reposte correctement

          Bonjour,
          j'aimerais codé un jeu de morpion qui se joue seul contre l'ordinateur mais il y a un passage que je n'arrive pas à optimisé. A un moment je veux décrire quel est l'ordre de priorité (jsp quel thermes utiliser pour l'appeler donc je vais l'appeler robot) de l'action qu'il va faire. Il commence par regarder si il a déjà deux case et la troisième est disponible, ce qui le fait gagner. Si il ne peut pas gagner à ce tours, il vérifie que sont adversaires ne gagnera pas à sont prochain tours si le robot de réagit pas. Et pour finir il suivra différant plans que j'aurais programmé. C'est dans les deux première priorité du robot que j'ai du mal.
          je pourrais faire ça mais c long pas optimisé du tout et très brouillon
          a1|a2|a3
          __|___|____
          b1|b2| b3
          __|___|____
          c1|c2 |c3
          (c'est un reproduction du cadrillage du plateau de jeu pour vous montrer comment j'ai nommé chaque case)

          voici à peu près ce que ça donnerait je pourrait un peu l'optimisé mais il serait quand même très mal optimisé :

          cdj = [] #contient toutes les cases du joueur
          cdr = [] #contient toutes les case du robot
          cc = [] #contient toutes les case qui sont déjà prises 
          
          if a1 in cdr and a2 in cdr and a3 not in cc:
          cdr.append(a3)
          print("perdu")
          if a1 in cdr and a3 in cdr and a2 not in cc:
          cdr.append(a2)
          print("perdu")
          if a in cdr and a2 in cdr and a1 not in cc:
          cdr.append(a1)
          print("perdu")
          if b1 in cdr and b3 in cdr and b2 not in cc:
          cdr.append(b2)
          print("perdu")
          if b1 in cdr and b2 in cdr and b3 not in cc:
          cdr.append(a3)
          print("perdu")

          etc...

          je pense qu'il faut faire un truc avec des matrices mais jsp comment faire et je n'ai rien trouvé qui pourrait m'aider

          après j'ai un autre problème d'optimisation pour celui ci vous n'avez pas besoins de mise en contexte ce qui j'ai fait va suffire à vous faire comprendre

          if a == "a1":
          a = a1
          elif a == "a2":
          a = a2
          elif a == "a3":
          a = a3
          elif a == "b1":
          a = b1
          elif a == "b2":
          a = b2
          elif a == "b3":
          a = b3
          elif a == "c1":
          a = c1
          elif a == "c2":
          a = c2
          elif a == "c3":
          a = c3

          Voilà, j'espère que maintenant vous pouvez voir les programmes correctement.
          merci beaucoup pour votre aide
          0
          1. Comme tu le vois, il n’y a toujours pas d’indentation.

            Option 1, tu n’en as pas non plus dans ton code chez toi, et dans ce cas ton programme ne peut pas marcher du tout

            Option 2, tu l’as copié collé depuis ton premier message, dans lequel y’a plus d’indentation donc….

            Option 3….
            0
            1. Ha, maince, désolé, c'était l'option 2, je vais les réécrire à la main entre les deux balises.
              voici le premier programme :
              cdj = [] #contient toutes les cases du joueur
              cdr = [] #contient toutes les case du robot
              cc = [] #contient toutes les case qui sont déjà prises
              
              if "a1" in cdr and "a2" in cdr and "a3" not in cc:
                  cdr.append("a3")
                  print("perdu")
              if "a1" in cdr and "a3" in cdr and "a2" not in cc:
                  cdr.append("a2")
                  print("perdu")
              if "a3" in cdr and "a2" in cdr and "a1" not in cc:
                  cdr.append("a1")
                  print("perdu")
              if "b1" in cdr and "b3" in cdr and "b2" not in cc:
                  cdr.append("b2")
                  print("perdu")
              if "b1" in cdr and "b2" in cdr and "b3" not in cc:
                  cdr.append("a3")
                  print("perdu")


              et voici le deuxième
              if a == "a1":
                  a = a1
              elif a == "a2":
                  a = a2
              elif a == "a3":
                  a = a3
              elif a == "b1":
                  a = b1
              elif a == "b2":
                  a = b2
              elif a == "b3":
                  a = b3
              elif a == "c1":
                  a = c1
              elif a == "c2":
                  a = c2
              elif a == "c3":
                  a = c3
              0
              1. Quand tu dis ne pas savoir faire avec les matrices, ce que tu ne sais pas c’est coder une « matrice » en python ou alors quel algorithme appliquer sur une matrice ?
                0
                1. ni l'un ni l'autre, c'est un ami à moi qui pour un programme un peu similaire m'avait conseillé de d'utiliser des matrice mais j'ai abandonné se projet car à l'époque je n'avais pas les compétences pour le finir proprement
                  0
                  1. merci beaucoup, mais après avoir fait les liste jsp comment on pourrait faire pour les "lier", pour que quand il y en a deux carreaux qui se suive appartenant au bot ou au joueur pour que le robot le prenne ?
                    0
                    1. merci beaucoup pour ton aide, je vais essayer de faire ça
                      0