我正在开发一个程序来分析国际象棋问题——尤其是残局问题——使用开源国际象棋引擎Stockfish 9的 .exe 版本。
这是(非常简化的)EndgameAnalyzer
类:
class EndgameAnalyzer
{
private StockfishOracle oracle = new StockfishOracle();
public void AnalyzeByFEN(string fen)
{
var evaluation = oracle.GetEvaluation(fen);
Console.WriteLine($"{fen}\t{evaluation}");
}
}
该AnalyzeByFEN
方法接收一个FEN(表示国际象棋位置的字符串)并记下该位置的引擎评估。
StockfishOracle
是用于与引擎通信的类(就像预言机用于与众神通信:)),使用UCI 协议。此问题的相关 UCI 命令是:
uci
: 进入 uci 模式。
position fen //followed by a FEN
:设置要分析的位置。
go depth 1
:分析一层(“移动”)深度的位置。
这是(同样,非常简化的)StockfishOracle
类:
class StockfishOracle
{
private Process process = new Process();
public StockfishOracle()
{
process.StartInfo = new ProcessStartInfo()
{
FileName = @"C:\stockfish_9_x64.exe",
UseShellExecute = false,
RedirectStandardError = true,
RedirectStandardInput = true,
RedirectStandardOutput = true
};
process.Start();
SendUCICommand("uci");
}
public string GetEvaluation(string fen)
{
SendUCICommand($"position fen {fen}");
SendUCICommand("go depth 1");
string result = string.Empty;
while (!process.StandardOutput.EndOfStream)
{
result = process.StandardOutput.ReadLine();
}
return result;
}
private void SendUCICommand(string command)
{
process.StandardInput.WriteLine(command);
process.StandardInput.Flush();
}
}
使用 FEN调用该AnalyzeByFEN
方法时,控制台中不会显示任何输出。仔细调查后发现循环while (!process.StandardOutput.EndOfStream)
将永远持续下去,因此永远不会返回输出。我对流程很陌生,所以我很确定我的代码中存在一些基本错误。如何解决这个问题?
谢谢!