Aide projet python aide au TDAH
VladGLT
-
SarahCroche -
SarahCroche -
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 ):
si vous avez des idees, n'hesitez pas a m'en faire part
Merci d'avance,
Vladimir
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
A voir également:
- Aide projet python aide au TDAH
- Citizen code python avis - Accueil - Outils
- Filigrane projet - Guide
- Gant projet - Télécharger - Gestion de projets
- \R python ✓ - Forum Python
- Musique projet x - Forum Musique / Radio / Clip
1 réponse
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.
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.
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.
Merci mille fois vous me sauvez la vie !
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).