【问题标题】:How am I to get all the connections?我如何获得所有连接?
【发布时间】:2013-03-24 02:00:16
【问题描述】:

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

【问题讨论】:

标签: python dictionary python-3.x pygame


【解决方案1】:

突出的错误在这里:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    • 2021-01-19
    相关资源
    最近更新 更多