2015-05-13 3 views
0

Я пытаюсь написать игру RPG и зациклился на том, как вызвать предметы, монстры, квесты и т. Д., Используя единственный уникальный идентификатор, чтобы получить все данные. Это в основном основано на верхнем ответе в this Code Review question.Добавление элемента в инвентарь с использованием уникального идентификатора (python)

Вместо того, чтобы передавать все данные классу Item, я хотел бы назвать метод или функцию со словарем всех элементов, которые затем передают данные в Item на основе единственного уникального идентификатора.

Соответствующий код, который я в настоящее время имеют следующий (весь код можно найти here):

inventory.add_item(Item(ListItem.list(1))) #The 1 is a placeholder to specifically get the sword. 

class Inventory(object): 
    def __init__(self): 
     self.items = {} 

    def add_item(self, item): 
     self.items[item.name] = item 

class Item(object): 
    def __init__(self, name, attack, armor, cost, quantity, description): 
     self.name = name 
     self.attack = attack 
     self.armor = armor 
     self.cost = cost 
     self.quantity = quantity 
     self.description = description 


class ListItem(object): 
# This is a database to hold all the games loot/items 
    def __init__(self): 
    # What goes here? 

    def list(self, itemid): 
    # Probably don't even need this here? Can it go under __init__? 
     all_items = { 
      1: {"name": "Sword", "desc": "A rusty looking sword", "dmg": 5,   "arm": 1, "val": 10}, 

      } 
     return list(all_items[itemid].values()) 
+1

Вы, кажется, обрабатываете 'ListItem.list' как метод ** **, поэтому вам не обязательно нужно что-либо * в' ListItem .__ init__'. Однако мне не совсем ясно, чего вы пытаетесь достичь. – jonrsharpe

+0

Почему 'ListItem()' класс в первую очередь? Если я не ошибаюсь, это означает, что это будет ** действие **, и в этом случае класс, вероятно, не подходит для него. Мне кажется, что «list» был бы более уместным как метод «Inventory», FWIW. –

+0

Спасибо за ответы. Я новичок в программировании, поэтому пытаюсь понять эти понятия. Чтобы уточнить, чего я пытаюсь достичь: Вместо того, чтобы игрок взял предмет и вызвал инвентарь.add_item (Предмет («меч», 10, 1, 10, 1, «Ржавый меч»)) Я хотел бы «inventory.add_item» (Item (уникальный идентификатор здесь, который ссылается на все данные, которые передадут эти данные классу Item.)) –

ответ

0

Я получил это работает, но, возможно, не самый эффективный способ следующим образом:

1) Удалены класс ListItem

2) Добавлен словарь для основного метода

3) установить переменную IID (пункт ID), чтобы быть независимо от v ALUE имеет элемент в комнате

4) Зачет каждое значение элемента к классу Item

Это, однако ограничивает меня одного пункта на месте.

location = { 
    2: {"name": "Cave - Upper area", 
     "description": "Placeholder", 
     "west": 1, 
     "south": 4, 
     "item": "sword", 
     "iid": 1}, 

all_items = { 
    1: {"name": "Sword", "dmg": 5, "arm": 1, "val": 10, "desc": "A rusty looking sword"}, 
    100: {"name": "Beer", "desc": "A foaming mug of ale", "dmg": 1, "arm": 1, "val": 1} 
    } 

elif move[0] == "get": 
    if "iid" in location[currentLocation] and move[1] in location[currentLocation]["item"]: 
     iid = location[currentLocation]["iid"] 
     inventory.add_item(Item(all_items[iid]["name"], all_items[iid]["dmg"], all_items[iid]["arm"], all_items[iid]["val"], all_items[iid]["desc"])) 
     print("%s added to inventory!\n" % all_items[iid]["name"]) 
     del location[currentLocation]["item"] 
    else: 
     print("\nThere is no %s here!\n" % move[1]) 
Смежные вопросы