2012-05-13 48 views
1

我是一个新的年轻程序员,我正在学习python。我只是制作一个示例程序来学习如何制作更大的程序。什么是最有效的方法来跟踪碰撞

class Robot(): 

    def __init__(self): 
     self.xpos = 0 
     self.ypos = 0 

    def step(self, axis): 
     print "step" 
     if axis in "xX": 
      self.xpos += 1 
     elif axis in "yY": 
      self.ypos += 1 

    def walk(self, axis, steps=2): 
     for i in range(steps): 
      self.step(axis) 

    def get_pos(self): 
     print "X:%i Y:%i" % (self.xpos, self.ypos) 


robot = Robot() 
robot.walk("x", steps=3) 

所有这些都是跟踪单个机器人的位置。我如何保持跟踪,如果我有两个机器人,如果他们在同一个位置。

例子:

robot1 = Robot() 
robot2 = Robot() 
robot1.walk("x",5) 
robot2.walk("x",5) 

他们会在同一个位置,所以我会怎么检查,看是否有机器人在同一地点?

+0

这通常是通过使用树来划分存在对象的空间来完成的,这样可以更高效地查找冲突。请参阅:[quadtrees(2d)](http://en.wikipedia.org/wiki/Quadtree)和[octrees(3d)](http://en.wikipedia.org/wiki/Octree)。 –

+0

我看到了那些在我的书结束,但我还没有得到那么多。我以为我只需要在__init__上发布数组,并且以这种方式跟踪它 –

回答

0

如果你创建了Map一类,它是简单的写检查所有机器人的位置的方法:

class Map: 
    def __init__(self): 
     self.robots = [] 

    def add_robot(self, robot): 
     self.robots.add(robot) 

    def is_occupied(self, x, y): 
     for r in self.robots: 
      if r.xpos == x and r.ypos == y: 
       return True 
     return False 

这有让许多其它操作的优势,你可能想在执行例如,你可以知道路径是否清晰。顺便提一下,您可能想要在每个机器人上引用一个对其所在地图的引用(可以通过add_robot方法进行设置,以便机器人可以在您拨打move时确定其移动是否可行方法

+0

这就是我一直在寻找的东西。我希望能够制作一个二维数组来模拟含有阻塞物的土地,并且该程序表示,如果您移动时,如果您变得越来越热或变得更加适合特定位置。非常感谢! –

+0

ETA:无视最后一条评论:-) –

+0

尽管对于简单的碰撞检查,这是O(N),只是使用带有正确散列和等号函数的散列表才能在O(1)中工作。取决于用例和我们谈论的机器人数量。对于说低于10.000这是没有问题:) – Voo

3

我认为你需要像Room()或CoordinateSystem()这样的另一个类,或者是持有对所有Robot对象的引用的东西。然后你可以有一个叫做Room的类方法,占用,返回该位置是否被占用。

0

虽然创建一个容器来容纳所有机器人的信息当然是检查碰撞的一种方法,但您仍然需要做的底层检查是对每个机器人(x,y)进行相等性测试。

因此,以最简单的形式,您可以通过简单的AND'ed相等性测试进行检查,然后创建一个函数来容纳它:

def check_collision(r1, r2): 
    if r1.x == r2.x and r1.y == r2.y: 
     return True 
    return False  

然后可以修改这种功能,以便添加到机器人类或新的地图/房间类。

相关问题