2017-04-18 198 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碰撞发生,否则为假。

这样的追随者可以试图超过一群乌龟。希望这可以有所帮助。