无法与“Stockfish-9-armv7”二进制文件

时间:2018-05-13 16:37:22

标签: c# android unity3d chess uci

我正在开发Unity3D的国际象棋游戏。我想为Android平台开发它。对于AI我使用的是Stockfish国际象棋引擎。我下载了名为“ Stockfish-9-armv7 ”的适用于Android的Stockfish二进制文件。我将此二进制文件放在StreamingAssets文件夹中,以便在构建步骤中正确进入目标平台。一切正常,直到这里,即当我构建我的Unity项目时,文件放在正确的位置,我可以很好地看到它。

enter image description here

现在为了让AI工作,我必须使用UCI协议与这个二进制文件进行通信。所以我在Unity项目中编写了一个C#脚本,它创建了一个运行二进制文件并与之通信的进程。但这不起作用。

然而,当我为Windows执行完全相同的操作时,即使用名为“stockfish_9_x64.exe”的Windows二进制版本的Stockfish并将其构建为独立应用程序,事情完美无缺,我能够通过我的C#与引擎通信代码。

我在网上研究过但无法找到太多资源和指导。我发现了一个similar post并通过阅读让我得出结论,这可能与文件权限有关。提出这个问题的人实际上通过编写这两行代码解决了这个问题:

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

然而,他正在使用Xamarin并且可以访问Java Runtime库。我正在使用Unity和C#,我真的不知道如何更改此二进制文件的执行/运行权限并运行它。事实上,我甚至不知道这是不是问题。

我只想将干鱼整合到我的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);
    }
}

1 个答案:

答案 0 :(得分:0)

适用于与OP和我一样遇到相同问题的任何人。经过12个小时的搜索和谷歌搜索后,这里是一个解决方案。您可以使用可执行的stockfish二进制文件,但必须将二进制文件的扩展名更改为.so,然后将其统一导入到/ Assets / Plugins / Android文件夹中。构建之后,您可以在设备上的/ data / data // lib文件夹中找到它。在这里您可以执行它并获取输入和输出。