2014-01-10 80 views
-1

我正在創建一些星際爭霸地圖工具。星際爭霸地圖包含許多東西,比如地圖,單位佈置或戰爭霧層。單位放置由單位[]表示,每個條目具有屬性'生命點'(0〜100%)。戰爭霧由霧[x,y] [玩家]表示。 (布爾數組)Python矢量化庫?

現在假設我想將每個單位的生命值設置爲50%。我只能寫

for obj in units: 
    obj.hitpoint = 50 

但是,我不能這樣寫嗎?

units[:].hitpoint = 50 

單位可能是另一個變量的查看器,但界面應該保持如上。

同樣地,人們應該能夠轉換這個

for y in range(height): 
    for x in range(width): 
     for player in range(8): 
      fog[x, y][player] = False 
     fog[x, y][0] = True 

fog[:, :][:] = False 
fog[:, :][0] = True 

(高度,寬度是戰爭層的霧的尺寸。)

或者像在numpy的2D陣列副本,這應該是可能的。

fog[3:7, 4:8][1:3] = fog[5:9, 1:6][2:4] 

有沒有讓我這樣做的圖書館?

P.S)我是一個Python新手。 (但我可以學習什麼時候應該。)主題肯定是誤導性的,但我想不出更好的主題。

回答

1

所以,我不確定現有的庫,但創建一個矢量類來做到這一點不應該太難。

class Vector(object): 
    def __init__(self, arguments): 
     object.__setattr__(self, 'contents', list(arguments)) 

    def __iter__(self): 
     return iter(self.contents) 

    def __getitem__(self, key): 
     return self.contents[key] 

    def __setitem__(self, key, value): 
     self.contents[key] = value 

    def __delitem__(self, key): 
     del self.contents[key] 

    def __setattr__(self, key, value): 
     for node in self.contents: 
      setattr(node, key, value) 

您可以使用此爲:

Vector(units).hitpoint = 50 

# This also still works... 
for unit in Vector(units): 
    unit.hitpoint = 50 

# This also still works... 
Vector(unit)[2].hitpoint = 50 
0

你可以用numpy和熊貓來做到這一點,如果你將你的數據組織成列。無論使用何種語言,情況都是如此,因爲(硬件)矢量化僅適用於連續的數據。

0

對於戰爭的迷霧,我會用2D numpy的陣列的字典,沒有必要向量化上的玩家數量,你會在複雜性可能降低工作效率只能獲得:

import numpy as np 

players = ['player1', 'player2'] 
fog = {player: np.zeros((3,4)) for player in players} 
fog 
# {'player1': array([[ 0., 0., 0., 0.], 
#     [ 0., 0., 0., 0.], 
#     [ 0., 0., 0., 0.]]), 
# 'player2': array([[ 0., 0., 0., 0.], 
#     [ 0., 0., 0., 0.], 
#     [ 0., 0., 0., 0.]])} 

然後修改它使用正常的numpy操作:

#set fow False for all player 
for player in players: 
    fog[player].fill(False) 

#set fow to True for first player 
fog['player1'].fill(True) 

對於我將離開的單位,對象列表似乎是適合您的用例的數據結構。