【问题标题】:Connect Chess Engine with C++ GUI Program用 C++ GUI 程序连接国际象棋引擎
【发布时间】:2015-05-04 12:03:29
【问题描述】:

我想将我的 C++ 程序与国际象棋引擎连接起来,以便为敌人提供 AI。 在我的 c++ 程序中——>用户将移动(例如 A2A3)——>我将把这个字符串传递给国际象棋引擎——>引擎将更新棋盘——>引擎将启动 AI 以计算敌人的移动——>引擎会将敌人的移动作为字符串(例如 A7A6)提供给我的 C++ 程序-->etc

我读到,为了让我的程序与国际象棋引擎交互,我必须启动 chess_engine.exe 文件并通过标准输入/输出与其交换命令。

你能告诉我我的 Visual Studio 程序代码如何准确地启动一个 exe 文件并与之交换命令吗?有什么例子吗?

提前谢谢你。

【问题讨论】:

  • 哪个操作系统?还是您使用 C++11 或 Boost?对于 Windows,请参阅 msdn.microsoft.com/en-us/library/windows/desktop/…
  • 你应该使用UCI国际象棋接口,它基本上使用管道通过stdio/stdout在前端和引擎之间交换信息。
  • 是的,据我所知,UCI 是一组在我的应用程序和国际象棋引擎之间交换的规则/命令。所以我需要通过我的应用程序打开 .exe 引擎,然后与引擎通过 std I/O 或者我可以使用允许我指定国际象棋引擎文件的准备好的代码,然后使用准备好的函数,如--> pass_command(a2a3) ?
  • 我只使用 windows 和 c++(不是 boost)

标签: c++ io exe standards chess


【解决方案1】:

一个常见的误解是您的引擎需要单独启动并将自身连接到 GUI。相反,GUI 本身将打开您的引擎并将其作为子进程运行。 GUI 将使用 std_in 和 std_out 与您的引擎进行通信。在 C++ 中,这就像使用 cin 和 cout 一样简单。从你的引擎, 流入 cout 的任何内容都将发送到 GUI,而从 cin 流入的任何内容都将从 GUI 接收。在某种程度上,国际象棋 GUI 取代了您的终端。

根据 UCI 规范,GUI 发送给引擎的第一条消息是“uci”,告诉引擎切换到 uci 模式。从您的引擎的角度来看,您的代码可能看起来像这样。

#include <iostream>
#include <string>
using namespace std;

int main()
{
    string msg;
    getline(cin, msg);    // Read message from GUI
    
    // Does the GUI want use to switch to UCI mode?
    if (msg == "uci") {
        // Yes, switch to UCI move
        
        // Send some engine info to GUI
        cout << "id name MyEnginesName" << endl
             << "id author MyName" << endl;  // The endls are very important
        
        // --- GUI will now send some settings to our engine ---

        // Read option settings from GUI
        while (getline(cin, msg)) {
            if (msg == "uciok") {
                break; // Last option has been received
            }
            else {
                // Parse msg and store option settings
                // ...
            }      
        }

        // Bunch more code here   
    }
    
    cout << "Press any key...";
    cin.get();
    return 0;
}

学习 UCI 协议的一个好方法是自己在命令行上进行练习。下载与 UCI 兼容的国际象棋引擎,例如 lc0stockfish。打开终端并 cd 进入引擎目录。在命令行上运行引擎应用程序并开始输入 UCI 命令,就像您是 GUI 一样。

【讨论】:

  • 无法理解代码。我正在寻找与 SomeEngine.exe 通信的代码。如何从我的 C++ 代码启动 SomeEngine.exe 以及如何发送和接收 UCI 命令。我知道 UCI 命令,我想知道从我的 GUI 发送和接收 UCI 命令的代码。
  • 在这种情况下,最好的方法是作为一个子进程运行一个进程并使用管道与其通信。管道基本上是像 cin 和 cout 这样的 iostream,除了接收器是进程而不是文件或 std_in/std_out。 boost-process 是一个用于运行和与子进程对话的优秀库。这是一个很棒的教程boost.org/doc/libs/1_74_0/doc/html/process.html 的链接。专注于同步管道。此外,为了将 boost 集成到您的项目中,我强烈推荐使用 vcpkg。添加第三方库很困难,vcpkg 会自动将 boost 集成到您的项目中。
  • 让我知道它是否有效。
  • 感谢钢铁侠。我对 Win32 命令感兴趣,而无需使用外部库。因此,我正在查看这个 Stackoverflow 线程:stackoverflow.com/questions/21458166/…
【解决方案2】:

为此,您需要使用引擎启动一个新线程或进程。通常,您将通过启动一个新流程来完成此操作,其中引擎的主要功能将是新流程的起点。

现在,您的应用程序中有两个进程。您的 GUI 应用程序是父进程,而引擎本身将是子进程。您需要通过标准国际象棋 UCI 协议与引擎进行通信。您可以将输入和输出通过管道传输到子进程(即引擎)。

假设您想开始一个新游戏。您将发出以下 UCI 命令:

isready
ucinewgame

请仔细阅读 UCI 规范。您可以在 Google 上获得它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-02
    • 2012-03-22
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多