我正在爲遊戲編寫一個解釋器。用戶進入解釋器,程序執行該移動。Prolog用戶輸入的時間限制(閱讀)
現在我想實施每個決定的時間限制。玩家不應該想到超過30秒的時間來寫出移動並按下回車鍵。
call_with_time_limit似乎相關,但它沒有這樣正常工作:
call_with_time_limit(30歲,讀(X))的問題,寫(問題)。
在這種情況下,它等待輸入,並且當輸入輸入時,定時器隨後開始。但我希望定時器從一開始就開始。
我該怎麼辦?
我正在爲遊戲編寫一個解釋器。用戶進入解釋器,程序執行該移動。Prolog用戶輸入的時間限制(閱讀)
現在我想實施每個決定的時間限制。玩家不應該想到超過30秒的時間來寫出移動並按下回車鍵。
call_with_time_limit似乎相關,但它沒有這樣正常工作:
call_with_time_limit(30歲,讀(X))的問題,寫(問題)。
在這種情況下,它等待輸入,並且當輸入輸入時,定時器隨後開始。但我希望定時器從一開始就開始。
我該怎麼辦?
你的做法似乎是合理的:從SWI-Prolog的文檔:「阻塞I/O可以使用read_term/3的超時選項進行處理。 」。
這不是真的信息:用戶更改超時導致了一些bug(我將測試更多,並會以SWI_prolog郵件列表如果合適的話報道),即使在捕捉/ 3。
以下似乎工作
...,
current_input(I),
wait_for_input([I], A, 30),
...
如果不輸入給定(更短的時間來這裏測試...)
?- current_input(I), wait_for_input([I],A,5).
I = <stream>(0x7fa75bb31880),
A = [].
編輯:變量A將保持列表將包含帶有就緒輸入的流列表:我剛剛報告了在超時發生之前用戶沒有輸入任何內容的情況。要獲得實際的輸入,使用您提供的代碼:
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
current_player(I), writef( '及其%d玩家轉:',[I]), 當前_(輸入), wait_for_input([輸入],移動,5), 解釋(移動), 它1.玩家開啓: ERROR:wait_for_input/3:流'[
如果你有興趣在I/O相關超時,請考慮wait_for_input/3
或set_stream/2
。你發現的內置的,call_with_time_limit/2
不是一個簡單可靠的界面。
編輯:我只是看到你用read/1
輸入。請在上面的文檔中閱讀如何避免在read/1
中被阻止。我不清楚爲什麼你需要這個,但用戶可能只需輸入返回,從而繞過了初始超時。 read/1
現在會讀取'\n'
,但然後會等待進一步輸入 - 沒有超時,而用戶大量瀏覽維基百科的答案...甚至可能會問這個問題,所以...
有趣的部分來看看'解釋(移動)'就是。我的意思是,'移動'是一個準備閱讀的輸入列表...所以'移動'這個名稱是不理想的,至少可以說... – false
我應該說輸入嗎?然後我應該像[command |]一樣解析列表參數]? – aladagemre
(如果刪除我們所指的內容,則不容易)如果它的'user_input',您已經知道該名稱。並且它不會像你說的那樣[command | parameter]它可以是'[user_input]'或'[]' – false
請看看我的答案'讀/ 1'! – false