目前,我正试图在纯python中编写基于文本的冒险代码。因此,我有一个教室,看起来有点像这样(简称):
class Room1(Room):
def __init__(self):
Room.__init__(self)
self.init_objects()
self.description = """Looks like a living room. There's a lamp, a
cupboard, and
a door to your right. On the floor, there's a carpet."""
self.door_state = 1
self.carpet_state = 0
self.images = [(text-based images)]
def init_objects(self):
self.objects = {"door" : Door1(),
"frontdoor" : FrontDoor(),
"carpet" : Carpet(),
"lamp" : Lamp1(),
"clock" : Clock(),
"escritoire" : Escritoire(),
"booklet" : Booklet(),
"screws" : Screws(),
"trapdoor" : TrapDoor()}
def update_image(self):
IMG_MAPPER = {(0, 0, 0) : 0,
(0, 0, 1) : 1,
(1, 0, 0) : 2,
(1, 0, 1) : 3,
(1, 1, 1) : 4,
(1, 1, 0) : 5,
(0, 1, 1) : 6,
(0, 1, 0) : 7}
key = (self.objects["door"].state, self.objects["carpet"].state)
self.img = img_mapper[key]我的问题在于Room的update_image()方法。我需要一个映射器存储在那里,根据对象的状态(打开/关闭)找出正确的图像,如果我把这个映射器放在方法的开头,这个dict就会在每次调用方法时由python读取和构造,对吗?那么,我是否应该将这个mapper存储为一个实例变量,比如self.img_mapper_dict = {(0,0,0):0,.}?
有人对此有什么看法吗?
发布于 2015-05-30 00:08:22
假设当前代码的结构方式是正确的,IMAGE_MAPPER将被分配给每次调用update_image()方法时。
现在,由于这是一个静态映射,不会随着时间的推移而改变,从功能的角度来看,这并不是一个问题--并不是要重置应该在调用update_image()之间跟踪的值。
就性能而言,在这种情况下,缺点也是绝对可以忽略不计的。
但是,从纯粹逻辑的角度来看,将此映射设置为class attribute可能是有意义的。
class Room1(Room):
IMG_MAPPING = {(0, 0, 0) : 0,
(0, 0, 1) : 1,
(1, 0, 0) : 2,
(1, 0, 1) : 3,
(1, 1, 1) : 4,
(1, 1, 0) : 5,
(0, 1, 1) : 6,
(0, 1, 0) : 7}
def __init__(self):
# ...
def update_image(self):
# ...
self.img = Room1.IMG_MAPPING[key]我建议使用类属性,而不是实例属性(或实例成员),因为对于所有Room1实例,映射将保持不变(对吗?我假设Room1的每个实例都有完全相同的布局,只是不同的门状态等等)。因此,它不依赖于实例的任何状态,而是类的属性。
还请注意,类属性的访问方式不同:Room1.IMG_MAPPING而不是self.IMG_MAPPING。这也反映了一个事实,即它不依赖于实例。
发布于 2015-05-29 23:51:38
我认为您遇到的问题是,每次调用img_mapper 时,都会将其重置为指定的状态update_image()。这是因为成员函数有它自己的作用域,所以当它完成时,它会删除img_mapper,并在下次调用update函数时必须重新创建它。将其存储为成员变量可以解决此问题。
发布于 2015-05-30 00:09:38
我看到的第一个问题是您的IMG_MAPPER dict有三个元组键。但是你是通过提供两个元组来访问它的。
https://stackoverflow.com/questions/30540676
复制相似问题