2

我正在尝试用 python 找出一些 OOP 的东西,但遇到了一些问题。我正在尝试制作一个“游戏”,让玩家在房间网格中走动,每个房间都是 Room 类的实例。如果我想制作一个大网格,实例化每个房间会很痛苦,因为我可能不得不为 64 个不同的房间输入相同的重复坐标模式,所以我想制作一个可以为我做的函数,我我在弄清楚如何做时遇到了问题。这是我的代码:

class Room(object):

    def __init__(self, x, y):
        self.x = x
        self.y = y

def generate_rooms():

    names = [a,b,c,d]
    locations = [[1,1],[1,2],[2,1],[2,2]] #this line could be a few for loops

    for x in range(0,4):
        names[x] = Room(locations[x][0],locations[x][1])

这个想法是,这将创建 4 个名为 a、b、c 和 d 的房间,其坐标在位置中指定。Python 不允许我这样做,因为没有定义 a、b、c 和 d。在我尝试过的任何实现中,我都遇到了命名实例需要使用变量名来完成的问题,而且我不知道如何动态生成这些实例。

我进行了很多搜索,但它似乎并不是人们真正想要做的事情,这让我感到困惑,因为在这种情况下它似乎真的很有意义。

非常感谢有关如何解决此问题或如何以更好的方式完成此任务的任何帮助!

4

3 回答 3

4

你很亲近!通常的方法是使用字典,并使用您想要的名称作为字典键。例如:

>>> class Room(object):
...     def __init__(self, x, y):
...         self.x = x
...         self.y = y
...         
>>> rooms = {}
>>> names = ['a', 'b', 'c', 'd']
>>> locations = [[1,1], [1,2], [2,1], [2,2]]
>>> for name, loc in zip(names, locations):
...     rooms[name] = Room(*loc)
...     
>>> rooms
{'a': <__main__.Room object at 0x8a0030c>, 'c': <__main__.Room object at 0x89b01cc>, 'b': <__main__.Room object at 0x89b074c>, 'd': <__main__.Room object at 0x89b02ec>}
>>> rooms['c']
<__main__.Room object at 0x89b01cc>
>>> rooms['c'].x
2
>>> rooms['c'].y
1

这样,您可以通过多种方式迭代房间,例如:

>>> for roomname, room in rooms.items():
...     print roomname, room.x, room.y
...     
a 1 1
c 2 1
b 1 2
d 2 2
于 2012-12-10T01:23:07.227 回答
1

一些想法:

也许在 Room 类中有一个名称字段是有意义的?

a = Room(1,1) 有什么问题?您可以稍后将 a 存储在数组中。即在实例化房间后声明数组。

为什么你完全关心命名?Python 不在乎。

自动实例化很简单,通常使用循环和数组来完成。编写修改/创建程序的程序被称为元编程,并非易事

祝你好运!

于 2012-12-10T01:32:25.110 回答
0

以下只是微小的变化:

class Room(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y

def generate_rooms():
    names = [a,b,c,d]        // <-- this line goes crazy, since a,b,c,d is not defined yet
    locations = [[1,1],[1,2],[2,1],[2,2]] 

    for x in range(0,4):     // <-- this part can be improved
        names[x] = Room(locations[x][0],locations[x][1])

    // no return here? then what to generate?

def new_generate_rooms():
    locations = [[1,1],[1,2],[2,1],[2,2]]
    rooms = [Room(loc[0], loc[1]) for loc in locations]
    return rooms

def main():
    rooms = new_generate_rooms()
    for i,room in enumerate(rooms):
        print str(i)+'-th room: ', room.x, room.y

我觉得你可能需要学习更多的 Python 语法和习语。保佑。

于 2012-12-10T01:35:50.673 回答