Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python海龟游戏中的碰撞检测_Python_Python 3.x_Turtle Graphics - Fatal编程技术网

Python海龟游戏中的碰撞检测

Python海龟游戏中的碰撞检测,python,python-3.x,turtle-graphics,Python,Python 3.x,Turtle Graphics,我正在尝试制作一个蟒蛇游戏,其中红海龟追逐蓝海龟。当红海龟抓住蓝海龟时,我希望它在屏幕上显示“碰撞”,但它不工作。当它发生碰撞时,什么也不会发生,它会给我一个错误“海龟”对象是不可调用的 from turtle import Turtle, Screen playGround = Screen() playGround.screensize(250, 250) playGround.title("Turtle Keys") run = Turtle("turtle") run.speed(

我正在尝试制作一个蟒蛇游戏,其中红海龟追逐蓝海龟。当红海龟抓住蓝海龟时,我希望它在屏幕上显示“碰撞”,但它不工作。当它发生碰撞时,什么也不会发生,它会给我一个错误“海龟”对象是不可调用的

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()

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

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\u collide\u 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()
从海龟导入海龟,屏幕
操场=屏幕()
操场。屏幕尺寸(250250)
游乐场名称(“海龟钥匙”)
跑=乌龟(“乌龟”)
运行颜色(“蓝色”)
run.penup()
运行设置位置(250250)
跟随=乌龟(“乌龟”)
跟随颜色(“红色”)
follow.penup()
跟随设定位置(-250,-250)
def k1():
向前跑(45)
def k2():
向左跑(45)
def k3():
跑,右(45)
def k4():
向后跑(45)
他的名字是:
操场,再见
def与(a,b)发生碰撞:
返回abs(a.xcor()-b.xcor())<10和abs(a.ycor()-b.ycor())<10
def follow_runner():
follow.setheading(跟向(运行))
跟车前进(最小(跟车距离(跑),8))
如果与碰撞(跟随,运行):
打印('冲突!')
退出他的()
其他:
操场。准时(跟随跑步者,10)
操场。ON键(k1,“向上”)#向上箭头键
操场。ON键(k2,“左”)#左箭头键
操场。安基(k3,“对”)#你明白了!
操场。上键(k4,“向下”)
操场,听
跟随跑步者
playerd.mainloop()
我使用10作为基于海龟光标大小的碰撞半径,您可以根据需要进行调整。这段代码只是以一条消息结束游戏,当发生碰撞时,您可能想做一些更复杂的事情。你可以考虑在每个击键之后使用碰撞逻辑来使用它,以防流氓意外地欺负跟随者!p>
def isCollision(t1,t2):
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
d=math.sqrt(math.pow(t1.xcor()-t2.xcor(),2)+math.pow(t1.ycor()-t2.ycor(),2)) 如果d<20: 返回真值 其他: 返回错误
我们有一个距离的函数,在Turtle中,我们假设turtle1在x1,y1,turtle2在x2,y2,那么距离将被计算为这两个点之间的数学xy距离

现在,假设turtle1的“半径”为r1,turtle2的半径为r2,如果距离小于这两个半径之和,我们可以通过切克来检查碰撞

所以我想检查一下就足够了
如果(r1+r2)这是我能想到的最简单的方法。只需像这样使用.pos()

from turtle import *

import turtle

screen = turtle.Screen()

screen.setup(1920, 1080)

blue = turtle.Turtle()

blue.shape = ('turtle')

blue.color = ('blue')


red = turtle.Turtle()

red.shape = ('turtle')

red.color = ('red')



collision = turtle.Turtle()

collision.hideturtle()



if blue.pos() == red.pos():

    collision.goto(0,0)

    collision.showturtle()

    collision.write("COLLISION")
jonny=Turtle()
玛丽=海龟()
如果(jonny.distance(marie)<15):
打印('Jonny punch marie')

也许您可以尝试检查
run
的位置是否与
follow
匹配?我在该代码中没有看到任何关于pygame的内容。如果您使用的是pygame,为什么不使用它的sprite功能并让pygame检测碰撞?为什么不简单:
返回t1.distance(t2)<20
海龟在浮点平面上游荡,因此
blue.pos()==red.pos()
作为一种策略最终会让您失败。(有关更好的方法,请参见
turtle.distance()
)在
write()
之前也不需要执行
showturtle()
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
from turtle import *

import turtle

screen = turtle.Screen()

screen.setup(1920, 1080)

blue = turtle.Turtle()

blue.shape = ('turtle')

blue.color = ('blue')


red = turtle.Turtle()

red.shape = ('turtle')

red.color = ('red')



collision = turtle.Turtle()

collision.hideturtle()



if blue.pos() == red.pos():

    collision.goto(0,0)

    collision.showturtle()

    collision.write("COLLISION")
jonny = Turtle()
marie = Turtle()


if (jonny.distance(marie) < 15):
 print('Jonny punch marie')