Как вы портируете шахматный AI на iPhone - PullRequest
2 голосов
/ 10 марта 2010

Я бы хотел перенести шахматный ИИ на iPhone, но не могу понять, как это сделать. Очевидно, что iPhone не поддерживает многопоточность, поэтому вы не можете просто отдельно скомпилировать ИИ, но должны каким-то образом объединить его с кодом.

У меня есть копия GPL реализации движка sjeng, но я не могу понять, как они это сделали, потому что она написана на c и c ++, и все, что я знаю, это apple objc.

У кого-нибудь есть рекомендации, как это сделать? Мне нужно сделать какую-нибудь оболочку для отдельной программы.

файл с кодом , который я оставлю так долго, как смогу.

Ответы [ 4 ]

3 голосов
/ 22 сентября 2010

Я успешно перенес шахматный движок на iPhone. Это не сложно для портирования. Большинство популярных шахматных движков используют универсальный протокол интерфейса шахмат или протокол связи шахматного двигателя. Прочитайте Википедию для более подробной информации о каждом протоколе.

Теперь, скажем, вы берете один из шахматных движков UCI с открытым исходным кодом, и он компилируется на C или C ++. XCode изначально поддерживает C и C ++, поэтому все, что вам нужно, это скопировать исходные коды в XCode, и они будут скомпилированы.

Следующим этапом будет подключение двигателя к вашему интерфейсу. Опять же, это не сложно. Вам нужно будет отправить команды протокола в движок, движок вернет вам результаты на стандартном выходе. Вам нужно будет передать результаты, используя pipe () UNIX. Прочитайте мою другую ветку Вилка () на 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 голос
/ 10 марта 2010

iPhone OS поддерживает многопоточность; см. NSThread класс. Вы не получите от этого никакой дополнительной производительности - процессор iPhone одноядерный и многозадачности практически нет.

И да, из кода Objective C вы можете легко вызывать код на C и C ++, и наоборот. Для взаимодействия с C ++ переименуйте ваши источники в .mm; затем они скомпилированы как Objective C ++.

У меня достаточно опыта переноса кода C ++ на iPhone. Работает как шарм.

1 голос
/ 11 марта 2010

Ваш вопрос на самом деле сложнее, чем должен быть, потому что я думаю, что ваша основная проблема не связана с компиляцией специально для iPhone.

Если вы говорите, что у вас уже есть некоторый шахматный ИИ-код, то где-то там происходит вызов функции оценки, которая принимает состояние игры (положение на доске и игрок для перемещения) и возвращает ход. Это то, что вам нужно детализировать и найти, потому что это, по сути, «движок», который будет управлять вашим приложением, независимо от того, для какой платформы вы компилируете.

Теперь я предполагаю, что этот шахматный ИИ предполагает, что поиск ходов выполняется в своем собственном потоке, что, вероятно, является конструктивным решением, позволяющим легко «прервать» поиск в любое время и заставить его воспроизводить свой собственный ход. Конечно, вы можете запускать код в отдельных потоках на iPhone, поэтому проблема для вас состоит в том, чтобы выяснить, как извлечь этот код, чтобы освободить его от любых существующих платформенных зависимостей.

Это может помочь вам сначала подойти к этой проблеме, как если бы вы писали утилиту командной строки в C для работы в Mac OS X. Это избавит вас от многих зависимостей и упростит ситуацию для вас. Я предполагаю, что, как только вы это сделаете, у вас сразу появится хорошее представление о том, как заставить его работать в среде (Какао) iPhone.

1 голос
/ 10 марта 2010

Objective C - это расширенный набор C, поэтому, если библиотека написана на C, вы можете просто скомпилировать ее с остальной частью вашего кода Objective C без каких-либо оболочек.

...