繁体   English   中英

Python-有效检查列表中的每个项目与其他所有项目

[英]Python - Checking every item in a list against every other item efficiently

我正在开发一个游戏,其中每个对象都应检查它是否与任何其他对象发生碰撞。 我有一个所有对象的清单,还有一个函数可以确定两个对象是否碰撞并销毁它们。 我正在使用的当前方法效率很低。

for i in list1:
    for j in list1:
        if collide(i, j):
            i.kill()
            j.kill()

最初,两个对象被杀死后,我将它们从列表中删除,但是发生了一些碰撞,没有检测到,因此我恢复了此代码。 它可以工作,但是我想要更有效的方法。

首先,这要测试两次,并且还要测试一个对象是否与自身碰撞:

for i in list1:
    for j in list1:
        if collide(i, j):
            i.kill()
            j.kill()

这将精确地循环len(list1)**2次。

一种非常简单的方法将测试次数除以2(并避免针对自身进行测试):

for i,obj1 in enumerate(list1):
   for j in range(i+1,len(list1)):
      obj2 = list1[j]
      if collide(obj1,obj2):
         obj1.kill()
         obj2.kill()

它利用了collide(obj1,obj2)collide(obj2,obj1)相同的事实。

此时,由于obj1现在已死,您可能想break内部循环。 但这取决于您想要做什么。

如果准确的碰撞测试很昂贵,则可以考虑进行更粗略的检查(距离,矩形边界,任何快速方法),因此可以丢弃彼此相距太远的项目而无需执行“昂贵”的测试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM