Основная проблема, которую я вижу с вашим кодом, заключается в том, что эта общая while
структура управления не будет работать:
boucle = True
while boucle: # Boucle menu
a = int(input("Choisissez la figure à réaliser avec Turtle :\n1. Jouer \n2. Leaderboard \n0. Sortir"))
if a == 1:
fn = Screen()
...
fn.mainloop()
if a == 2:
pass # implement leaderboard
if a == 0:
boucle = False
Как только вы вызовете mainloop()
в варианте 1, вы передадите управление в tkinterи если / когда он вернется, состояние мира черепах, вероятно, не будет повторно запущено.
Я бы порекомендовал вам рассмотреть возможность встраивания этой программы черепах в иерархию окон tkinter, чтобы позволить вам открыть таблицу лидеров как отдельныйокно ткинтера.Кроме того, возможность повторного воспроизведения должна быть кнопочным событием в цикле событий, а не вопросом для консоли.
Пара других вопросов:
Вместо:
Turtle.__init__(self, "mur.gif")
рассмотрим:
super().__init__("mur.gif")
Эта повторяющаяся логика:
move_to_x = self.xcor()
move_to_y = self.ycor() + 24
if (move_to_x, move_to_y) not in murs:
...
обречена на возможный сбой.Черепахи блуждают по плоскости с плавающей точкой, предполагая, что равенство не всегда будет работать, как вы ожидаете.Поможет приведение значений позиции, которые вы возвращаете из черепахи, к int()
.
Я удалил цикл while, как вы упомянули, но я до сих пор не могу понять, почему моя программа не запускается
Ниже моя переделка вашей программы, которая играет для меня.Я заменил изображения черепашьими формами и заголовками, чтобы любой желающий мог его воспроизвести.Я упростил код, где это возможно, и изменил его стиль:
from turtle import Turtle, Screen
POLICE1 = ('Arial', 24, 'bold')
POLICE2 = ('Arial', 50, 'bold')
NIVEAUX = [[
"XXXXXXXXXXXXXXXXXXXXXXXXX",
"XJ X X X",
"X X XXX X XXXXXXX X",
"X X TX X X X",
"X XXXXX X X XXXXXXX X",
"XT X X X",
"XXXXXXXX X XT X X X",
"X X X XXXXXXXXXXXXXX X",
"X X X X X X X",
"X X XT X X X X XTX",
"X X XXXX X X XXXXXX X XXX",
"X X X X X TX X X",
"X XXX XX XXXXXXXXXXXXXX",
"X X X X",
"XXXXXXXX XTX X X XXX X",
"X X X XXX X X XT X",
"X XXX X X X X XXXXX",
"X XXT X X XXXXXXX X X X",
"X XXXXX X X",
"X XXXXXXXXXX X X",
"XXXXX XXXXX X",
"X X X X XX XXXXX",
"X XXXXXXXX X XXX X XX",
"X TX X XT X X X",
"XXXXXXXXXXXXXXXXXXXXXXXXX"]]
class Stylo(Turtle):
def __init__(self):
super().__init__("square")
self.speed('fastest')
self.color("white")
self.penup()
class Joueur(Turtle):
def __init__(self):
super().__init__("turtle")
self.speed('fastest')
self.color("green")
self.penup()
def haut(self):
self.setheading(90)
x, y = self.position()
move_to = (int(x), int(y) + 24)
if move_to not in murs:
self.goto(move_to)
scorefn()
def bas(self):
self.setheading(270)
x, y = self.position()
move_to = (int(x), int(y) - 24)
if move_to not in murs:
self.goto(move_to)
scorefn()
def gauche(self):
self.setheading(180)
x, y = self.position()
move_to = (int(x) - 24, int(y))
if move_to not in murs:
self.goto(move_to)
scorefn()
def droite(self):
self.setheading(0)
x, y = self.position()
move_to = (int(x) + 24, int(y))
if move_to not in murs:
self.goto(move_to)
scorefn()
def collision(self, other):
return self.distance(other) < 5
class Tresor(Turtle):
def __init__(self, position):
super().__init__("triangle")
self.setheading(90) # make look like pile of gold
self.color("gold")
self.penup()
self.goto(position)
tresors.append(self)
def destruction(self):
tresors.remove(self)
self.hideturtle()
def setup_labyrinthe(niveau):
screen.tracer(False)
for y in range(len(niveau)):
for x in range(len(niveau[y])):
caractere = niveau[y][x]
ecran = ((x * 24) - 288, 288 - (y * 24))
if caractere == "X":
stylo.goto(ecran)
stylo.stamp()
murs.append(ecran)
elif caractere == "J":
joueur.goto(ecran)
elif caractere == "T":
Tresor(ecran)
screen.tracer(True)
def scorefn():
global score
for tresor in tresors:
if joueur.collision(tresor):
tresor.destruction()
score += 100
marker.undo()
marker.write(score, font=POLICE1)
if score >= 1000:
marker.goto(-150, 0)
marker.color('red')
marker.write("You Win!", font=POLICE2)
# disable movements but leave Escape/exit active
for direction in ["Left", "Right", "Up", "Down"]:
screen.onkeypress(None, direction)
screen = Screen()
screen.bgcolor("black")
screen.title("No Escape!")
screen.setup(700, 700)
tresors = []
murs = []
stylo = Stylo()
joueur = Joueur()
setup_labyrinthe(NIVEAUX[0])
score = 0
marker = Turtle(visible=False)
marker.penup()
marker.color('gray')
marker.goto(-275, 305)
marker.write("No Escape!", font=POLICE1)
marker.goto(240, 305)
marker.write(score, font=POLICE1)
screen.onkeypress(joueur.gauche, "Left")
screen.onkeypress(joueur.droite, "Right")
screen.onkeypress(joueur.haut, "Up")
screen.onkeypress(joueur.bas, "Down")
screen.onkey(screen.bye, "Escape")
screen.listen()
screen.mainloop()
Если это все еще не работает для вас, вы можете искать внешние причины, по которым ваша программа не запускается,(Например, вы называете один из ваших файлов тем же, что и модуль библиотеки Python; любой текст Unicode (строки или имена файлов) сбивает с толку Python; вы используете стандартную версию Python; у вас есть стандартная версия turtle.ру; и т. д.)
![enter image description here](https://i.stack.imgur.com/sxmDU.png)