@DesZaz

Turtle не отвечает при запуске цикла while, как исправить?

from turtle import *
from random import randint

class Game(Turtle):
    def __init__(self,x,y,step = 10, shape = "circle", color = "black"):
        super().__init__()
        self.penup()
        self.speed(0)
        self.goto(x,y)
        self.color(color)
        self.shape(shape)
        self.step = step
    def move_up(self):
        self.goto(self.xcor(), self.ycor() + 10)
    def move_down(self):
        self.goto(self.xcor(), self.ycor() - 10)
    def move_left(self):
        self.goto(self.xcor() - 10, self.ycor())
    def move_right(self):
        self.goto(self.xcor() + 10, self.ycor())
    def Kasanie(self,Sprite1,Sprite2):
        dis1 = self.distance(Sprite1.xcor(), Sprite1.ycor())
        dis2 = self.distance(Sprite2.xcor(), Sprite2.ycor())
        if dis1 < 30 or dis2 < 30:
            return True
        else:
            return False
    def Kasanie2(self,goal):
        dis1 = self.distance(goal.xcor(), goal.ycor())
        if dis1 < 30:
            return True
        else:
            return False

player = Game(0, -100, 10, 'circle', 'orange')
Sprite1 = Game(-200, 200, 10, 'square', 'red')
Sprite2 = Game(200, 100, 10, 'square', 'red')
End = Game (0, 300, 10, 'triangle', 'Lime')

scr = player.getscreen()
scr.listen()
scr.onkey(player.move_up, "w")
scr.onkey(player.move_down, "s")
scr.onkey(player.move_left, "a")
scr.onkey(player.move_right, "d")


Inf1 = player.Kasanie(Sprite1,Sprite2)
Inf2 = player.Kasanie2(End)
total_score = 0
while total_score < 3:
    if Inf1:
        player.goto(0,-100)
        total_score += 1
    if Inf2:
        End.hideturtle()
        break
Sprite2.hideturtle()
Sprite1.hideturtle()


player.getscreen()._root.mainloop()
player.done()
  • Вопрос задан
  • 110 просмотров
Пригласить эксперта
Ответы на вопрос 2
phaggi
@phaggi Куратор тега Python
лужу, паяю, ЭВМы починяю
Полагаю, вот тут вы найдете примеры, которые помогут построить вашу игру более удачно, без этих бесконечных циклов.
Ответ написан
Koipse
@Koipse
Возможная проблема в том, что поток "ходит" по коду и уже проверяет действие игрока:

scr.listen()
scr.onkey(player.move_up, "w")
scr.onkey(player.move_down, "s")
scr.onkey(player.move_left, "a")
scr.onkey(player.move_right, "d")

Однако, останавливаясь на:

while total_score < 3:
    if Inf1:
        player.goto(0,-100)
        total_score += 1
    if Inf2:
        End.hideturtle()
        break


total_score никогда не будет больше 3, т.к. проверка бесконечна и никогда не выйдет из while, отчего приложение и виснет. У тебя нет в if "выхода из ситуации" в цикле while, потому происходит бесконечное опрашивание от if1 к if2. Условия не совпадают. Возвращаемся в начало while, а там что? If1. Далее If2. Они не удовлетворяют условия, возвращаемся... Суть ясна?

Можешь попробовать:

while total_score < 3:
    if Inf1:
        player.goto(0,-100)
        total_score += 1
    else:
        End.hideturtle()
        break
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы