2

我试图在 Python 中制作一个用户输入命令的“游戏”。但是,我不知道您是否可以将该输入作为函数名称。这是我目前的努力:

def move():
    print("Test.")

if __name__ == "__main__":
    input("Press enter to begin.")
    currentEnvironment = getNewEnvironment(environments)
    currentTimeOfDay = getTime(timeTicks, timeOfDay)
    print("You are standing in the {0}. It is {1}.".format(currentEnvironment, currentTimeOfDay))
    command = input("> ")
    command()

在这里,输入是 move,因为我想尝试调用该函数(作为潜在的最终用户可能)。但是,我收到以下错误:

Traceback (most recent call last):
  File "D:\Text Adventure.py", line 64, in <module>
    command()
TypeError: 'str' object is not callable

我想知道是否有任何方法可以让用户在游戏中“移动”,程序通过调用“移动”函数来实现。

4

4 回答 4

6

看起来您正在使用 python3.x 其中input返回一个字符串。要恢复 python2.x 行为,您需要eval(input()). 但是,您不应该这样做。这很可能导致糟糕的一天。


一个更好的主意是将函数放入字典中——

def move():
    #...

def jump():
    #...

function_dict = {'move':move, 'jump':jump }

进而:

func = input('>')  #raw_input on python2.x
function_dict[func]()

以下代码适用于我在 python3.2 上。

def move():
    print("Test.")

func_dict = {'move':move}
if __name__ == "__main__":
    input("Press enter to begin.")
    currentEnvironment = "room" #getNewEnvironment(environments)
    currentTimeOfDay = "1 A.M." #getTime(timeTicks, timeOfDay)
    print("You are standing in the {0}. It is {1}.".format(currentEnvironment, currentTimeOfDay))
    command = input("> ")
    func_dict[command]()
于 2012-09-19T13:01:18.523 回答
2

看看cmd模块。看到这个

它通常用于 shell 风格的命令语言,但也可用于创建简单的文本风格的冒险游戏。

您可以通过在子类上创建新方法来创建命令Cmd

例如

def do_move(self, args):
    if self.next_room.has_snake():
        print "The next room contains a poisonous snake. It bites you and you die."
    else:
        print "The room is empty"
于 2012-09-19T13:01:01.507 回答
2

您可以使用以下方法按名称访问函数:

function = globals()[function_name]

如果函数在当前模块中,或者

function = getattr(other_module, function_name)

您还应该采取措施禁止调用任意函数,例如,添加前缀:

 def cmd_move() # ok to call this
 def cmd_jump() # ok to call this

 def internal_func....

 cmd = raw_input('>') # e.g. "move"
 fun = globals()['cmd_' + cmd]
 fun()
于 2012-09-19T13:03:25.420 回答
0

按照 Hans 的建议,重用代码通常会更好,但如果您想输入命令并手动运行它们,拥有有效命令的字典比直​​接执行用户提供的输入要安全得多。

cmd = { 'move': move, 'jump': jump, 'look': look }
于 2012-09-19T13:06:45.507 回答