2017-04-18 148 views
2

我想製作一個Python遊戲,其中紅龜追逐藍龜。當紅龜抓到藍龜時,我想讓它在屏幕上說'COLLISION',但它不起作用。當它碰撞時,沒有任何反應,它給了我一個錯誤'烏龜'對象不可調用'。在Python龜遊戲中檢測碰撞

from turtle import Turtle, Screen 

playGround = Screen() 

playGround.screensize(250, 250) 
playGround.title("Turtle Keys") 

run = Turtle("turtle") 
run.speed("fastest") 
run.color("blue") 
run.penup() 
run.setposition(250, 250) 

follow = Turtle("turtle") 
follow.speed("fastest") 
follow.color("red") 
follow.penup() 
follow.setposition(-250, -250) 

def k1(): 
    run.forward(45) 

def k2(): 
    run.left(45) 

def k3(): 
    run.right(45) 

def k4(): 
    run.backward(45) 

def quitThis(): 
    playGround.bye() 

def follow_runner(): 
    follow.setheading(follow.towards(run)) 
    follow.forward(8) 
    playGround.ontimer(follow_runner, 10) 

playGround.onkey(k1, "Up") # the up arrow key 
playGround.onkey(k2, "Left") # the left arrow key 
playGround.onkey(k3, "Right") # you get it! 
playGround.onkey(k4, "Down") 

playGround.listen() 

follow_runner() 

def is_collided_with(self, run): 
    return self.rect.colliderect(run.rect) 

runner = run(10, 10, 'my_run') 
follower = follow(20, 10) 
if follow.is_collided_with(run): 
    print 'collision!' 

playGround.mainloop() 
+0

也許你可以嘗試檢查'run'的位置是否與'follow'匹配? – aug

+0

我在關於pygame的代碼中看不到任何東西。如果你正在使用pygame,爲什麼不使用它的精靈功能,讓pygame檢測碰撞? –

回答

2

此代碼似乎更一廂情願比實際的編程:

def is_collided_with(self, run): 
    return self.rect.colliderect(run.rect) 

runner = run(10, 10, 'my_run') 
follower = follow(20, 10) 
if follow.is_collided_with(run): 
    print 'collision!' 

海龜沒有.rect()方法。您不能簡單地使用此def語句將is_collided_with()方法添加到現有類。沒有run()follow()功能。這個碰撞測試只會在每次運動後需要時執行一次。讓我們試着挽救我們所能,使這項工作:

from turtle import Turtle, Screen 

playGround = Screen() 

playGround.screensize(250, 250) 
playGround.title("Turtle Keys") 

run = Turtle("turtle") 
run.color("blue") 
run.penup() 
run.setposition(250, 250) 

follow = Turtle("turtle") 
follow.color("red") 
follow.penup() 
follow.setposition(-250, -250) 

def k1(): 
    run.forward(45) 

def k2(): 
    run.left(45) 

def k3(): 
    run.right(45) 

def k4(): 
    run.backward(45) 

def quitThis(): 
    playGround.bye() 

def is_collided_with(a, b): 
    return abs(a.xcor() - b.xcor()) < 10 and abs(a.ycor() - b.ycor()) < 10 

def follow_runner(): 
    follow.setheading(follow.towards(run)) 
    follow.forward(min(follow.distance(run), 8)) 

    if is_collided_with(follow, run): 
     print('Collision!') 
     quitThis() 
    else: 
     playGround.ontimer(follow_runner, 10) 

playGround.onkey(k1, "Up") # the up arrow key 
playGround.onkey(k2, "Left") # the left arrow key 
playGround.onkey(k3, "Right") # you get it! 
playGround.onkey(k4, "Down") 

playGround.listen() 

follow_runner() 

playGround.mainloop() 

我用10基於龜光標的大小碰撞半徑,你可以調整你認爲合適的。這段代碼只是簡單地結束遊戲,發出一條消息,當發生碰撞時,您可能想要做更復雜的事情。您可以考慮在每次擊鍵後使衝突邏輯具有自己的功能,以防跑步者意外撞擊跟隨者!

0
def isCollision(t1, t2): 
    d = math.sqrt(math.pow(t1.xcor()-t2.xcor(),2) + math.pow(t1.ycor()-t2.ycor(),2)) 
    if d < 20: 
     return True 
    else: 
     return False 
+0

爲什麼不簡單地說:'return t1.distance(t2)<20' – cdlane

+0

謝謝!!!!!!!!! – 2018-02-02 00:18:46

1

我們在龜距離的功能,讓我們說turtle1是X1,Y1和turtle2是X2,Y2,那麼距離將被計算爲這兩個點之間的數學XY距離。

現在我們假設turtle1的半徑爲r1,turtle2的半徑爲r2,如果距離小於這兩個半徑的和,我們可以通過chencking檢查碰撞。

所以我覺得就足夠了檢查 如果(R1 + R2)< = turtle1.distance(turtle2.pos())

這些半徑可以設置爲這樣:turtle1.r = 10 ,turtle2.r = 5,或者作爲全局變量,r1 = 10,r2 = 5。如果最後一個選項適用,請記住def中的全局關鍵字。

用於檢查與給定的龜,turtle1和一個海龜列表的碰撞,比如說turtles = [jim,ben,kate,jane],並且所有的海龜都有一個半徑爲r的域,您可以迭代這個列表,檢查是否turtle1相撞,其中任何一個:

collsion=False 
for turtle in turtles: 
    if (turtle.r+turtle1.r)<=turtle1.distance(turtle.pos()): 
     collision=True 
     # turtle.reset() # removes the turtle 
     # points+=1, or whatever 

我們使這最後一個函數:

def group_collide(t1,group): 
    global points 
    turtle1=t1 
    collide=False 
    for turtle in group: 
     if (turtle.r+turtle1.r)<=turtle1.distance(turtle(pos)): 
      collide=True 
      turtle.reset() 
      points+=1 
    # if needed: 
    return collide 

這將檢測是否turtle1相撞任何組中,除去龜turtle1相撞,然後加1到全局點,然後,如果需要,返回True if碰撞發生,否則爲假。

這樣的追隨者可以試圖超過一羣烏龜。希望這可以有所幫助。