Partage
  • Partager sur Facebook
  • Partager sur Twitter

Python mouvement d'IA

    18 janvier 2020 à 19:44:11

    Bonsoir, 

    voila j'ai une question, j'ai créer des oval ( un nombre qui change à chaque fois entre 1 et 6 ) et je voudrais qu'il se déplace tous mais pas de la même façon, fin genre qu'il vont pas tous a gauche ect...

    je leur es attribué lors de leur création un numéro dans une liste

    from tkinter import *
    from random import *
    
    def Mouvement():
        global dx, dy, cel_nb
        j = len(cel_nb)
        
        for i in range(0, j):
            k[i] = randint(0,8)
            print(k)
                
            if k[i] == 1 or k[i] == 5:
                dx = pas
                
            if k[i] == 2 or k[i] == 6:
                dx = -pas
                
            if k[i] == 3 or k[i] == 7:
                dy = pas
                
            if k[i] == 4 or k[i] == 8:
                dy = -pas
                
            c.move(cel_nb[i], dx, dy)
            f.after(50, Mouvement)
    
    def Cellule():
        x1, x2 = 20, 40
        cel_one = randint(0,6)
        for i in range(0, cel_one):
            cel_nb.append([c.create_rectangle(x1, 20, x2, 40, fill = "white", outline = "white")])
            x1 += 30
            x2 += 30
        j = len(cel_nb)
        for i in range(0,j) :
            k.append(i)
        print('k = ', k)
    
    f = Tk()
                    ##--Variables--##
    
    pas = 20
    dx, dy = pas, pas
    cel_nb = []
    k = []
    
    c = Canvas(f, bg='dark grey', width = 600, height = 600)
    c.pack()
    Cellule()
    print('nb de cellule = ', cel_nb)
    Mouvement()
    f.mainloop()

    sauf que, ca ne marche pas :/ si vous avez une idée je suis preneur 

    • Partager sur Facebook
    • Partager sur Twitter
      18 janvier 2020 à 22:16:52

      Bonjour,

      Si j'ai bien compris tu souhaites créer plusieurs points qui se déplacent aléatoirement dans une grille ?

      Je te propose le plan suivant qui me semble plutôt pas mal.

      1. Crée une matrice (avec numpy par exemple) qui représentera ta "grille de jeu";

      2. Essaye de lier cette matrice pour créer une grille dans ta fenêtre tkinter;

      3. Crée tous les points que tu veux dans ta grille (avec create_rectangle ou create_oval), et place les comme tu veux sur la grille (avec des coordonnées (x,y));

      4. Crée une fonction random_movement qui, à partir des coordonnées actuelles de l'oval (ou rectangle) en question va renvoyer des coordonnées aléatoires en regardant les cases qui il y a à coté.

      En espérant que mes explications sont claire. Et normalement tu obtiens ce que tu veux (à moins que j'ai mal compris ton problème).

      • Partager sur Facebook
      • Partager sur Twitter
        18 janvier 2020 à 22:46:42

        Ligne 25 : peut-être sortir de la boucle for (désindenter) ton rappel avec la méthode after, ça semble mieux marcher.
        • Partager sur Facebook
        • Partager sur Twitter
          19 janvier 2020 à 9:34:27

          Bonjour, 

          Je vous remercie pour vos réponse, PascalOrtiz oui en effet c’était juste un problème de placement de mon After, merci ^^

          Naps94, je vais regarder si en faisant avec numpy ça me facilite les choses, après je ne les jamais utilisé donc je vais voir, la je fait sous Tkinter, mais après je vais passer sous Pygame

          j'ai un autre problème, je voudrais quelle ne dépasse pas l'écran, j'ai donc mis ça :

          def Mouvement():
              global dx, dy, cel_nb
              j = len(cel_nb)
          
              for i in range(0, j):
                  co[i] = c.coords(cel_nb[i])
                  k[i] = randint(0,8)
                  print(k)
                      
                  if k[i] == 1 or k[i] == 5 and co[i][2] <= 800:
                      dx = pas
                      
                  if k[i] == 2 or k[i] == 6 and co[i][0] >= 0:
                      dx = -pas
                      
                  if k[i] == 3 or k[i] == 7 and co[i][1] <= 600:
                      dy = pas
                      
                  if k[i] == 4 or k[i] == 8 and co[i][0] >= 0:
                      dy = -pas
                      
                  c.move(cel_nb[i], dx, dy)
              f.after(25, Mouvement)

          Mais ça ne marche pas :/

          -
          Edité par Ertale 19 janvier 2020 à 10:23:34

          • Partager sur Facebook
          • Partager sur Twitter
            19 janvier 2020 à 10:54:21

            Peut-être ceci : tu as écrit des prédicats du genre A or B and C qui s'interprète en Python A or (B and C) alors que tu souhaites plutôt (A or B) and C.
            • Partager sur Facebook
            • Partager sur Twitter
              19 janvier 2020 à 12:00:24

              j'ai changé en mettant 

              if co[i][2] <= 600 and ( k[i] == 1 or k[i] == 5 ):
                  dx = pas


              mais ça ne change rien, j'ai également essayé avec juste un carré mais rien

              • Partager sur Facebook
              • Partager sur Twitter
                19 janvier 2020 à 19:28:39

                On ne sait pas ce qu'est co, cette variable n'existe pas dans ton premier code. Donne un code qui fonctionne sinon, c'est très difficile de répondre.
                • Partager sur Facebook
                • Partager sur Twitter
                  19 janvier 2020 à 19:41:37

                  bonsoir,

                  co c'est les coordonnée de mon carré 

                  def Mouvement():
                      global dx, dy, cel_nb
                      j = len(cel_nb)
                  
                      for i in range(0, j):
                          co[i] = c.coords(cel_nb[i])
                          k[i] = randint(0,8)
                          print(k)
                              
                          if co[i][2] <= 600 and ( k[i] == 1 or k[i] == 5 ):
                              dx = pas
                              
                          if co[i][0] >= 0 and ( k[i] == 2 or k[i] == 6 ) :
                              dx = -pas
                              
                          if co[i][1] <= 600 and ( k[i] == 3 or k[i] == 7 ) :
                              dy = pas
                              
                          if co[i][0] >= 0 and ( k[i] == 4 or k[i] == 8 ) :
                              dy = -pas
                          print(co[0])
                      c.move(cel_nb[i], dx, dy)
                      f.after(100, Mouvement)

                  j'ai pensais à un truc je l'essaye demain si ca marche 

                  -
                  Edité par Ertale 19 janvier 2020 à 19:43:23

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Python mouvement d'IA

                  × 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