Невозможно связаться с двоичным файлом "Stockfish-9-armv7" - PullRequest
0 голосов
/ 13 мая 2018

Я занимаюсь разработкой шахматной игры в Unity3D.Я хочу разработать его для платформы Android.Для AI я использую шахматный движок Stockfish.Я скачал двоичный файл Stockfish для Android под названием " Stockfish-9-armv7 ".Я поместил этот бинарный файл в папку StreamingAssets, чтобы он правильно вошел в целевую платформу на этапе сборки.Пока все работает нормально, т.е. когда я строю свой проект Unity, файл помещается в правильное место, и я очень хорошо вижу его.

enter image description here

Сейчасчтобы мой AI работал, я должен общаться с этим двоичным файлом, используя протоколы UCI .И поэтому я написал сценарий C # в своем проекте Unity, который создает процесс для запуска двоичного файла и связи с ним.Но это не работает.

Однако, когда я делаю то же самое для Windows, то есть использую двоичную версию Stockfish для Windows с именем stockfish_9_x64.exe и собираю ее как отдельное приложение, все работает отлично, и я могу общаться с движкомчерез мой код C #.

Я исследовал его в Интернете, но не смог найти много ресурсов и рекомендаций.Я нашел аналогичный пост , и его чтение привело меня к выводу, что, возможно, это как-то связано с правами доступа к файлам.Парень, который задал этот вопрос, на самом деле решил проблему, написав две строчки кода:

string[] cmd = { "chmod", "744", Path.Combine(strToFolder, fileName) };
Java.Lang.Runtime.GetRuntime().Exec(cmd);  

Однако он использовал Xamarin и имел доступ к библиотеке времени выполнения Java.Я использую Unity и C #, и я действительно не знаю, как изменить разрешение на выполнение / запуск этого двоичного файла и запустить его.На самом деле я даже не знаю, в этом проблема или нет.

Я просто хочу интегрировать Stockfish в свой проект Unity с Android в качестве целевой платформы.Если у кого-то есть какие-либо идеи, предложения или кто-то делал это раньше, пожалуйста, направьте меня.Даже если я ошибаюсь с самого начала и мой подход ошибочен, дайте мне знать об этом вместе с исправленным подходом.

Ниже приведен мой код:

public class CommunicateWithEngine {

    public static Process mProcess;

    public static void Communicate()
    {
        // since the apk file is archived this code retreives the stockfish binary data and
        // creates a copy of it in the persistantdatapath location.
        string filepath = Application.persistentDataPath + "/" + "Stockfish-9-armv7";
        if (!File.Exists(filepath))
        {
            WWW executable = new WWW("jar:file://" + Application.dataPath + "!/assets/" + "Stockfish-9-armv7");
            while (!executable.isDone)
            {
            }
            File.WriteAllBytes(filepath, executable.bytes);
        }

        // creating the process and communicating with the engine
        mProcess = new Process();
        ProcessStartInfo si = new ProcessStartInfo()
        {
            FileName = System.IO.Path.Combine(Application.persistentDataPath, "Stockfish-9-armv7"),
            UseShellExecute = false,
            CreateNoWindow = true,
            RedirectStandardError = true,
            RedirectStandardInput = true,
            RedirectStandardOutput = true
        };
        mProcess.StartInfo = si;
        mProcess.OutputDataReceived += new DataReceivedEventHandler(MProcess_OutputDataReceived);
        mProcess.Start();
        mProcess.BeginErrorReadLine();
        mProcess.BeginOutputReadLine();

        SendLine("uci");
        SendLine("isready");

    }


    private static void SendLine(string command) {
        mProcess.StandardInput.WriteLine(command);
        mProcess.StandardInput.Flush();
    }

    private static void MProcess_OutputDataReceived(object sender, DataReceivedEventArgs e)
    {
        string text = e.Data;
        Test.PrintStringToTheConsole(text);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...