繁体   English   中英

重嵌套循环中的随机生成

[英]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_arraylevel_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.

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