我正在构建一个国际象棋引擎,并尝试使用我之前使用过的名为 perftree 的程序来测试它。为了让 perftree 能够使用我的代码,我需要以某种方式格式化我的输出。这是 perftree 自述文件的相关部分:
perftree
需要某种方式来调用国际象棋上的 perft
函数
引擎。目前,它希望用户提供一个脚本,该脚本将是
像这样调用:
./your-perft.sh "$depth" "$fen" "$moves"
哪里
$depth
是评估的最大深度,
$fen
是某个碱基位置的 [Forsyth-Edwards Notation][fen] 字符串,
$moves
是一个可选的、以空格分隔的从基本位置开始的移动列表
到要评估的位置,其中每个移动的格式为
$source$target$promotion
,例如e2e4
或 a7b8Q
。
该脚本预计将 perft 函数的结果输出到标准 输出,格式如下:
对于当前位置的每个可用动作,打印该动作和 给定深度处作为该移动的祖先的节点数, 用空格分隔。
在动作列表后,打印一个空行。
最后,在其自己的行上打印总节点数。
例如,这就是起始位置的深度 3 perft 应该看起来的样子 喜欢:
$ ./your-perft.sh 3 "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1"
a2a3 380
b2b3 420
c2c3 420
d2d3 539
e2e3 599
f2f3 380
g2g3 420
h2h3 380
a2a4 420
b2b4 421
c2c4 441
d2d4 560
e2e4 600
f2f4 401
g2g4 421
h2h4 420
b1c3 440
g1h3 400
b1a3 400
g1f3 440
8902
我已经得到了输出类似内容的代码。这是我的代码:
let mut move_options = Vec::new();
game.generate_moves(&mut move_options, &all_move_data);
let mut total_nodes = 0;
let mut log_file = OpenOptions::new().create(true).append(true).open("perftree_output.log").expect("failed to open log file");
let mut output = String::new();
for game_move in move_options {
let move_nodes = count_nodes(depth, &game_move, &game, &all_move_data);
total_nodes += move_nodes;
output.push_str(&format!("{} {}\n", game_move, move_nodes));
//println!("{} {}", game_move, move_nodes);
}
output.push_str("\n");
output.push_str(&format!("{}\n", total_nodes));
//println!("{}", output);
output = output.trim().to_string();
write!(io::stdout(), "{}", output).expect("failed to write to stdout");
write!(log_file, "{}", output).expect("failed to write to log");
以及使用 perftree 时输出到日志文件:
a2a3 20
b2b4 20
b2b3 20
c2c4 20
c2c3 20
d2d4 20
d2d3 20
e2e4 20
e2e3 20
f2f4 20
f2f3 20
g2g4 20
g2g3 20
h2h4 20
h2h3 20
b1a3 20
b1c3 20
g1f3 20
g1h3 20
400
在我看来是对的,但 perftree 说
cannot compute diff: invalid digit found in string
。
我无法弄清楚为什么 perftree 在该输出中看到无效数字。我不认为这是 perftree 的问题,因为我以前使用过它并且效果很好。
编辑:这是一个 bash 脚本,无论输入如何,它都应该准确输出 perftree 所期望的内容:
#!/bin/bash
echo "a2a4 20"
echo "a2a3 20"
echo "b2b4 20"
echo "b2b3 20"
echo "c2c4 20"
echo "c2c3 20"
echo "d2d4 20"
echo "d2d3 20"
echo "e2e4 20"
echo "e2e3 20"
echo "f2f4 20"
echo "f2f3 20"
echo "g2g4 20"
echo "g2g3 20"
echo "h2h4 20"
echo "h2h3 20"
echo "b1a3 20"
echo "b1c3 20"
echo "g1f3 20"
echo "g1h3 20"
echo
echo "400"
我试过了,还是不行
我想通了!我的代码没有问题。问题出在鳕鱼干上。我在 perftree github 页面上发现它的最后一次提交是 3 年前。所以我下载了stockfish 13,它在上次提交之前发布,并且它有效!