我正在开发我的游戏,并且已经创建了一个关卡类,但是我的parselevel()方法不会让我解析关卡,因为“Block”不是一个全局变量(Block是我的块类)。 / p>
我该怎么做?我可以将Block和Player传递给parseLevel方法吗?
Traceback (most recent call last):
File "C:\Users\Benjamin\Documents\GitHub\ShipGame\level.py", line 3, in <module>
from entity import *
File "C:\Users\Benjamin\Documents\GitHub\ShipGame\entity.py", line 5, in <module>
from blocks import *
File "C:\Users\Benjamin\Documents\GitHub\ShipGame\blocks.py", line 4, in <module>
from level import *
File "C:\Users\Benjamin\Documents\GitHub\ShipGame\level.py", line 4, in <module>
from blocks import Block
ImportError: cannot import name Block
我的代码:
import pygame
from entity import *
from blocks import *
# Holds the level layout in a list of strings.
levelMap = [
"WWWWWWWWWWWWWWWWWWWW",
"WX W",
"W W",
"W P W",
"W W",
"W W",
"W W",
"W W",
"W W",
"W W",
"W W",
"W W",
"W P W",
"W W",
"WWWWWWWWWWWWWWWWWWWW",
]
class Level(object):
def __init__(self, levelMap):
self.levelMap = levelMap
def parseLevel(self):
x = 144
y = 0
for row in self.levelMap:
for col in row:
if col == "W":
Block((x, y))
if col =="P":
Port((x, y))
if col == "X":
player = Player((x, y), 1, "Player1", 1, 0)
x += 32
y += 32
x = 144
level = Level(levelMap)
level.parseLevel()
答案 0 :(得分:3)
回溯显示您有循环导入问题。当您有一个语句from foo import *
时,Python必须立即完成加载foo
(以便它可以计算出所有导入的名称)。但这意味着:
level.py
执行from entity import *
,entity
必须在level
之前加载; entity.py
执行from blocks import *
,blocks
必须在entity
之前加载; blocks.py
执行from level import *
,level
必须在blocks
之前加载。显然这不起作用!
您真正应该做的是重新组织您的代码,以便每个模块不需要了解所有其他模块。 (例如,为什么blocks
需要了解level
?)
但如果您遇到问题,可以通过打破圈子来解决问题,例如编写import level
而不是from level import *
。显然,你必须写level.foo
而不是foo
,但这应该很容易。
(这可行,因为import foo
尚未完成加载foo
。)
有关循环导入的详情,请参阅this entry in the Python FAQ。