我怎么得到所有的联系?

时间:2013-03-24 02:00:16

标签: python dictionary python-3.x pygame

我正在pygame中创建一个平台,其中的关卡是相互连接的。 (一个级别是一个屏幕,您通过离开屏幕移动到下一个级别。)

我目前已经知道它在离开屏幕后从它的文件加载连接级别,但这显然很慢,因此我想预加载所有级别。我想通过获取一个根级别,获得它所连接的所有级别,获得每个级别的所有级别都连接到等等,直到我拥有所有级别。

我写这段代码是为了这样做,但它不起作用。我累的时候写的。谁能帮我这个?如有必要,我会回答任何其他问题。

def loadLinkedLevels(level, surface, ignoredIds = []):
    levels = {}

    for levelId in level.warps.values():
        if levelId and levelId not in ignoredIds:
            levels[levelId] = LevelBuilder.loadLevel(levelId, surface)

    return levels

def getBranchingLevels(levels, p):
    newLevels = True # Do-while

    while newLevels:
        for level in levels.values():
            newLevels = loadLinkedLevels(level, p.screen, levels.keys())

        levels.update(newLevels)

        return levels

def preloadLevels(rootLevel, p):
    levels = loadLinkedLevels(rootLevel, p.screen)
    newLevels = {}

    for level in levels.values():
        newLevels.update(loadLinkedLevels(level, p.screen, levels.keys()))

    levels.update(newLevels)

    levels.update(getBranchingLevels(levels, p))

    return levels

1 个答案:

答案 0 :(得分:2)

突出的错误在于:

for level in levels.values():
    newLevels = loadLinkedLevels(level, p.screen, levels.keys())

levels.update(newLevels)

levels仅在最后一次循环时使用newLevels进行更新。 (如果你在Python debugger中逐步完成了这段代码,你本可以很容易地发现这一点。)

但总的来说,你的代码看起来太复杂了。您正在尝试搜索从根开始的级别图。那么为什么不使用简单的breadth-first search算法呢?像这样:

from collections import deque

def load_all_levels(root, p):
    """Load all levels reachable from `root`.
    Return a dictionary mapping level id to level.
    """
    # Queue of levels that have been loaded but whose neighbours have not.
    q = deque([root])
    # Map from level id to level for all levels loaded so far.
    loaded = {root.id: root}
    while q:
        for level_id in q.popleft().warps.values():
            if level_id not in loaded:
                level = LevelBuilder.loadLevel(level_id, p.screen)
                loaded[level_id] = level
                q.append(level)
    return loaded