Bonjour,

Je cherche à créer un flipper avec python. Je ne suis pas très douée !
En, fait nous avons créer noter interface graphique avec le flipper, ainsi que la balle. Au début l'utilisateur doit entrer les positions et largeurs des 3 différents obstacles (matérialisés par des segments horizontaux) ainsi que les dimensions du flipper.
Notre balle doit partir avec un angle de 45 degrès. Celle-ci ne bouge pas quand nous lançons le programme.

Voici notre programme (sans les interfaces graphiques,juste pour le mouvement de la balle):

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
######### Les tests #####################
 
#on teste si la balle va toucher un obstacle vertical
#xb et yb sont les coordonnees de la balle
#xmax,ymax,xmin,ymin sont les extrémités du flipper
 
######### Les tests #####################
 
#on teste si la balle va toucher un obstacle vertical
#xb et yb sont les coordonnees de la balle
#xmax,ymax,xmin,ymin sont les extrémités du flipper
 
def touche_obstacle_v(xb,yb,xmax,ymax,xmin,ymin):                
    if xb==xmax or xb==xmin:#si touche les bords verticaux du flipper
        alpha=pi-alpha #si la balle touche un bord, elle repart symétriquement donc l'angle change
        xb=xb+cos(alpha)
        yb=yb+sin(alpha)
        return 1
 
#on teste si la balle touche un coin du flipper
    elif xb==xmax and yb==ymin or xb==xmax and yb==ymax or xb==xmin and yb==ymin or xb==xmin and yb==ymax:
        alpha=pi+alpha #si elle touche, elle repart en sens inverse avec le même angle
        xb=xb+cos(alpha)
        yb=yb+sin(alpha)
        return -1
    else:
        return 0
 
#on teste si la balle touche des obstacles horizontaux (bords horizontaux du flipper ou les plots(segments)
 
def touche_obstacle_h(xb,yb,listeplot,ymin,ymax):
    if yb==ymin or yb==ymax:#si ca touche les bords horizontaux du flipper
         alpha=-alpha
         xb=xb+cos(alpha)
         yb=yb+cos(alpha)   
         return 1
    else:
        for i in listeplot: #on teste si ca touche les plots
            a,b,c=i
            if a<=xb<=b and yb==c:
                alpha=-alpha 
                xb=xb+cos(alpha)
                yb=yb+cos(alpha)           
                return 1
            else:
                return 0
 
 
 
def mouvement_balle():
    global xb,yb,alpha,flag    
    while touche_obstacle_h(xb,yb,listeplot,ymin,ymax)==0 and touche_obstacle_v(xb,yb,xmax,ymax,xmin,ymin)==0:
#on voudrait que la balle avance tant qu'elle ne touche ni le flipper, ni les plots
        xb, yb = xb+cos(alpha), yb+sin(alpha)
        interfacejeu.coords(balle,xb,yb,xb+30,yb+30)
    if flag >0:
        root.after(50,mouvement_balle)         # => boucler après 50 millisecondes
 
 
 
def demarrer():
    "démarrage de l'animation"
    global flag
    if flag ==0:         # pour ne lancer qu'une seule boucle
        flag =1
        mouvement_balle()
 
def pause():
    "arret de l'animation"
    global flag
    flag =0
 
########Programme principal#############
listeplot=[(x1,xa1,y1),(x2,xa2,y2),(x3,xa3,y3)] #les x sont les abscisses de début des plots, les xa sont leurs abscisses de fin et les y leurs ordonnées
 
xb, yb = 10, 10 #position initiale de la balle
alpha=pi/4 
flag=0
balle = interfacejeu.create_oval(xb, yb, xb+30, yb+30, width=2, fill='red')



Bon, j'espère que c'est compréhensible. Sinon je peux répondre à d'autres questions sans problème, c'est la première fois que j'utilise le forum.
Je pense que nous emboitons mal notre while... Nous ne trouvons pas de solution.
En vous remerciant par avance de votre aide....

Bonne journée

Marion.