Bonjour à tous,
j'espère poster mon message au bon endroit (je débute sur le site).
Je suis en train de programmer le jeu "Pong" grâce au module turtle de python.
Pour l'instant mon jeu semble fonctionnel mais il s'arrête au bout d'environ une minute à cause d'un overflow.
Celui viendrait de la ligne 154, au moment où j'appelle avec un ontimer la fonction Mouvement(), donc de manière récursive.
J'avais augmenté (l7) le nombre maximal d'appels récursifs mais ce n'est pas suffisant.
Auriez-vous s'il vous plaît une méthode pour contourner ce problème d'overflow ?
Merci d'avance,
BDPython

Voici le script, vous pouvez l'exécuter pour vous rendre compte du problème

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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
 
""" Première version Pong en mode 2 Joueurs""" 
from turtle import *
from time import *
from random import *
from math import *
import sys
sys.setrecursionlimit(10**9) #Augmenté au maximum, mais ça ne suffit pas...
 
hauteur = 700
longueur = 900
Bord_terrain = 300
setup(longueur, hauteur, 0, 0)
colormode(255)
 
#VitesseBalle = 10
ecartBord = 30
DeplacementJoeur = 30
 
hideturtle()
tracer(0)
 
global CoinBG1,CoinBG2 
CoinBG1, CoinBG2 = 0,0
global BalleX,BalleY
BalleX, BalleY = 0,0
global Angle
Angle = 0
global Point1, Point2
Point1, Point2 = 0,0
 
#Création des crayons de chauqe joueur, et de la balle
Joueur1 = Turtle("square")
Joueur1.shapesize(60 / 20, 30 / 20)
Joueur1.color("blue")
Joueur1.penup()
Joueur1.goto(-longueur/2 + 30,CoinBG1)
 
Joueur2 = Turtle("square")
Joueur2.shapesize(60 / 20, 30 / 20)
Joueur2.color("red")
Joueur2.penup()
Joueur2.goto(longueur/2 - 30,CoinBG1)
 
balle = Turtle("circle")
balle.color("green")
balle.penup()
 
 
def Joueur_1_haut():
   global CoinBG1
   if CoinBG1 + DeplacementJoeur < Bord_terrain :
      CoinBG1 += DeplacementJoeur
      Joueur1.goto(-longueur/2 + ecartBord,CoinBG1)
   update()
 
def Joueur_1_bas():
   global CoinBG1
   if CoinBG1 - DeplacementJoeur >-Bord_terrain :
      CoinBG1 -= DeplacementJoeur
      Joueur1.goto(-longueur/2 + ecartBord,CoinBG1)
   update()
 
def Joueur_2_haut():
   global CoinBG2
   if CoinBG2 + DeplacementJoeur < Bord_terrain :
      CoinBG2 += DeplacementJoeur
      Joueur2.goto(longueur/2 - ecartBord,CoinBG2)
   update()
 
def Joueur_2_bas():
   global CoinBG2
   if CoinBG2 - DeplacementJoeur > -Bord_terrain :
      CoinBG2 -= DeplacementJoeur
      Joueur2.goto(longueur/2 - ecartBord,CoinBG2)
   update()
 
def reset_balle():
   global Angle
   balle.setposition(0, 0)
   Angle = randint(20, 60) + choice([0, 180]) * choice([1, -1]) 
   balle.setheading(Angle)
 
def Nouveau_point():
   global Point1,Point2
   global CoinBG1,CoinBG2
   global BalleX
   if BalleX > 0:
      Point1+=1
      #bgcolor((163,225,243))
   else:
      Point2+=1
      #bgcolor((255,136,136))
   clear()
   goto(-longueur/4,Bord_terrain)
   write(Point1, font = ("Arial", 15, "bold"))
   goto(longueur/4,Bord_terrain)
   write(Point2, font = ("Arial", 15, "bold"))   
   reset_balle()
   Terrain()
   CoinBG1 = 0
   CoinBG2 = 0
   Joueur1.goto(-longueur/2 + 30,CoinBG1)
   Joueur2.goto(longueur/2 - 30,CoinBG2)
   update()
   sleep(3)
 
def Terrain():
   pensize(3)
   for _ in range(-Bord_terrain+10,Bord_terrain-10,40): 
      up()
      goto(0,_)
      down()
      goto(0,_+20)   
   up()
   goto(-longueur/2 + 30,Bord_terrain)
   down()
   goto(longueur/2 + 30,Bord_terrain)
   up()
   goto(-longueur/2 + 30,-Bord_terrain)
   down()
   goto(longueur/2 + 30,-Bord_terrain)
   up()
   update()
 
def AngleRebond(a1):
   global Angle
   Angle = -a1
   balle.setheading(Angle)
 
 
def Mouvement():
   global BalleX,BalleY
   BalleX,BalleY = balle.position()
   global CoinBG1,CoinBG2
   global Angle
   balle.setheading(Angle)
   if BalleY> Bord_terrain -30 or BalleY< -Bord_terrain +30: 
      AngleRebond(Angle)  
   elif BalleX > (longueur/2 - 60): 
      if BalleY >= (CoinBG2-40) and BalleY <= (CoinBG2 + 40):
         balle.setheading(180 - Angle)
         Angle = balle.heading()
      else:
         Nouveau_point()
   elif BalleX < (-longueur/2 + 60):
      if BalleY >= (CoinBG1 -40) and BalleY <= (CoinBG1 + 40):
         balle.setheading(180 - Angle)
         Angle = balle.heading()
      else:
         Nouveau_point()
   balle.forward(VitesseBalle)
   update()
   ontimer(Mouvement, 20)
   exitonclick()
 
bgcolor("black")
pencolor("white")
clear()
reset_balle()  
Terrain()
update()
VitesseBalle = 3 * int(numinput("Difficulté", "Veuillez saisir le niveau s'il vous plaît, entre 1 (facile) et 5 (difficile)"))
 
listen()
onkeypress(Joueur_1_haut, "a" )
onkeypress(Joueur_1_bas, "q" )
onkeypress(Joueur_2_haut, "Up")
onkeypress(Joueur_2_bas, "Down")
 
Mouvement()