Python中的碰撞检测

时间:2015-01-22 17:11:30

标签: python-3.x ipython-notebook

我正在制作一款用iPython notbook编写的迷宫游戏。我无法访问pygame,因此从头开始进行colission检测。

我到目前为止所获得的代码能够移动玩家并且已经存在一个网格,以确定该游戏区的大小。

from turtle import *

def line(x1, y1, x2, y2):
    pu()
    goto(x1,y1)
    pd()
    goto(x2,y2)
    pu()


setup(600,600)
setworldcoordinates(-1,-1,11,11)

class Network:

tracer(30)
ht()
for n in range(0,11):
    line(0,n,10,n)
    line(n,0,n,10)

tracer(1)

head= heading()

st()

class Figur:

register_shape("figur.gif")
shape("figur.gif")

head = heading()
pu()
setpos(9.5,9.5)

def turtle_up():
    if head != 90:
        seth(90)
        fd(1)

def turtle_down():
    if head != 270:
        seth(270)
        fd(1)

def turtle_left():
    if head != 180:
        seth(180)
        fd(1)

def turtle_right():
    if head != 360:
        seth(0)
        fd(1)

onkey(turtle_up, "Up")
onkey(turtle_down, "Down")
onkey(turtle_left, "Left")
onkey(turtle_right, "Right")

listen()

class Walls:

    def tortle():
        tracer(30)
        t1 = Turtle()
        t1.color("green")
        t1.left(180)
        t1.fd(1)
        t1.right(90)
        t1.fd(11)
    for i in range(1,4):
        t1.right(90)
        t1.fd(12)
    for i in range(1,3):
        t1.right(90)
        t1.fd(1)
    t1.left(90)
    for i in range(1,5):
        t1.fd(10)
        t1.right(90)

Walls.tortle() 
tracer(1)

update()
done()

目前,墙壁已经无法完成。我刚刚开始他们并尝试在竞争场地周围创建一堵墙,导致洞区被绿色覆盖。乌龟的照片是我自己制作的,但我认为它应该可以在没有它的情况下工作,而只需要使用普通乌龟。

所以我的主要问题是:如何为我的乌龟创建裂片检测,使其无法通过墙壁?

1 个答案:

答案 0 :(得分:0)

我会考虑制作已经访问过的set Vec2D个点,然后在每次移动时进行比较。这是一个简单的前进和后退功能:

def no_collision_forward(amount, walls):
    movement = 1 if abs(amount) == amount else -1 # If amount is negative, moving down
    for i in range(abs(amount)):
        cur_pos = pos()
        nex_pos = Vec2D(cur_pos[0], cur_pos[1] + movement)
        if nex_pos in walls:
            return  # Can return whatever
        else:
            forward(movement)

def no_collision_backward(amount, walls):
    return no_collision_forward(-amount, walls)

visited_locations应该是一组Vec2D或元组。

这可能不是最有效的解决方案,但它有效!