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])

これにより、場所で指定された座標を使用して、a、b、c、および d という名前の 4 つの部屋が作成されるという考えでした。a、b、c、および d が定義されていないため、Python ではこれを実行できません。私が試したどの実装でも、インスタンスの命名には変数名を使用する必要があるという問題に遭遇しましたが、それらを動的に生成する方法がわかりません。

私は多くのことを検索しましたが、インスタンス化の自動化が実際に人々がやりたいことであるようには思えません。

これを修正する方法、またはこのタスクをより良い方法で達成する方法についてのヘルプは大歓迎です!

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-class に name-field を持つことは理にかなっているでしょうか?

= Room(1,1) の何が問題になっていますか? 後で配列に格納できます。つまり、部屋をインスタンス化した後に配列を宣言します。

そもそもなんでネーミングにこだわるの?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

Pythonic 構文とイディオムをもっと学ぶ必要があるかもしれないと感じています。祝福します。

于 2012-12-10T01:35:50.673 に答える