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