2013-07-29 2 views
0

В настоящее время я читаю «Программирование на Python для Absolute Beginning 3rd Edition». Одна из проблем заключается в следующем:Словарь vs Variable

Напишите программу создания персонажа для ролевой игры. Игрок должен получить пул из 30 очков, чтобы потратить на 4 атрибуты: Сила, Здоровье, Мудрость и Ловкость. Игрок должен иметь возможность тратить очки из пула на любой атрибут , а также должен брать очки от атрибута и возвращать их обратно в пул.

Сначала я написал это с переменным

pool = 30 
strength = 0 
health = 0 
wisdom = 0 
dexterity = 0 

Этот раздел относительно списков и словарей. Поэтому мой вопрос: лучше ли использовать переменные таким образом или можно использовать словари? Если да, то это более эффективно? то есть:

attributes = { 
      "strength" : 0, 
      "health" : 0, 
      "wisdom" : 0, 
      "dexterity" : 0 
      } 
+0

Я бы предпочел второй, потому что тогда вы могли бы пройти через – Doorknob

+1

. Для более гибкого подхода: набор атрибутов кажется хорошо подходящим для класса, больше, чем словарь или набор переменных. –

+0

Я не получил классы еще в книге, однако я видел некоторые примеры из них. Поэтому, если бы я должен был выполнять класс 'def attributes:' и присваивать все значения силы, здоровья и т. Д. Я мог бы назвать их позже или изменить их с атрибутами. Прочность, атрибуты. Здоровье и т. Д.? – mccdlibby

ответ

3

Чтобы сделать его коротким: я бы пошел на словарь.

Чтобы сделать это долго: это может быть хорошим примером для непосредственного изучения объектно-ориентированного программирования.

#! /usr/bin/python3 

class Character: 
     class AbilityScoreOutOfBoundsException (Exception): pass 

     def __init__ (self, name): 
      self.name = name 
      self.stats = {k: 1 for k in ['STR', 'DEX', 'WIS', 'INT'] } 

     @property 
     def strength (self): return self.stats ['STR'] 

     @property 
     def dexterity (self): return self.stats ['DEX'] 

     @property 
     def wisdom (self): return self.stats ['WIS'] 

     @property 
     def intelligence (self): return self.stats ['INT'] 

     @strength.setter 
     def strength (self, amount): self.setStat ('STR', amount) 

     @wisdom.setter 
     def wisdom (self, amount): self.setStat ('WIS', amount) 

     @dexterity.setter 
     def dexterity (self, amount): self.setStat ('DEX', amount) 

     @intelligence.setter 
     def intelligence (self, amount): self.setStat ('INT', amount) 

     def setStat (self, which, amount): 
      if amount < 1: raise Character.AbilityScoreOutOfBoundsException ('Beware hero! Thou wert about to smite thyself.') 
      if self.total + amount - self.stats [which] > 30: raise Character.AbilityScoreOutOfBoundsException ('Beware hero! Thou shalt not grow too mighty.') 
      self.stats [which] = amount 

     @property 
     def total (self): return sum (self.stats.values()) 

     def __repr__ (self): 
      return '{}\n{}'.format (self.name, '\n'.join ('{}{:>4}'.format (which, self.stats [which]) for which in ['STR', 'DEX', 'WIS', 'INT'])) 

a = Character ('Daggeroth') 
a.strength += 9 
a.dexterity += 9 
a.wisdom += 5 
a.intelligence += 3 
print (a) 
1

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

attributes['strength'] += 1 

кажется намного более организованным для меня.

0

Словари в Python реализуются с помощью хэш-таблиц, поэтому эффективность здесь не проблема. Использование словаря атрибутов лучше, потому что оно более гибкое.

Например, если вам нужны несколько символов, то вы можете просто иметь список словарей атрибутов. Использование переменных в этом случае не поддерживается (вам нужно что-то вроде player1Health, player2Health, ...).

1

Чтобы ответить на ваш точный вопрос, Python хранит переменные в словаре, поэтому он не имеет особого значения в отношении того, как программа запускается, хранятся ли они в словаре или просто как переменные.

Встроенные функции globals() и locals() возвращают словари, хранящие набор переменных, которые предлагают соответствующие им имена функций.

Типичным способом хранения этих видов переменных в программе Python было бы создание класса. Я бы предположил, что классы покрываются когда-то после списков и словарей, поэтому это, вероятно, немного опережает книгу.

Это то, что построение класса для этого будет выглядеть хотя:

class Character(object): 
     def __init__(self): 
      self.charisma = 0 
      self.dexterity = 0 
      self.wisdom = 0 
      self.health = 0 
      self.pool = 30 

Это имеет несколько преимуществ, но один, что на самом деле легко видеть, что она позволяет создавать несколько персонажей легко.

alice = Character() 
    bob = Character() 

И Алиса, и Боб начинаются с их собственных копий связанных с ними переменных. Python также сохраняет переменные класса в словарях. Так alice.charisma + = 1 не влияет на bob.charisma.

alice .__ dict__ будет словарь, содержащий копию Алисы каждой из этих переменных.

0

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

    print("""" 
          1. strength \n 
          2 Health\n 
         3. wisdom\n 
         4. dexterity 
         5. remove 1 strength for point 
         6. remove 1 health for point 
         7. Remove 1 wisdom for point 
         8. remove 1 dexterity for point 
         """) 

         points=30 
         strength=0 
         health=0 
         wisdom=0 
         dexterity=0 
         default=1 

         while default: 

         choice=int(input("Select attributes that you want:")) 
          if choice==1: 
          strength+=1 
          points-=1 
          print("Strength: ", strength, "\nHealth: ", health, "\nWisdom: ", wisdom, "\nDexterity: ") 

          elif choice==2: 
          health+=1 
          points-=1 
          print("Strength: ", strength, "\nHealth: ", health, "\nWisdom: ", wisdom, "\nDexterity: ", dexterity) 

          elif choice==3: 
          wisdom+=1 
          points-=1 
          print("Strength: ", strength, "\nHealth: ", health, "\nWisdom: ", wisdom, "\nDexterity: ", dexterity) 

          elif choice==4: 
          dexterity+=1 
          points-=1 
          print("Strength: ", strength, "\nHealth: ", health, "\nWisdom: ", wisdom, "\nDexterity: ", dexterity) 

          elif oc==5: 
          strength-=1 
          points+=1 
          print("Strength: ", strength, "\nHealth: ", health, "\nWisdom: ", wisdom, "\nDexterity: ", dexterity) 

         elif oc==6: 
          health-=1 
          points+=1 
          print("Strength: ", strength, "\nHealth: ", health, "\nWisdom: ", wisdom, "\nDexterity: ", dexterity) 

         elif oc==7: 
          wisdowm-=1 
          points+=1 
          print("Strength: ", strength, "\nHealth: ", health, "\nWisdom: ", wisdom, "\nDexterity: ", dexterity) 

         elif oc==8: 
         dexterity-=1 
         points+=1 
         print("Strength: ", strength, "\nHealth: ", health, "\nWisdom: ", wisdom, "\nDexterity: ", dexterity) 

Конечно, вы также можете использовать словари, но переменная идея намного проще, и программирование все об эффективности.

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