变量之间的关系

时间:2014-10-13 02:59:03

标签: python oop dictionary

我正在创建一个简单的游戏来了解有关OOP的更多信息。我们的想法是拥有一套由主要方向排列的房间,即'n','sw'等。我已经定义了一个房间类,并考虑使用字典来跟踪房间之间的关系,但是此方法不起作用,因为字典中的值是字符串,而不是与位置关联的实际变量:

class Room(object):
    def __init__(self,name,exits):
        self.name = name
        self.exits = exits

## Create the "map"
warehouse = Room("warehouse",{'n':'house','w':'pond'})
pond = Room("pond",{'e':'warehouse'})
house = Room("house",{'s':'warehouse'})

定义这些Room对象之间关系的最佳方法是什么?我知道那里有专门为游戏设计的模块/工具,但更多的是要了解对象在基本层面的工作方式。

2 个答案:

答案 0 :(得分:2)

作为一种非常天真的方式,您可以将World的概念定义到您的程序中,并让它跟踪字典中的房间,如下所示:

class Room(object):
    def __init__(self, name, exits):
        self.name = name
        self.exits = exits


class World(object):
    def __init__(self):
        self.rooms = {}

    def add_room(self, name, exits):
        self.rooms[name] = Room(name, exits)

    def move_from(self, room_name, exit):
        from_room = self.rooms[room_name]
        to_room = self.rooms[from_room.exits[exit]]

        print("You moved from %s to %s." % (from_room.name, to_room.name))
        # return the destination room.
        return to_room

请注意,World类提供了一个辅助方法来添加房间并按名称跟踪所有房间,然后move_from方法将获取该名称,获取房间并解决退出并在返回目的地房间之前打印一个有用的输出,然后可以使用。示例用法:

world = World()
world.add_room("warehouse", {'n': 'house', 'w': 'pond'})
world.add_room("pond", {'e': 'warehouse'})
world.add_room("house", {'s': 'warehouse'})

# Say we start from pond, remember the room that it returns
current_room = world.move_from('pond', 'e')
# then move from the room we remembered from, and see where north goes
next_room = world.move_from(current_room.name, 'n')

运行它,我们得到这个输出:

You moved from pond to warehouse.
You moved from warehouse to house.

当然,这真的很天真,没有错误检查,所以如果退出无效就会引发异常,并且对添加的数据没有任何条件检查,因此可以轻松覆盖房间,还有基本方向将不会对齐,因为您可以有一个西出口到其他房间没有相应的东出口(或出口)回到前一个房间。根据您的操作方式,您可能需要考虑构建一个Exit对象以将房间链接在一起,以便显示对称出口,但正如您所看到的,复杂性已经在增加。仍然是一个有趣的练习,但是你可能更好地找到一些教程来帮助你学习OOP的基础知识。

答案 1 :(得分:1)

由于您使用房间名称来进行这些方向关联,因此您可以在Room类中保留一个dict,以跟踪哪个Room实例与哪个名称相关:

class Room(object):
    lookup = {}
    def __init__(self,name,exits):
        self.name = name
        self.exits = exits
        Room.lookup[name] = self

将此方法添加到Room,以便在您移动时,您可以从出口所在的房间获取描述。

def showExits(self):
    return "This room has %d exits: %s" % (len(self.exits), ','.join(self.exits))

这段代码很好,就像你拥有它一样:

## Create the "map"
warehouse = Room("warehouse",{'n':'house','w':'pond'})
pond = Room("pond",{'e':'warehouse'})
house = Room("house",{'s':'warehouse'})

但是现在,在创建每个Room实例时,它也会在类级别的dict Room.lookup中按名称保存。由于这是在Room.__init__方法中为您处理的,因此您实际上不需要将房间分配给变量,并且可以写:

## Create the "map"
Room("warehouse",{'n':'house','w':'pond'})
Room("pond",{'e':'warehouse'})
Room("house",{'s':'warehouse'})

现在你可以写一些简单的“四处走动”代码。请注意如何通过访问Room实例上的属性和方法,从一个房间到另一个房间获取有关每个房间的信息。

# walk around a while
currentRoom = house  # or Room.lookup['house']
while 1:
    print "You are at the %s" % currentRoom.name
    print currentRoom.showExits()
    command = raw_input("which direction? ").lower()

    if command == 'q':
        break

    if command not in list("nsew"):
        print "that is not a valid direction"
        continue

    if command in currentRoom.exits:
        direction = command
        nextRoomName = currentRoom.exits[direction]
        nextRoom = Room.lookup[nextRoomName]

        # move by setting currentRoom to the nextRoom
        currentRoom = nextRoom

    else:
        print "you can't go that way"