1

こんにちは、この質問をチェックしていただきありがとうございます。私が作成している基本的なタイルベースのゲームでは、世界の地図を表すアイテム/値のマトリックスを保持する独自のコンテナクラスを作成しました。これを行うために、演算子のオーバーロードについて学びました。ほとんどの場合、すべてが問題ないように見えますが、私を混乱させるいくつかの結果が得られています。

class mapArray(object):

    def __init__(self, mapdata = None, (width,height) = None, fillnumber = 0):
        #If you are already given a map array, then you can just provide
        # that first, otherwise leave it as none. Fill number is used to change the entire 
        # map array so that the map will be a different tile type. 0 is most likely just grass.
        print "horses"
        if (mapdata == None) and (width, height) == None:
            self.mapdata = []

        elif mapdata is not None:
            self.mapdata = mapdata

        elif (width,height) is not None:
            self.mapdata = [[fillnumber] * width] * height

    def __setitem__(self, (x,y), value):
        #Allows you to assign values more intuitively with the array
        self.mapdata[y][x] = value

    def __getitem__(self, (x,y)):
        #Just reverses it so it works intuitively and the array is 
        # indexed simply like map[x,y] instead of map[y][x]
        return mapArray(self.mapdata[y][x])

    def __str__(self):
        return str(self.mapdata)

    def __repr__(self):
        return str(self.mapdata)

    def __len__(self):
        return len(self.mapdata)

getitemは正常に機能します。コンストラクターを設定して、リストの特定のリストを取り込むか、そのサイズの配列を作成するだけの長さと幅を提供します。独自の値を指定するのではなく、配列のサイズを指定したときに得られる結果は次のとおりです。

testlist1 = mapArray(None, (3,3), 4)
print testlist1
testlist1[0,1] = 5
print testlist1

これにより、次の結果が得られます。

[[4,4,4],[4,4,4],[4,4,4]]
[[5,4,4],[5,4,4],[5,4,4]]

最初の結果は理にかなっていますが、2番目の結果は、私が上書きしたsetitemメソッドの問題を示しているようです。すべてのリストの最初のインデックスを置き換えるのはなぜですか?

また、mapdata引数を置き換えるために独自のリストのリストを提供すると、何が起こるかがわかりません。

randommap = [[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15]]
testlist2 = mapArray(randommap)
print testlist2

そのコードは私にこのTypeErrorを与えます:

def __init__(self, mapdata = None, (width,height) = None, fillnumber = 0):
TypeError: 'NoneType' object is not iterable

私には、これは、「なし」に設定されている場合、mapdataは反復可能ではないと言っているように見えますが、私が提供するランダムマップリストをmapdataに置き換えるべきではありませんか?おそらく、私が設定した条件ステートメントに問題があり、置き換えられないようになっています。問題が何であるかを絞り込むことができないようです。どんな助けでも大歓迎です!

私は演算子のオーバーロードに慣れていないので、これを行うためのより効率的な方法があれば私に知らせてください。numpyが私のためにこれのほとんどを行うために存在することを私は知っていますが、私はこれを自分でやりたかったのです。再度、感謝します!ライアン

4

1 に答える 1

3

問題はにあり__init__()ます。具体的にはこの行:

self.mapdata = [[fillnumber] * width] * height

これによりheight、同じリストへの参照が作成されます。修正は次のとおりです。

self.mapdata = [[fillnumber] * width for x in xrange(height)]
于 2012-08-10T04:03:51.187 に答える