在php脚本下运行Stockfish国际象棋引擎

时间:2015-08-04 18:59:39

标签: php bash shell chess

我正在考虑制作一个php脚本来打开stockfish国际象棋引擎CLI,发送少量命令并取回输出。 我想我可以通过管道数组使用proc_open来实现这一目标,但我无法弄清楚如何等待整个输出......如果还有另一个更好的解决方案,那就太受欢迎了!

这是我的代码:

// ok, define the pipes
$descr = array(

    0 => array("pipe", "r"),
    1 => array("pipe", "w"),
    2 => array("pipe", "w")
);

$pipes = array();

// open the process with those pipes
$process = proc_open("./stockfish", $descr, $pipes);

// check if it's running
if (is_resource($process)) {

    // send first universal chess interface command
    fwrite($pipes[0], "uci");
    // send analysis (5 seconds) command
    fwrite($pipes[0], "go movetime 5000");

    // close read pipe or STDOUTPUT can't be read
    fclose($pipes[0]);

    // read and print all output comes from the pipe
    while (!feof($pipes[1])) {

        echo fgets($pipes[1]);

    }

    // close the last opened pipe
    fclose($pipes[1]);

    // at the end, close the process
    proc_close($process);

}

这个过程似乎开始了,但是我发送到进程的第二个STDINPUT无法等到它完成,因为第二个命令产生分析线大约5秒,结果它立即打印出来。 我该怎么做呢?

CLI linkCLI documentation link

如果您需要,请向我询问有关此引擎的更多信息。

谢谢!

3 个答案:

答案 0 :(得分:1)

fwrite($pipes[0], "uci/n");
fwrite($pipes[0], "go movetime 5000/n");

没有/ n Stockfish将此视为一个命令(ucigo movetime 5000)并且无法识别它。

答案 1 :(得分:0)

实际上,您的代码有效。 $ pipes [1]包含了鳕鱼的所有输出......

您可能需要更改行

position startpos moves 5000

到不同的数字,因为5000意味着5000毫秒= 5秒,即。发动机停止的时间。尝试10000,发动机在10秒后停止等。

答案 2 :(得分:0)

您需要删除:"fclose($pipes[0]);"并在while循环中检查“bestmove”,如果找到bestmove - 打破循环,然后只放“fclose($pipes[0]);”。那对我有用。并在命令末尾添加“\n”分隔符。

感谢提供代码!