2016-11-10 10 views
0

Я делаю игру в Черепахе с Питоном, где одна Черепаха (называемая Льюи) следует за другой (называется Элла). На данный момент целью игры является то, что Элла, которая немного медленнее Льюи, должна следовать за Льюи. Льюи движется по нажатию клавиш со стрелками.Как заставить черепаху Python перестать пытаться догнать черепаху, это следует за этим?

Элла идет за Льюи, но проблема в том, что если, скажем, вы дважды нажимаете клавишу «право», прежде чем Элла прибывает в положение Льюи, а затем позволит ей догнать его позицию, тогда она начать возвращаться ко всем ее предыдущим позициям, где она не смогла догнать Льюи, а затем продолжает идти на все позиции Льюи, которые она пропустила.

Элла не должна повторять свои шаги, так как я могу исправить эту проблему? Вот код:

import turtle 

image = "C:/Python27/Pythonprogramming/image.gif" 
screenr = turtle.Screen() 

Lewi = turtle.Turtle() 
Ella = turtle.Turtle() 

screenr.addshape(image) 
Lewi.shape(image) 

screenr.bgpic("winXP.gif") 
screenr.setup(1279, 815) 



Lewi.penup() 
speed = 50 

def up(): 
    Lewi.sety(Lewi.ycor()+speed) 
    Ella.speed(1) 
    Ella.goto(Lewi.pos()) 
    if Ella.pos() == Lewi.pos(): 
     print("loo") 

def down(): 
    Lewi.sety(Lewi.ycor()-speed) 
    Ella.speed(1) 
    Ella.goto(Lewi.pos()) 
    if Ella.pos() == Lewi.pos(): 
     print("loo") 

def left(): 
    Lewi.forward(-speed) 
    Ella.speed(1) 
    Ella.goto(Lewi.pos()) 
    if Ella.pos() == Lewi.pos(): 
     print("loo") 

def right(): 
    Lewi.forward(speed) 
    Ella.speed(1) 
    Ella.goto(Lewi.pos()) 
    if Ella.pos() == Lewi.pos(): 
     print("loo") 



screenr.onkey(up, "Up") 
screenr.onkey(down, "Down") 
screenr.onkey(right, "Right") 
screenr.onkey(left, "Left") 
screenr.listen() 

turtle.mainloop() 

ответ

0

Я считаю, проблема в том, что Элла зависит от Льюи за ее движение. Если мы сделаем ее независимой, запустив событие таймера, она сможет реагировать на движение Льюи и преследовать его более естественно. Кроме того, поскольку вы будете быстро и много бить клавиши перемещения, я изменил их обработчики, чтобы блокировать удары, пока текущий хит обрабатывается. Я также изменил обработчик, чтобы установить заголовок, а затем двигаться вперед:

from turtle import Turtle, Screen 

screen = Screen() 

Lewi = Turtle(shape="turtle") 
Lewi.color("red") 
Lewi.penup() 

Ella = Turtle(shape="turtle") 
Ella.color("green") 
Ella.speed("slowest") 

screen.setup(1279, 815) 

speed = 20 

def up(): 
    screen.onkey(None, "Up") 
    Lewi.setheading(90) 
    Lewi.forward(speed) 
    screen.onkey(up, "Up") 

def down(): 
    screen.onkey(None, "Down") 
    Lewi.setheading(270) 
    Lewi.forward(speed) 
    screen.onkey(down, "Down") 

def left(): 
    screen.onkey(None, "Left") 
    Lewi.setheading(180) 
    Lewi.forward(speed) 
    screen.onkey(left, "Left") 

def right(): 
    screen.onkey(None, "Right") 
    Lewi.setheading(0) 
    Lewi.forward(speed) 
    screen.onkey(right, "Right") 

def move_Ella(): 
    if Ella.pos() != Lewi.pos(): 
     Ella.setheading(Ella.towards(Lewi)) 
     Ella.forward(speed) 
    screen.ontimer(move_Ella, 200) 

screen.onkey(up, "Up") 
screen.onkey(down, "Down") 
screen.onkey(right, "Right") 
screen.onkey(left, "Left") 

screen.listen() 

screen.ontimer(move_Ella, 200) 

screen.mainloop() 

Я удалил вашу информацию изображений так, этот пример может быть запущен любым - вы можете легко положить ваши изображения обратно в код.

enter image description here

Если вы хотите Элла следовать точно такой же путь как Lewi, только в более медленном темпе, что тоже может быть сделано. Укажите это, и я обновлю пример.

+0

мой ella продолжает двигаться мимо меня, хе. –

+0

Есть несколько ошибок, с которыми я пытался выровняться. Например, Элла никогда не может находиться в тех же координатах, что и Льюи, потому что она указывает на угол, чтобы идти к нему, но движется с той же «скоростью». Это, однако, можно зафиксировать с помощью векторной формулы. Реальная проблема заключается в том, что Льюи не двигается так гладко, как в исходном коде, то есть если это было в игре, то было бы очень неприятно играть. Это похоже на лучшее рабочее решение, поэтому я обновлю, когда найду решение. Если вы найдете решение, пожалуйста, сообщите мне об этом. И спасибо BTW. –

+0

Нет, неважно, только что понял! Вам нужно, чтобы этот 'Lewi.speed (0)' был в начале кода (желательно после определения Lewi). «Скорость» в этом случае является функцией (скорость()) и ее не следует путать с переменной «скорость». –

 Смежные вопросы

  • Нет связанных вопросов^_^