必要なのは、メインのゲーム ループです。
while game.is_running:
command = get_user_input()
user_do(command)
update_world()
これにより、ループ内の 3 行のコードが is である限り繰り返されwhile
ます。まず、ユーザー入力を取得します。次に、それに基づいて行動します。最後に、モンスターの移動やスポーンなど、ゲームに必要なその他の更新を実行します。この時点で、ループバックし、ユーザーに別のコマンドを要求します。game.is_running
True
更新:これは実際の例です:
# In commands.py:
def bag():
print 'bag'
def other():
print 'other'
def unrecognized():
print 'unknown command'
# In main.py:
import commands
def user_input():
print 'a question'
return raw_input('>')
def user_do(command):
# get the matching command out of commands, or pass back
# the unrecognized function if it's not found
action = getattr(commands, command, commands.unrecognized)
action()
is_running = True
while is_running:
command = user_input()
if command == 'quit':
is_running = False
else:
user_do(command)
この例では、私はだまされており、呼び出される関数の名前と同一のユーザー入力コマンドに依存しています。ではuser_do
、getattr
呼び出しはユーザーが入力した文字列をcommand
モジュールの内容と比較し、存在する場合は同じ名前の関数を返し、存在unrecognized
しない場合はフォールバック関数を返します。action
コマンド関数または のいずれかを保持しますunrecognized
。
ユーザーコマンドを実際の関数自体に強く結び付けたくない場合は、多くのステートメントを使用する代わりに、dict
a を分岐構造 (またはdispatch ) として使用できます。if / elif / else
# Modified main.py
import commands
COMMAND_DISPATCH = {
'bag': commands.bag,
'sack': commands.bag,
'other': commands.other,
# ...
}
# ...
def user_do(command):
action = COMMAND_DISPATCH.get(command, commands.unrecognized)
action()
この例では、commands
モジュール内の関数を検索するのではなく、COMMAND_DISPATCH
代わりにそれらを検索します。
もう 1 つアドバイスがあります。すぐに、ユーザー入力を 1 つのコマンド以上に解析する方法を検討したくなるでしょう。この例では、「command ...」という形式の入力を受け入れられるようにしたいとします。user_input
これを処理するために関数を拡張できます。
def user_input():
print 'a question'
user_input = raw_input('>').split(' ')
command = user_input[0]
arguments = user_input[1:]
return command, arguments
したがって、「foo bar baz」と入力すると、tuple が返され('foo', ['bar', 'baz'])
ます。次に、引数を処理するためにメイン ループを更新します。
while is_running:
# use tuple unpacking to split into command, argument pairs
command, arguments = user_input()
if command == 'quit':
is_running = False
else:
user_do(command, arguments)
次に、それらをコマンドに渡すことを確認します。
def user_do(command, arguments):
action = COMMAND_DISPATCH.get(command, commands.unrecognized)
action(arguments)
最後に、引数を受け入れて処理するようにコマンドを変更します。
def bag(arguments):
for argument in arguments:
print 'bagged ', argument
テキスト アドベンチャーの場合はcommand object
、command object preposition subject
、 、場合によってはcommand adjective object ...
.