与XBoard(国际象棋引擎)进行通信(C ++ / C)

时间:2012-03-04 16:23:37

标签: c++ c io chess

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

但现在谈到真正的问题:我如何与XBoard沟通?我理解它是通过stdin和stdout,但我在代码中遇到了问题。基本上,要开始,我只想

  1. 从XBoard接收输入并将其打印到控制台/屏幕
  2. 将硬编码输入移动到XBoard并让它移动
  3. 程序实用程序功能并具有随机棋ai,其选择随机移动。
  4. 之后,我可以开始实现像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,这是我使用stdin / stdout管道与另一个程序(减去一些基本程序)进行通信的第一个项目,所以我将不胜感激任何帮助和任何解释。我知道编写一个国际象棋引擎是一项艰巨的任务,但我之前已经编写了国际象棋规则,而我能找到的布鲁斯网站绝对令人惊叹。

2 个答案:

答案 0 :(得分:3)

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

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

以下是关于国际象棋引擎编程的大量信息的另一个问题:“What are some good resources for writing a chess engine?”。

答案 1 :(得分:1)

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