我正在为游戏写一个翻译。用户进入解释器,程序执行该移动。
现在我想为每个决定实施时间限制。玩家不应该想超过30秒来写一个移动并按回车。
call_with_time_limit似乎相关,但它不能正常工作:
call_with_time_limit(30,读(X)),问题,写(问题)。
在这种情况下,它等待输入,当输入输入时,计时器随后启动。但我希望计时器从头开始。
我该怎么做?
答案 0 :(得分:3)
如果您对与I / O相关的超时感兴趣,请考虑wait_for_input/3
或set_stream/2
。您找到的内置call_with_time_limit/2
不是简单可靠的界面。
编辑:我只是看到您使用read/1
进行输入。请在上面的文档中阅读如何避免在read/1
中阻止。我不清楚为什么你需要这个,但用户可能只需输入 Return ,从而绕过初始超时。 read/1
现在会读取'\n'
但是会等待进一步的输入 - 没有超时,而用户慷慨地浏览维基百科以获得答案......甚至可能会问SO ...
答案 1 :(得分:1)
您的方法似乎合情合理:来自SWI-Prolog文档:'可以使用read_term / 3的timeout选项来处理阻塞I / O. ”。
这不是真正的信息:更改用户的超时会导致一些错误(我会测试更多,并且如果合适,将报告给SWI_prolog邮件列表),即使在catch / 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