你如何将国际象棋AI移植到iPhone上

时间:2010-03-10 16:31:05

标签: iphone integration artificial-intelligence chess

我想将国际象棋AI移植到iPhone,但我无法弄清楚如何做到这一点。显然iPhone不支持多线程,所以你不能单独编译AI,但必须以某种方式将其合并到代码中。

我有一个关于sjeng引擎实现的GPL副本,但我无法弄清楚它们是如何做到的,因为它是用c和c ++编写的,我所知道的只是apple objc。

有没有人有关于如何做到这一点的任何建议?我需要为什么是独立程序制作一些包装器。

带有code

文件,我会尽可能长时间留下来。

4 个答案:

答案 0 :(得分:3)

我已成功将国际象棋引擎移植到iPhone。移植并不困难。大多数流行的国际象棋引擎采用通用国际象棋接口协议或国际象棋引擎通信协议。阅读Wikipedia以获取有关每个协议的更多详细信息。

现在,假设您使用其中一个开源UCI国际象棋引擎,并在C或C ++上编译。 XCode本身支持C和C ++,因此您需要做的就是将源代码复制到XCode并进行编译。

下一阶段是将引擎连接到您的界面。同样,这并不困难。您需要将协议命令发送到引擎,引擎会根据标准输出返回结果。您需要使用UNIX的pipe()来管道结果。阅读我的其他帖子 Fork() on iPhone了解更多详情。

示例:

假设engine_loop是引擎的游戏循环(所有引擎都必须有一个循环)。

engine_loop(int fd[])
{
  dup2(fd[1], STANDARD_OUTPUT);

  while(true)
  {
    printf("e4\n"); // This is dumb, we always make the same move, but you get the idea
  }
}

my_objective_c_function()
{
  int fd[2];
  pipe(fd);
  engine_loop(fd);
  char buffer[1024];
  read(fd[0], buffer, 1024);

  // buffer == "e4"

  // Send "e4" to the interface
}

代码片段向您展示了如何将引擎的结果发送到您的界面。现在,你需要做相反的事情。这与上面的代码非常相似。在实际场景中,一旦建立连接,您将需要发送UCI命令,我将举例说明:

ucinew
isready
go infinite
stop

请仔细阅读UCI国际象棋引擎协议文档。你需要它。

答案 1 :(得分:1)

Objective C是C的超集,所以如果库是用C语言编写的,你可以使用其余的Objective-C代码编译它而不需要任何包装器。

答案 2 :(得分:1)

iPhone OS支持多线程;看NSThread类。但是你不会从中获得任何额外的性能 - iPhone CPU是单核的,而且几乎没有多任务处理。

是的,从Objective C代码中,您可以轻松调用C和C ++代码,反之亦然。对于C ++交互,将源重命名为.mm;然后将它们编译为Objective C ++。

我有足够的经验将C ++代码移植到iPhone。像魅力一样。

答案 3 :(得分:1)

你的问题实际上比它需要的更复杂,因为我认为你所遇到的基本问题与专门为iPhone编译无关。

如果你说你已经有一些国际象棋人工智能代码,那么就会在某个地方调用一个评估函数来调用游戏状态(棋盘位置和玩家移动),然后回复移动。这就是你需要深入挖掘并找到的东西,因为它本质上是驱动你的应用程序的“引擎”,无论你正在编译什么平台。

现在,我的猜测是这个国际象棋AI假设移动搜索是在自己的线程中运行的,可能是一个设计决定,可以让它随时“中断”搜索并让它自己动作。你当然可以在iPhone上的不同线程中运行代码,所以问题在于弄清楚如何梳理出代码,使其免受现有平台依赖性的影响。

这可能有助于您首先解决此问题,就像您在C语言中编写命令行实用程序一样,以便在Mac OS X上运行。这将使您摆脱许多依赖关系并简化您的情况。我的猜测是,一旦你完成了这个,你就会立即知道如何让它在(可可)iPhone环境中运行。