在 Python 乌龟游戏中检测碰撞

新手上路,请多包涵

我正在尝试制作一个红海龟追逐蓝海龟的 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()

原文由 Robert Park 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 918
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 作为碰撞半径,您可以根据需要进行调整。这段代码简单地结束了游戏,并带有一条消息,当发生碰撞时,您可能想要做一些更复杂的事情。您可以考虑将碰撞逻辑设为自己的函数,以便在每次击键后使用,以防奔跑者不小心撞到跟随者!

原文由 cdlane 发布,翻译遵循 CC BY-SA 3.0 许可协议

我们在 Turtle 中有一个距离函数,假设 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,否则返回 False。

通过这种方式,追随者可以尝试追上一群海龟。希望这可以有所帮助。

原文由 Lars Tuff 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题