2015-05-14 3 views
1

В настоящее время я делаю игру для класса CompSci, и я хочу сократить наши случайные битвы с монстрами. Есть ли способ сделать это, когда я вызываю def, я могу изменить имя в зависимости от случайной переменной? Это фрагмент кода я говорю о Python: используйте переменную при вызове определения

Loop = True 
     MonsterType = random.randint(1,20) 
     Monster*() 
     battle() 

У меня есть

def Monster1 
def Monster2 
def Monster3 
. 
. 
. 
def Monster20 

Я хочу * в первом фрагменте будет переменная MonsterType, есть способ, чтобы это сделать что? То есть Когда он запускается, если MonsterType = 15, тогда будет вызван Monster13().

+2

Я не стал понимать. Вы говорите о наследовании? – RafaelC

+1

Можете ли вы опубликовать свой фактический код и объяснить свою проблему немного яснее? – SuperBiasedMan

+0

Я немного разъяснил. В основном * будет числом, определенным MonsterType. Просто интересно, был ли способ сделать число установленным в MonsterType, а не кучу операторов if и elif для каждого монстра. – jokerr77

ответ

2

Да есть способ, создать dictionary карту каждую функцию в целое:

import random 

def monster1(): 
    print "Hello monster1" 

def monster2(): 
    print "Hello monster2" 

def monster3(): 
    print "Hello monster3" 

def monster4(): 
    print "Hello monster4" 

d = {1:monster1, 2:monster2, 3:monster3, 4:monster4} 

#When you need to call: 
monsterType = random.randint(1, 4) 
d[monsterType]() 
+1

Я бы даже не предложил 'eval()' кому-то, кто не знаком с тем, почему это плохая идея для начала. это будет только опасно. Возможно, скажите ** Никогда не используйте 'eval()' **, если что-нибудь :) – Torxed

+0

Отредактировано! @Torxed – ZdaR

1

После прочтения, что вы пытаетесь достичь, я считаю, что использование ООП будет лучше для вашего ситуация:

# A class for a bunch of monsters 
class Mob(object): 
    def __init__(self, num_monsters): 
     self._num_monsters = num_monsters 
     self._monsters = [] 
     for i in range(self._num_monsters): 
      # randomly create a type of monster based on the number of monsters 
      self._monsters.append(Monster(random.randint(0, self._num_monsters))) 

# Each monster has a type that is attacks with 
class Monster(object): 
    def __init__(self, monster_type): 
     self._type = monster_type 

    def attack(self): 
     print(self._type) 

test = Mob(20) 
+0

ха-ха, мои мысли точно. Мне нравится ваше имя класса контейнера "mob" –

1

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

class Monster(object): 
    def __init__(self, name): 
    self.name = name 
    def do_work(self): 
    print self.name 

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

class MonsterManager(object): 
    monsters = [] 
    def call_monster(self, index): 
    monsters[i].do_work() 

с этим, вы можете иметь лучшее использование, например:

manager = MonsterManager(); 
manager.monsters.append(Monster('Monster1') 
manager.monsters.append(Monster('Monster2') 
# etc 
# then call a single monster 
manager.call_monster(i) 
Смежные вопросы