基于用户输入调用方法(基于文本的游戏)

时间:2015-01-27 14:18:28

标签: python python-3.x

我目前正在尝试制作基于文本的游戏,并且我想添加一个功能,根据用户在命令行(或Python shell)中的输入,它会检测到相应的方法,并返回它

例如,当用户在命令行中键入'legal moves!'时:

>>> legal moves!
'You have 10 legal moves, which are...'

或类似的东西。

我知道如果我创建一个类和一个名为legal_moves(self)的方法,用户就可以键入CLASSNAME.legal_moves()来调用同一个东西,但我试图将其设为假设他们对python一无所知,对玩家来说尽可能简单。

目前我有这样的事情,但我不确定如何使其发挥作用:

def MyClass():

    def __init__(self):
        player_words = input
        if player_words == "help me":
            return self.help_menu()

    def help_menu(self):
        print("To receive help...")

2 个答案:

答案 0 :(得分:1)

你非常接近!

首先,您必须使用class而不是def来声明一个类:

class MyClass():

然后,使用input()以获取用户输入。

答案 1 :(得分:1)

有几种选择;您可以使用getattr() function将字符串转换为实例上的属性;这包括访问方法:

class MyClass():
    def __init__(self):
        player_words = input()
        player_words = player_words.lower().replace(' ', '_')
        try:
            getattr(self, player_words)()
        except AttributeError:
            print("Sorry, there is no such command")

    def help_me(self):
        print("To receive help...")

这会将'Help me'转换为help_me并找到要调用的相应方法。

要列出所有可能的方法,您可以使用inspect.getmembers() functioninspect.ismethod() predicate function列出您班级提供的所有方法;您不必过滤这些内容,因为您不想向访问者展示__init__方法。也许您可以为此目的重载函数的__doc__属性;它包含function documentation string

from inspect import getmembers, ismethod

def is_documented_method(ob):
    return ismethod(ob) and ob.__doc__

class MyClass():
    def __init__(self):
        available_methods = getmembers(self, is_documented_method)
        help_info = [
            (name.replace('_', ' ').title(), func.__doc__)
            for name, func in available_methods]
        for name, documentation in help_info:
            print(name, documentation, sep=': ')
        player_words = input()
        player_words = player_words.lower().replace(' ', '_')
        try:
            getattr(self, player_words)()
        except AttributeError:
            print("Sorry, there is no such command")

    def help_me(self):
        """Provide help on all commands"""
        print("To receive help...")

    def frob_the_foobar(self):
        """Frobbing the Foobar will ..."""
        print("Frobbing the Foobar, sir!")

后者的演示:

>>> MyClass()
Frob The Foobar: Frobbing the Foobar will ...
Help Me: Provide help on all commands
help me
To receive help...
<__main__.MyClass object at 0x1114829e8>
>>> MyClass()
Frob The Foobar: Frobbing the Foobar will ...
Help Me: Provide help on all commands
Frob The Foobar
Frobbing the Foobar, sir!
<__main__.MyClass object at 0x111482b38>