1

我目前正在尝试用纯 python 编写基于文本的冒险。因此,我有一个 Room 类,看起来有点像这样(缩短):

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() 方法。我需要一个映射器存储在那里,以根据对象的状态(打开/关闭)找出正确的图像,如果我把这个映射器放在方法的开头,每次方法都是由 python 读取和构造这个字典叫,对吗?那么我是否应该将此映射器字典存储为实例变量,如 self.img_mapper_dict = {(0, 0, 0) : 0, ...}?

也许有人对此有任何想法?

4

3 回答 3

0

我认为您遇到的问题是每次调用时img_mapper都会重置为指定状态。这是因为成员函数有自己的作用域,所以当它完成时它会被删除,并且下次调用更新函数时必须重新制作它。存储为成员变量将摆脱这个问题。 update_image()img_mapper

于 2015-05-29T23:51:38.700 回答
0

您正确地假设当前代码的结构方式IMAGE_MAPPER将分配给每次update_image()调用该方法时。

现在,由于这是一个不会随时间变化的静态映射,因此从功能的角度来看这不是问题 - 这不像您要重置一个应该在调用update_image().

在性能方面,在这种特殊情况下,缺点也绝对可以忽略不计。

但从纯逻辑的角度来看,将这个映射作为类属性可能是有意义的:

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-30T00:08:22.437 回答
0

我看到的第一个问题是您的 IMG_MAPPER 字典具有三元组键。但是您通过提供一个二元组来访问它。

于 2015-05-30T00:09:38.900 回答