2015-07-24 3 views
-1

Я впервые играю с Python и любым языком программирования, поэтому, пожалуйста, несите меня. Я начал онлайн-класс две недели назад, но постараюсь разработать небольшую игру сбоку, чтобы быстрее учиться (и получать удовольствие). Это текстовое приключение, но оно должно иметь случайные встречи и сражения с врагами, у которых есть случайное снаряжение, которое игроки могут затем добыть.Создать случайные уникальные имена переменных для объектов

Это моя проблема: если я создаю случайные объекты/оружие для своей случайной встречи, мне нужно убедиться, что объект имеет уникальное имя. Способ, которым проектируется этот уровень, теоретически может быть бесконечным числом объектов (он может быть открытым, с появлением столкновений).

Это мой подход до сих пор

class Item_NPCs: #create objects for NPCs 

    def__init__(self, item_type, item_number): 
    # e.g. item_type 1 = weapons, item_type2 = potions, etc. 

     if item_type == 1 and item number == 1: 
      self.property1 = 5 
      self.property2 = 4 

     if item_type == 1 and item_number ==2: 

     # etc. :) 

def prepare_encounter(): 

    inventory_NPC = [] # empty list for stuff the NPC carries around 

    XXX = Class_Item(item_type, item_number) # I might randomize the arguments. 

Что важно то, что я хочу «XXX», чтобы быть уникальным и случайным образом, так что ни один объект не существует больше, чем один раз и впоследствии может быть введен в инвентаре игрока ,

Как это сделать?

Joe

+3

Важно: ваши ** значения ** должны быть уникальными, а не вашими переменными. Переменные - это заполнители в алгоритме. Ваш алгоритм не может функционировать, если его заполнители являются неопределенным беспорядком. Если вам нужно удерживать * несколько значений *, даже случайных, используйте 'list' или' dict'. – deceze

+1

@deceze прав, если вам нужен случайный __name__ для объекта, вы должны рассмотреть его передачу в конструктор класса Class_Item и присвоить его атрибуту экземпляра 'Class_Item'. – Cipher

+0

Или если имя всегда находится в форме «Item X», вы можете сгенерировать это имя в конструкторе, указав, что класс содержит вкладки количества созданных экземпляров. –

ответ

3

Зачем вам это нужно быть случайным? Вы можете просто использовать список, и добавьте каждый новый объект в список, с его индексом является его уникальным идентификатором:

items = [] 
items.append(Class_Item(item_type, item_number)) 

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

items = dict() 
items[random_id] = Class_Item(item_type, item_number) 

Для этого требуется, чтобы random_id был хешируемым (но он должен быть, если это число или строка).

+0

Хорошо, это интересно, потому что это намекает на то, что я получаю что-то не так. Я ожидал, что возникнет проблема с созданием двух одинаковых объектов под одним и тем же именем переменной, а затем попытаться рассматривать это как два разных объекта. Если я правильно вас понимаю, быть в одном списке по разным индексам достаточно, чтобы два python рассматривали эту вещь как два разных объекта? Если это так, мне не нужны случайные имена. Я думал, что это будет необходимо. -> Извините, я ничего не могу проверить. На работе. – Joe

+1

Вы можете создавать объекты с разными именами, но я не думаю, что это то, что вы действительно хотите. То, что вы на самом деле хотите, это ансамбли объектов: объекты игрока, объекты противника и т. Д. Это дает структуру вашей программе (и избегает беспорядка переменных, например, deceze said), но также дает вам гораздо более мощные функции для манипулировать объектами. Например, с помощью 'player_items' list/dict вы можете показать игроку свои предметы с помощью простого цикла:' для элемента в player_items: print (item) ', и в конце боя вы можете добавить добычу : 'player_items.extend (enemy_items)'. – Nihl

+0

Мне нравится продлить вещь. Я мог бы дать игроку выбор того, что добывать. .... btw: Это то, что я получил до модуля для инвентаря и объектов: https://trinket.io/library/trinkets/1210c14e8c ... Я спросил, потому что теперь я хочу добавить систему enctounter и считаю, что я нужны разные имена переменных. Но ... сообщения здесь намекают на то, что это не так. Ждем экспериментов. – Joe

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