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

input文字列を返すpython3.x を使用しているようです。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

以下を使用して、名前で関数にアクセスできます。

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 に答える
2

cmdモジュールを見てみましょう。これを参照してください。

通常はシェル スタイルのコマンド言語に使用されますが、単純なテキスト スタイルのアドベンチャー ゲームの作成にも使用できます。

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 に答える
0

通常、Hans が示唆するようにコードを再利用する方が良いですが、コマンドを入力して手動で実行したい場合は、ユーザーが提供した入力を直接実行するよりも、有効なコマンドの辞書を用意する方がはるかに安全です。

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