【问题标题】:Communicating with XBoard (chess engine) (C++/C)与 XBoard(国际象棋引擎)通信 (C++/C)
【发布时间】:2012-03-22 07:55:51
【问题描述】:

我只是在玩弄一个基本的国际象棋引擎。我能够从http://web.archive.org/web/20070704121716/http://www.brucemo.com/compchess/programming/alphabeta.htm 那里得到很多建议,但真正的网站已经关闭,并且并非所有页面都已存档。 (有人知道在哪里可以找到 Bruce 网站的完整版本吗?)

但现在是真正的问题:我如何与 XBoard 通信?我知道它是通过标准输入和标准输出,但我一直在代码中遇到问题。基本上,要开始,我只想

  1. 从 XBoard 接收输入并将其打印到控制台/屏幕
  2. 将硬编码输入移动到 XBoard 并让它进行移动
  3. 程序实用功能,并有一个随机国际象棋人工智能,它选择随机移动。

在那之后,我可以开始实现真正的东西,比如 alpha-beta 搜索。

我现在被前两件事困住了。这是我尝试编写/借用的一些代码。

#include <iostream>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#define STR_BUFF 256

using namespace std;

int main (int argc, const char * argv[])
{
    char input[STR_BUFF];
    char output[STR_BUFF];
    while(true){
        fflush(stdout);
        // read input
        if (!fgets(input, STR_BUFF, stdin)){
            printf("terminated");
            return 0;;
        }

        printf("%s", input);
    }
    return 0;
}

我在休息大约 6 个月后才回到 C,这是我使用标准输入/标准输出管道与另一个程序(减去一些基本程序)进行通信的第一个项目,所以我将不胜感激任何帮助和任何解释.我知道编写国际象棋引擎是一项艰巨的任务,但我之前已经编写过国际象棋规则,而且我能在 Bruce 的网站上找到的内容绝对令人惊叹。

【问题讨论】:

标签: c++ c io chess


【解决方案1】:

我认为您正在寻找包含在 unistd.h 中的 pipe()。请查看 Can popen() make bidirectional pipes like pipe() + fork()? 以获取有关实施的说明。

【讨论】:

  • 是的,我也使用了 pipe()。这也是 XBoard 的实现方式。
【解决方案2】:

您做的几乎是正确的:使用fgets 从 XBoard 获取命令,然后使用 printffflush 报告移动。 (但有一点是错误的:您不需要“将命令打印到控制台/屏幕”;您没有与控制台/屏幕通信;您只从 XBoard 读取命令并将动作发送回 XBoard)。

可能从一些现有代码开始会更容易。尝试阅读GNU Chess 的来源。或者下载任意other chess engine的源码,支持XBoard协议。

还有其他问题,其中包含有关国际象棋引擎编程的大量信息:“What are some good resources for writing a chess engine?”。

【讨论】:

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