检测 Python 海龟游戏中的碰撞

Rob*_*ark 3 python collision-detection turtle-graphics python-3.x python-turtle

我正在尝试制作一个红海龟追逐蓝海龟的Python游戏。当红海龟抓住蓝海龟时,我希望它在屏幕上显示“碰撞”,但它不起作用。当它碰撞时,什么也没有发生,并且给我一个错误“Turtle”对象不可调用”。

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()
Run Code Online (Sandbox Code Playgroud)

cdl*_*ane 5

这段代码似乎比实际编程更一厢情愿:

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!'
Run Code Online (Sandbox Code Playgroud)

海龟没有.rect()办法。您不能简单地is_collided_with()使用此语句向现有类添加方法def。没有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()
Run Code Online (Sandbox Code Playgroud)

我根据海龟光标的大小使用 10 作为碰撞半径,您可以根据需要进行调整。这段代码只是简单地结束游戏,并发出一条消息,当发生碰撞时,您可能想做一些更复杂的事情。您可以考虑将碰撞逻辑设置为其自己的函数,以便在每次击键后使用,以防跑步者意外撞到跟随者!