2011-12-08 48 views
4

我正在爲遊戲編寫一個解釋器。用戶進入解釋器,程序執行該移動。Prolog用戶輸入的時間限制(閱讀)

現在我想實施每個決定的時間限制。玩家不應該想到超過30秒的時間來寫出移動並按下回車鍵。

call_with_time_limit似乎相關,但它沒有這樣正常工作:

call_with_time_limit(30歲,讀(X))的問題,寫(問題)。

在這種情況下,它等待輸入,並且當輸入輸入時,定時器隨後開始。但我希望定時器從一開始就開始。

我該怎麼辦?

+0

請看看我的答案'讀/ 1'! – false

回答

1

你的做法似乎是合理的:從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

+0

current_player(I), writef( '及其%d玩家轉:',[I]), 當前_(輸入), wait_for_input([輸入],移動,5), 解釋(移動), 它1.玩家開啓: ERROR:wait_for_input/3:流'[(100ECB58)」不存在(無效參數) – aladagemre

3

如果你有興趣在I/O相關超時,請考慮wait_for_input/3set_stream/2。你發現的內置的,call_with_time_limit/2不是一個簡單可靠的界面。

編輯:我只是看到你用read/1輸入。請在上面的文檔中閱讀如何避免在read/1中被阻止。我不清楚爲什麼你需要這個,但用戶可能只需輸入返回,從而繞過了初始超時。 read/1現在會讀取'\n',但然後會等待進一步輸入 - 沒有超時,而用戶大量瀏覽維基百科的答案...甚至可能會問這個問題,所以...

+0

有趣的部分來看看'解釋(移動)'就是。我的意思是,'移動'是一個準備閱讀的輸入列表...所以'移動'這個名稱是不理想的,至少可以說... – false

+0

我應該說輸入嗎?然後我應該像[command |]一樣解析列表參數]? – aladagemre

+0

(如果刪除我們所指的內容,則不容易)如果它的'user_input',您已經知道該名稱。並且它不會像你說的那樣[command | parameter]它可以是'[user_input]'或'[]' – false