2013-09-18 4 views
0

Я работаю над скриптом и могу использовать некоторые рекомендации. Цель сценария - позволить игрокам получать магические предметы и хранить их в определенном слоте. У меня возникла проблема с попыткой создания элемента на основе того, какой слот предоставляется.Передача элементов класса в качестве аргументов

Я создаю дочерний класс типа dict. Здесь я буду хранить элементы пользователей.

class PlayerData(dict): 
    def __init__(self): 
     self.weapon = 0 
     self.head = 0 
     self.back = 0 
     self.chest = 0 
     self.hands = 0 
     self.feet = 0 

    def __getattr__(self, attr): 
     return self.__getitem__(attr) 

    def __setattr__(self, attr, value): 
     self.__setitem__(attr, value) 

Я сохраняю эти значения в словаре. У меня есть класс, который изменяет эти записи. Один из методов выполняет итерации над элементами в PlayerData, и если все элементы пусты, захватывает случайный и пытается добавить к нему объект (типа MagicItem). «self.steamid» - это ссылка на игрока.

def addItem(self): 
    chance = 75 
    slot = 0 
    count = 0 
    for k,v in PlayerDataDictionary[self.steamid].iteritems(): 
     if not v: 
      count += 1 
    if count = 6: 
     chance = 100 
    if random.randint(1,100) <= chance: 
     slot = random.choice(PlayerDataDictionary[self.steamid]) 
     if slot: 
      chooseReplace(self, slot) 
     else: 
      PlayerDataDictionary[self.steamid][slot] = MagicItem(slot) 
    else: 
     es.tell(userid, '#green', 'You destroyed your item during creation!') 
     # This is a custom module for a game, this function works as intended 

Однако, тот элемент, который создается, зависит от слота. Как определить, какой слот из PlayerData был передан классу MagicItem?

+0

'if count = 6:' ... Скомпилирует ли это? – Hyperboreus

+0

Какое преимущество вы получаете, используя класс 'PlayerData', используя простой словарь или простой класс с его атрибутами? – Hyperboreus

+0

Я еще не скомпилировал, все еще работаю над тем, как я хочу, чтобы он работал. Я использую его как класс в случае, если мне нужно добавить некоторые методы, и на данный момент он не использует атрибуты словаря? – user1023102

ответ

1

От того, как я понимаю, что происходит, линия:

slot = random.choice(PlayerDataDictionary[self.steamid]) 

это единственное место, которое slot когда-либо назначен. Поэтому вы должны просто передать эту переменную где-нибудь (печать, другая функция, все, что вы хотите с ней сделать). Если вы ищете конкретный индекс, то вы собираетесь нужно либо написать функцию в PlayerDataDictionary, что может вернуть индекс слота или:

size = len(PlayerDataDictionary[self.steamid]) 
random_slot = random.randint(0, size) 

который оставит random_slot со значением индекса, вы можете пройти

if PlayerDataDictionary[self.steamid][random_slot]: 
    chooseReplace(self, random_slot) 
else: 
    PlayerDataDictionary[self.steamid][random_slot] = MagicItem(random_slot) 

Это должно работать, пока я правильно понимаю вашу проблему. Вы оставили некоторую неточность относительно того, что именно искали, поэтому дайте мне знать, если я упустил точный вопрос.

+0

@ C1pher Как я могу получить конкретный индекс? Я бы просто перебирал ключи в PlayerData или был бы более эффективный способ? – user1023102

+0

Вы не можете получить определенный индекс из словаря, как вы ожидали бы из списка, я просто предположил, что ваши слоты пронумерованы как таковые в словаре. Вы можете перебирать либо 'dict.keys()', либо 'dict.values ​​()' где 'dict' - это имя вашего словаря. – c1phr

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