2015-05-14 38 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

读你要完成什么,我相信使用OOP将是您更好情况:

# 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

哈哈,我的想法确切。我喜欢你的容器类名称“暴徒” –

1

听起来像你你使用了一点OOP。我建议:

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

然后创建一个管理器,可以产生怪物对象的n个,并提供可管理的静态方法来调用什么对象:

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) 
相关问题