1

我正在 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
4

1 回答 1

2

突出的错误在这里:

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

levels.update(newLevels)

levelsnewLevels在循环的最后一次更新。(如果您在Python 调试器中单步执行此代码,您将能够轻松发现这一点。)

但总的来说,您的代码似乎太复杂了。您正在尝试搜索从根开始的级别图。那么为什么不使用简单的广度优先搜索算法呢?像这样:

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
于 2013-03-24T09:37:26.130 回答