2011-12-08 21 views
4

私はゲームのためのインタプリタを書いています。ユーザはインタプリタへの移動を入力し、プログラムはその移動を実行する。Prologユーザー入力(読み取り)の時間制限

今、それぞれの決定に期限を設定したいと思います。プレイヤーは移動を書いてEnterを押すのに30秒以上考えることができないはずです。

call_with_time_limitが関連見えたが、それは以下のような適切に動作doesntの:

call_with_time_limit(30、(X)を読んで)、問題は、(問題を)書きます。

この場合、入力を待ってから、入力が行われると、その後にタイマーが開始されます。しかし、私はタイマーが最初から始まるようにしたい。

どうすればいいですか?

+0

私の答えは '/1'を読む! – false

答えて

1

あなたのアプローチは分かりやすいようです:SWI-Prolog docsから: 'I/Oのブロックはread_term/3のタイムアウトオプションを使って処理できます。 '

これは本当に有益ではありません。ユーザーのタイムアウトを変更すると、catch/3の下でさえ、いくつかのバグが発生します(詳細はテストし、必要に応じてSWI_prologメーリングリストに報告します)。

次はEDIT

?- current_input(I), wait_for_input([I],A,5). 
I = <stream>(0x7fa75bb31880), 
A = []. 

(...ここでテストするために短い時間)ではない入力が与えられた場合

..., 
current_input(I), 
wait_for_input([I], A, 30), 
... 

を動作するようです:Aはリストを保持する変数が含まれています入力可能なストリームのリスト:タイムアウトが発生する前にユーザーが何も入力しない場合が報告されました。あなた付属のコードを使用して、実際の入力を取得するには:あなたは私に興味がある

+0

current_player(I)、 writef( 'その%dはプレイヤーがターン:。'、[I])、 current_input(入力)、 wait_for_input([入力]、移動、5)、 が解釈(移動)、 そのプレーヤーは回っています: エラー:wait_for_input/3:ストリーム '[(100ECB58)] 'が存在しません(無効な引数) – aladagemre

3

場合

tql :- 
    current_player(I), 
    writef('Its %d. players turn: ', [I]), 
    flush_output, 
    current_input(Input), 
    wait_for_input([Input], [Input], 5), 
    read(Input, Move), 
    writeln(Move). 

current_player(1). 

HTH/O関連のタイムアウトがwait_for_input/3またはset_stream/2をご検討ください。あなたが見つけた組み込みのcall_with_time_limit/2は、単純で信頼性の高いインターフェースではありません。

編集:入力のためにread/1を使用していることがわかりました。上記の文書で、ブロックするのを避ける方法をread/1でお読みください。理由は分かりませんが、ユーザーはを入力してと返すだけで、最初のタイムアウトを回避することができます。 read/1は今度は'\n'を読むでしょうが、それ以上の入力を待つことになります - タイムアウトなしで、ユーザーは賢くWikipediaをスキップして答えを... ...

+0

見るべき面白い部分は' interpret(Move) 'です。つまり、 'Move'は読み込み可能な入力のリストなので...' Move'という名前は、最小のものを言うのには理想的ではありません... – false

+0

入力と言うべきでしょうか?それから私は[コマンド|パラメータ]? – aladagemre

+0

(私たちが参照しているものを削除すると簡単ではありません) 'user_input'の場合、あなたはすでに名前を知っています。そしてあなたは[コマンド|パラメータ]と言うことは決してありません。それは '[user_input]'または '[]'です。 – false

関連する問題