2016-11-10 42 views
0

我正在用Python製作一款遊戲,其中一隻烏龜(稱爲Lewi)跟隨另一隻(稱爲Ella)。就目前而言,本場比賽的目標是Ella比Lewi略慢,應該跟隨Lewi。 Lewi按照箭頭鍵按下。如何讓Python龜停止試圖趕上它跟蹤的龜?

Ella確實跟隨Lewi,但問題是,如果你在Ella到達Lewi的位置之前按兩次或多次'right'鍵,然後讓她趕上他的位置,那麼她會開始回到她以前的所有位置,她沒能趕上Lewi,然後繼續前往她所錯過的所有Lewi職位。

艾拉不應該回溯她的步驟,那麼我該如何解決這個問題?這裏是代碼:

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

我的埃拉一直走過我,嘿。 –

+0

有一些我一直試圖平衡的錯誤。例如,Ella永遠不可能和Lewi坐在同一個座標上,因爲她指向一個角度朝向他,但卻以相同的「速度」移動。然而,這可以用矢量公式來修復。真正的問題在於,Lewi沒有像原始代碼那樣流暢,即如果這是在一場比賽中,那麼這將會讓人非常沮喪。它似乎是最好的工作解決方案,所以我會在找到解決方案時進行更新。如果你找到了解決方案,那麼請讓我看看。並謝謝順便說一句。 –

+0

不,不要,只是想通了!你需要在代碼的開始處有這個'Lewi.speed(0)'(最好在定義Lewi之後)。這種情況下的「速度」是一個函數(速度()),不應與變量「速度」混淆。 –