随机放置如何避免碰撞?

问题描述 投票:0回答:1

我试图将 100 块石头随机散布在一系列坐标上。有时岩石重叠。如果他们这样做,我想创建新的坐标,直到它不再发生碰撞。如何做到这一点?

我尝试过检测碰撞,但它总是返回 True。

__init__
使用
random.randint(-2500,2500)
生成坐标。当在 for 循环中创建岩石时,每个岩石都会添加到列表中。在更新函数中,它检查矩形碰撞。我该如何解决这个问题?

python pygame terrain
1个回答
1
投票

嗯,我想有几种方法可以解决这个问题:

1)第一个是您已经使用过的,每次生成岩石时您都会检查碰撞,如果存在碰撞,您将为给定的岩石重新生成位置

2)第二个是将你的“田地”切成岩石大小的矩形,就像瓷砖地图一样,因此创建一个可能位置的列表,如下所示:

possible_positions = [(i, j) for i in range(x_size_field//x_size_rock) for j in range(y_size_field//y_size_rock)]
for i in range(n_of_rocks):
    rock_pos = random.choice(possible_positions)
    possible_positions.remove(rock_pos)

但是这种方法会涉及一组给定的可能位置,从而形成“均匀”的岩石分布

3)因此,如果确实有必要将岩石放在绝对随机的位置,您可以创建一个可能位置的列表,如下所示:

possible_positions = [[(i, j) for j in range(y_size_field-y_size_rock)] for i in range(x_size_field-x_size_rock)]
for i in range(n_of_rocks):
    # X and Y represente positions on the list not on the field
    x = random.randint(0, len(possible_positions))
    y = random.randint(0, len(possible_positions[x]))

    # The rock positions
    rock_pos = possible_positions[x][y]

    # Now we remove the positions on the region of the new rock
    for i in range(x,x+x_size_rock):
        possible_positions[i] = possible_positions[i][0:y] + possible_positions[i][y+y_size_rock:-1]

    if [] in possible_positions:
        possible_positions.remove([])

当然,这段代码可能会产生错误(这是一个相当简单的代码),并且需要一些优化,但我认为您可以从中得到一般的想法。

对不起我的英语

© www.soinside.com 2019 - 2024. All rights reserved.