2014-01-10 5 views
-1

Я создаю некоторые инструменты картографии Starcraft. Карта Starcraft содержит много вещей, таких как tilemap, размещение единиц или туман уровня войны. Единицы размещения представлены единицами [], причем каждая запись имеет атрибут «hitpoint» (0 ~ 100%). Туман войны представлен туманом [x, y] [player]. (Arule of booleans)Библиотека векторизации 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 и pandas, , если вы упорядочиваете свои данные в столбцы. Это верно независимо от используемого вами языка, поскольку (аппаратная) векторизация работает только со смежными данными.

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) 

для блоков я бы оставить так, список объектов, как представляется, соответствующая структура данных для использования.

Смежные вопросы