[英]Random generation in heavily nested loops
我有一个小游戏正在为一个学校项目制作,直到现在为止都已经完成了。
我为多个屏幕使用了一个非常混乱的嵌套列表系统,每个系统都有一个用于屏幕上对象的2D数组。 这些2D“级别”阵列也排列在它们自己的2D阵列中,从而构成“世界”。 这些字符串对应于使用pygame绘制的对象图块。
我的问题是world array
中的每个level
数组都是相同的,我不明白为什么这样。
def generate_world(load):
# This bit not important
if load is True:
in_array()
# This is
else:
for world_y in Game_world.game_array:
for world_x in world_y:
generate_clutter(world_x)
print Game_world.game_array
out_array()
# Current_level.array = Level.new_level_array
def generate_clutter(world_x):
for level_y in world_x:
for level_x, _ in enumerate(level_y):
### GENERATE CLUTTER ###
i = randrange(1, 24)
if i == 19 or i == 20:
level_y[level_x] = "g1"
elif i == 21 or i == 22:
level_y[level_x] = "g2"
elif i == 23:
level_y[level_x] = "c1"
else:
level_y[level_x] = "-"
我敢肯定,这是我所忽略的简单事情,但是对我来说,似乎应该对每个列表项分别进行随机生成,因此我无法理解重复项。
我知道四重嵌套列表并不漂亮,但是我想我现在做不到任何严重的更改。
编辑:
这是列表/数组最初创建方式的要点。 它们的大小永远不会改变,仅替换现有的字符串。
class World:
def __init__(self, name, load):
if load is False:
n = [["-" for x in range(20)]for x in range(15)]
self.game_array = [[n, n, n, n, n, n, n],
[n, n, n, n, n, n, n],
[n, n, n, n, n, n, n]]
在Python中,所有东西都是对象-甚至是整数值。 您如何初始化“空”数组可能会产生一些令人惊讶的结果。
考虑以下初始化:
>>> l=[[1]*2]*2
>>> l
[[1, 1], [1, 1]]
您似乎已经创建了一个2x2矩阵,每个像元包含值1
。 实际上,您已经创建了两个列表的列表(每个列表包含[1,1]
)。 更深入地讲,您已经创建了一个包含两个引用的列表,这些列表指向一个列表[1,1]
。
如果您现在修改其中一个单元格,则可以看到此结果
>>> l[0][0]=2
>>> l
[[2, 1], [2, 1]]
>>>
请注意, l[0][0]
和l[1][0]
均被修改。
为了避免这种影响,您需要跳过一些箍
>>> l2 = [[1 for _ in range(2)] for _ in range(2)]
>>> l2
[[1, 1], [1, 1]]
>>> l2[0][0]=2
>>> l2
[[2, 1], [1, 1]]
>>>
如果您使用前一种方法初始化Game_world.game_array
对level_y[level_x]
每次分配都会修改数组中的多个单元。
就像其他注释一样,可以使用dict
稍微简化您的generate_clutter
函数
def generate_clutter(world_x):
clutter_map = {19:"g1", 20:"g1", 21:"g2", 22:"g2", 23:"c1"}
for level_y in world_x:
for level_x, _ in enumerate(level_y):
level_y[level_x] = clutter_map.get(randrange(1,24),'-')
这将选择混乱表述的逻辑与实际值映射分开,并且将更容易扩展和维护。
查看您的编辑,初始化需要类似以下内容:
self.game_array = [
[
[
["-" for x in range(20)]
for x in range(15)
]
for x in range(7)
]
for x in range(3)
]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.