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

ala*_*mre 5 time interpreter prolog limit

我正在为游戏编写解释器。用户将其移动输入解释器,然后程序执行该移动。

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

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

call_with_time_limit( 30, read(X) ), Problem, write(Problem)。

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

我该怎么做?

Cap*_*liC 1

您的方法似乎很明智:来自 SWI-Prolog 文档:“可以使用 read_term/3 的超时选项来处理阻塞 I/O。'。

这并不是真正的信息:更改用户的超时会导致一些错误(我将测试更多,并在适当的情况下向 SWI_prolog 邮件列表报告),即使在 catch/3 下也是如此。

以下似乎有效

...,
current_input(I),
wait_for_input([I], A, 30),
...
Run Code Online (Sandbox Code Playgroud)

如果没有给出输入(这里测试的时间更短......)

?- current_input(I), wait_for_input([I],A,5).
I = <stream>(0x7fa75bb31880),
A = [].
Run Code Online (Sandbox Code Playgroud)

编辑:变量 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).
Run Code Online (Sandbox Code Playgroud)

华泰