Prolog用户输入的时间限制(读取)

时间:2011-12-08 21:16:33

标签: time prolog limit interpreter

我正在为游戏写一个翻译。用户进入解释器,程序执行该移动。

现在我想为每个决定实施时间限制。玩家不应该想超过30秒来写一个移动并按回车。

call_with_time_limit似乎相关,但它不能正常工作:

call_with_time_limit(30,读(X)),问题,写(问题)。

在这种情况下,它等待输入,当输入输入时,计时器随后启动。但我希望计时器从头开始。

我该怎么做?

2 个答案:

答案 0 :(得分:3)

如果您对与I / O相关的超时感兴趣,请考虑wait_for_input/3set_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