Я разрабатываю программу для анализа шахматных задач - особенно проблем с эндшпилем - с использованием .exe версии шахматного движка с открытым исходным кодом Stockfish 9 .
Вот (очень упрощенный) 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();
}
}
При вызове метода AnalyzeByFEN
с помощью FEN, вывод на консоль не выводится. Тщательное расследование привело к наблюдению, что цикл while (!process.StandardOutput.EndOfStream)
работает вечно, поэтому вывод никогда не возвращается. Я довольно новичок в процессах, поэтому я уверен, что в моем коде есть некоторые основные ошибки. Как это исправить?
Спасибо!