2014-01-10 49 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) 

对于我将离开的单位,对象列表似乎是适合您的用例的数据结构。