Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.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 在pygame中创建随机唯一向量_Python_Pygame - Fatal编程技术网

Python 在pygame中创建随机唯一向量

Python 在pygame中创建随机唯一向量,python,pygame,Python,Pygame,我想创建网格上随机的单元,这些单元是唯一的(即没有单元彼此重叠),并且是连接的(因此没有单元可以自由浮动)。我使用vector2表示每个单元格的位置,并且在位置0,0处始终有一个单元格 以下是我提出的函数: def create_cells(number_of_cells): cell_grid = [] cell_grid.append(pygame.math.Vector2(0,0)) while len(cell_grid) < number_of_cell

我想创建网格上随机的单元,这些单元是唯一的(即没有单元彼此重叠),并且是连接的(因此没有单元可以自由浮动)。我使用vector2表示每个单元格的位置,并且在位置0,0处始终有一个单元格

以下是我提出的函数:

def create_cells(number_of_cells):
    cell_grid = []
    cell_grid.append(pygame.math.Vector2(0,0))

    while len(cell_grid) < number_of_cells: 
        new_cell = random.choice(cell_grid).xy 
        new_cell[random.choice((0,1))] += random.choice((-1,1)) 
        for existing_cell in cell_grid: 
            if new_cell != existing_cell:
                cell_grid.append(new_cell)

    return cell_grid
def创建单元(单元数):
单元格网格=[]
单元格网格追加(pygame.math.Vector2(0,0))
而len(单元网格)<单元数量:
新建单元格=随机。选择(单元格网格)。xy
新的_单元[random.choice((0,1))]+=random.choice(-1,1))
对于单元网格中的现有单元:
如果是新的_单元!=现有的_单元:
单元格网格追加(新单元格)
返回单元网格
我基本上选择一个现有的单元格,移动一个单位,然后如果新单元格是唯一的,只将其附加到单元格网格中


但是for循环似乎没有删除重复项,我以大量重叠单元格结束,我似乎无法理解为什么会发生这种情况。

Edit 2:我在“Edit 2”的末尾添加了对OP错误的解释

这并不能解决您所问的bug,但我将建议一种更好的方法来解决您的问题

我建议您保留一个单元格边列表,其中没有相邻单元格,然后从该列表中随机选择一个条目。添加新单元后,删除该边,并从新添加的单元中添加尚未相邻单元的任何新边

这似乎比尝试各种方法更好、更快,直到你得到一个不会发生冲突的方法,因为唯一的选择是成功的方法

实际上,跟踪开放的相邻单元而不是自由边可能是有意义的,但这或多或少是一样的

我是否遗漏了排除这一点的问题

编辑:
这两种方法之间的一个显著区别是,您的解决方案在单元格之间随机选择,而我的建议是在开放边之间选择。您将对具有一条开放边的单元格和具有三条开放边的单元格进行同等权重的选择,我的建议是选择具有三条开放边的单元格的可能性的三倍(因为它是在自由边中进行选择)。根据您希望瓷砖的放置方式,这种差异可能很重要

编辑2:
我查看了您的代码,这部分有问题:

对于单元网格中的现有单元:
如果是新的_单元!=现有的_单元:
单元格网格追加(新单元格)
首先,您不应该迭代列表并同时更改该列表。这会把迭代搞得一团糟。如果从列表中删除项目,情况尤其糟糕,但如果添加到列表中,情况也很糟糕。在本例中,当我运行代码时,它将
新单元格
添加到
单元格网格
列表的末尾,然后在到达末尾时,将
for
循环自身选中
单元格网格

其次,在添加前,您不会检查列表中是否有
new_cell

检查它是否与列表中的每个条目不相同,并在每次不相同时添加它。因此,假设在第三遍中,列表中有
(0,0)
(1,0)
,它选择
(0,-1)
新单元格。它会将它与
(0,0)
进行比较,看它不是那样,然后将
(0,-1)
添加到列表中,然后将它与
(1,0)
进行比较,看它不是那样,然后再次将
(0,-1)
添加到列表中。随着列表变大,它将向列表中添加更多的
new_cell

最大的问题是,即使条目已经在列表中,它也会添加条目,因为它会为每个不匹配的条目添加条目,并且只会为匹配的比较添加条目。让我们继续上一个示例,其中它现在有
新的
=
[(0,0),(1,0),(0,-1),(0,-1)]
,现在它选择一个
新的
单元格
(0,0)
。它将与第一个条目匹配,因此不会添加它,但随后将继续处理其余不匹配的条目,并为其他每个条目添加4次

你不只是在做以下事情,有什么原因吗

如果新单元不在单元网格中:
单元格网格追加(新单元格)
这是可行的,尽管它仍然花费大量时间尝试列表中已经存在的单元格,而不是添加它们。列表越大,匹配的可能性越大,情况就越糟


保留一个有效选项的列表,并按照上面的建议从中进行选择,从这个角度来看效果会更好。

有趣的方法!我的理由是我只需要一小部分细胞,最多50个,这似乎是一个不错的方法……非常感谢。老实说,我现在觉得自己很傻,因为不只是使用你的方法,它要优雅得多!