Вместо того, чтобы fire()
вызывать его саморекурсивно при последующих попытках, вам было бы лучше с while not gameover:
l oop в fire()
и соответствующим образом скорректировать остальную часть кода. В моем переписывании вашего кода ниже я использую такой al oop, и я также использую собственную функцию turtle graphi c numinput()
вместо консоли:
from turtle import Screen, Turtle
from math import radians, sin, cos
from random import randint
def square(t):
''' function that make the square '''
for _ in range(4):
t.forward(10)
t.left(90)
def fire(t):
''' function that fire a shell to a square direction '''
gameover = False
speed = None
angle = None
while not gameover:
t.up()
t.home()
t.down()
speed = screen.numinput("Angry Turtle", "Speed:", default=speed, minval=1, maxval=1000) # satisfy condition 3
if speed is None:
continue
angle = screen.numinput("Angry Turtle", "Angle (in degrees):", default=angle, minval=1, maxval=89) # satisfy condition 3
if angle is None:
continue
vx = speed * cos(radians(angle))
vy = speed * sin(radians(angle))
x = 0
y = 0
while t.ycor() >= 0: # until y becomes negative; satisfy condition 4
vy -= 10
x += vx
y += vy
t.goto(x, y)
x_pos, y_pos = t.position()
# if x_pos and y_pos are within range, set gameover to True and break loop
if d1 <= x_pos <= d1 + 10 and 0 <= y_pos <= 10:
gameover = True
break
screen = Screen()
screen.title("Angry Turtle")
turtle = Turtle()
turtle.shape("turtle")
turtle.forward(screen.window_width() // 2)
turtle.home()
d1 = randint(100, 200) # choose the random distance between 100 to 200
turtle.up()
turtle.forward(d1)
turtle.down()
square(turtle) # satisfy condition 1
fire(turtle)
Однако приведенный выше дизайн улавливает пользователь в сценарии «выиграйте игру, если хотите выйти», и вы можете дать ему лучший способ выйти из программы.