Pygame 随机地形生成
Pygame Random Terrain Spawning
我正在尝试创建一个游戏,其中 100 块岩石随机散布在大量坐标系中。问题是有时岩石可能会相互重叠。我想出的解决方案是检查岩石是否相互重叠,如果重叠,则一次又一次地为岩石创建新的随机生成坐标,直到它没有碰撞。我不完全确定该怎么做;我已经尝试检测岩石和岩石列表之间的碰撞,但最终发生的只是它认为它与自身发生碰撞并且总是 returns 为 True。 __init__
函数用 random.randint(-2500,2500)
生成坐标。在 for 循环中创建岩石时,每块岩石都会添加到列表中。在更新功能中,它检查岩石之间的矩形碰撞。我怎样才能解决这个问题?谢谢,将不胜感激。问我是否需要更多信息。
嗯,我想有几种方法可以解决这个问题:
1) 第一个是您已经使用过的,每次生成岩石时都会检查碰撞,如果存在碰撞,您将为给定的岩石重新生成一个位置
2) 第二种方法是将 "field" 切成岩石大小的矩形,就像瓷砖地图一样,因此创建一个可能的位置列表,如下所示:
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)
但是这种方法会牵涉到一组给定的可能位置,这些位置会形成 "uniform" 岩石分布
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([])
当然这段代码可能会产生错误(它是一段相当简单的代码)并且需要一些优化,但我认为你可以从中得到一般的想法。
抱歉我的英语不好
我正在尝试创建一个游戏,其中 100 块岩石随机散布在大量坐标系中。问题是有时岩石可能会相互重叠。我想出的解决方案是检查岩石是否相互重叠,如果重叠,则一次又一次地为岩石创建新的随机生成坐标,直到它没有碰撞。我不完全确定该怎么做;我已经尝试检测岩石和岩石列表之间的碰撞,但最终发生的只是它认为它与自身发生碰撞并且总是 returns 为 True。 __init__
函数用 random.randint(-2500,2500)
生成坐标。在 for 循环中创建岩石时,每块岩石都会添加到列表中。在更新功能中,它检查岩石之间的矩形碰撞。我怎样才能解决这个问题?谢谢,将不胜感激。问我是否需要更多信息。
嗯,我想有几种方法可以解决这个问题:
1) 第一个是您已经使用过的,每次生成岩石时都会检查碰撞,如果存在碰撞,您将为给定的岩石重新生成一个位置
2) 第二种方法是将 "field" 切成岩石大小的矩形,就像瓷砖地图一样,因此创建一个可能的位置列表,如下所示:
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)
但是这种方法会牵涉到一组给定的可能位置,这些位置会形成 "uniform" 岩石分布
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([])
当然这段代码可能会产生错误(它是一段相当简单的代码)并且需要一些优化,但我认为你可以从中得到一般的想法。
抱歉我的英语不好