Aide projet python aide au TDAH

-
Bonjour,
Je suis en 1ere avec la spé NSI et j'ai un projet Tkinter a effectuer.
Je vous avoue que je suis perdu.
Je dois programmer une balle et une cible, la balle doit apparaitre aleatoirement et je dois en plus la faire reapparaitre aleatoirement lorsquelle touche le bord de la fenetre.
J'ai programmé le gros du projet mais nécessite de l'aide pour une partie,
je dois faire en sorte que ma cible soit sur la meme trajectoire que la balle, de plus ma balle doit reapparaitre aleatoirement lorsque elle touche un bord (avec une direction differente)

voici le code (que vous pouvez executer si besoin ):

from tkinter import *
from math import sin, cos
from random import *

def move():
    global x, y, deb, dx, dy, vx, ms #variables globales
    x += dx
    y += dy
    can.coords(ball, x-10, y-10, x+10, y+10) #coordonées
    if deb > 0:#si on a débuté le programme
        fen.after(ms, move)
    if can.coords(ball)[3]>300:#definir le mouvement
        x += dx
        y += dy
        can.coords(ball, x-10, y-10, x+10, y+10)
        if deb > 0:
            fen.after(ms, move)
    #redefinir les coordonées
    if x in range(5,296) and y==295 or x in range(0,300) and y==0 or x==0 and y in range(0,300) or x==300 and y in range(0,300):
        x=300
        y=300
        can.coords(ball, xb, yb, xb+10, y+10)



#definir le debut
def start():
    global deb, ms
    deb += 1
    if deb == 1:
        ms = 6
        move()

#fin du programme
def stop():
    global deb
    deb = 0


# Création des variables:
x, y = randint(0,300), randint(0,300)
deb = 0
dx, dy = 4*random()-2, 4*random()-2
ms = 6
xa, ya = randint(0,300), randint(0,300)
xb, yb = randint(0,300), randint(0,300)
# Création de la fenêtre:
fen = Tk()
fen.title("Aide Au Diagnostic TDAH")

# Création du canevas:
can = Canvas(fen, bg= "white", width= 300, height= 300)
can.grid(row= 2, column= 0)

# Création de la balle:
ball = can.create_oval(x-10, y-10, x+10, y+10, outline= "black", fill= "black")
cible = can.create_oval(x-20, y-20, x+10, y+10, outline= "red")

# Création du bouton "Débuter la Partie":
Button(fen, text= "Débuter la Partie", command= start).grid(row= 0, column= 0)

'''# Création du bouton "Arrêter la Partie":
Button(fen, text= "Arrêter la Partie", command= stop).grid(row= 1, column= 0)

# Création du bouton "Quitter":
Button(fen, text= "Quitter", command= fen.quit).grid(row= 4, column= 0)'''

fen.mainloop()
fen.destroy()




si vous avez des idees, n'hesitez pas a m'en faire part

Merci d'avance,
Vladimir



Configuration: Windows / Chrome 78.0.3904.108
Afficher la suite 

1 réponse

0
Merci
Bonjour,

Ta fonction move est vraiment chaotique.
Dans une fonction il est nécessaire d'utiliser global uniquement sur les variables qui ont besoin d'être modifiées dans cette fonction, et uniquement si ces variables sont non mutables comme par ex. les int, str, float, tuple.

Pour le déplacement de ta cible, cela se fait avec les méthodes bind des widgets tkinter.

Voici une légère amélioration de ton code.

from tkinter import *
from random import *

def move_ball():
    global after_id
    coords = can.coords(ball)
    if coords[2] < 0 or coords[0] > 300 or coords[3] < 0 or coords[1] > 300:
        init_ball()
    can.move(ball, dx, dy)
    after_id = can.after(ms, move_ball)


#definir le debut
def start():
    bt_start.configure(state='disabled')
    bt_stop.configure(state='normal')
    move_ball()


#fin du programme
def stop():
    can.after_cancel(after_id)
    bt_start.configure(state='normal')
    bt_stop.configure(state='disabled')


def init_ball():
    global dx, dy
    i = randint(0, 1)
    if i == 0:
        x = choice((-20, 300))
        y = randint(-20, 300)
        if x == -20:
            dx = step
        else:
            dx = -step
        if y < 50:
            dy = step
        elif y > 250:
            dy = -step
        else:
            dy = choice((step, -step))
    else:
        y = choice((-20, 300))
        x = randint(-20, 300)
        if y == -20:
            dy = step
        else:
            dy = -step
        if x < 50:
            dx = step
        elif x > 250:
            dx = -step
        else:
            dx = choice((step, -step))
    can.coords(ball, x, y, x + 20, y + 20)


def move_cible(evt):
    print(evt.keysym)


dx, dy = 0, 0
ms = 20
step = 4

# Création de la fenêtre:
fen = Tk()
fen.title("Aide Au Diagnostic TDAH")

# Création du canevas:
can = Canvas(fen, bg= "white", width= 300, height= 300)
can.grid(row=1, column=0, columnspan=3)

# Création de la balle:
ball = can.create_oval(0, 0, 0, 0, outline= "black", fill= "black")
init_ball()

cible = can.create_oval(135, 135, 165, 165, outline="red")

# Création du bouton "Débuter la Partie":
bt_start = Button(fen, text= "Débuter", command= start)
bt_start.grid(row= 0, column= 0)

# Création du bouton "Arrêter la Partie":
bt_stop = Button(fen, text= "Arrêter", command= stop, state='disabled')
bt_stop.grid(row=0, column= 1)

# Création du bouton "Quitter":
Button(fen, text= "Quitter", command= fen.quit).grid(row=0, column=2)

fen.bind('<KeyPress>', move_cible)

fen.mainloop()


La fonction init_ball pourrait être largement simplifiée.
Regarde ce qu'affiche evt.keysym dans ta console lorsque tu presses par exemple les touches directionnelles de ton clavier, c'est à partir de ça que tu devras déplacer ta cible selon des directions voulues.

Pour déterminer si la balle entre en contact avec la cible, la méthode find_overlapping du canvas te sera utile, si la balle doit être entièrement située dans la cible alors c'est la méthode find_enclosed de canvas qui sera plus adaptée.

Si tu as des questions, n'hésite pas.
Wow ! Merci beaucoup ! C'est vraiment plus clair.
Merci mille fois vous me sauvez la vie !
j'ai bien une question, que signifie choice(step; -step)?
> VladGLT -
Bonsoir,

choice est une fonction du module random comme son nom l'indique permet de choisir une valeur dans une séquence.
step vaut 4, donc au final choisir une valeur parmi (4, -4).
d'accord merci beacoup pour le temps que vous m'avez consacré ^^. Bonne soiree
Commenter la réponse de trifou