ala*_*mre 5 time interpreter prolog limit
我正在为游戏编写解释器。用户将其移动输入解释器,然后程序执行该移动。
现在我想为每个决定实施一个时间限制。玩家不应该想超过 30 秒来写一个移动并按 Enter。
call_with_time_limit 似乎相关,但它不能正常工作:
call_with_time_limit( 30, read(X) ), Problem, write(Problem)。
在这种情况下,它等待输入,当输入时,计时器随后启动。但我希望计时器从一开始就开始。
我该怎么做?
您的方法似乎很明智:来自 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)
华泰