2

チェスのAIをiPhoneに移植したいのですが、やり方がわかりません。どうやら iPhone はマルチスレッドをサポートしていないため、AI を個別にコンパイルするだけではなく、どうにかしてコードにマージする必要があります。

私は sjeng エンジンの実装の GPL コピーを持っていますが、それが c と c++ で書かれており、私が知っているのは Apple objc だけであるため、どのようにそれを行ったのかわかりません。

これを行う方法に関する推奨事項はありますか?スタンドアロン プログラム用の何らかのラッパーを作成する必要があります。

できる限り残しておくコードを含むファイル。

4

4 に答える 4

3

チェスエンジンの iPhone への移植に成功しました。移植は難しくありません。一般的なチェス エンジンのほとんどは、Universal Chess Interface Protocol または Chess Engine Communication Protocol を採用しています。各プロトコルの詳細については、ウィキペディアを参照してください。

ここで、オープン ソースの UCI チェス エンジンの 1 つを使用し、C または C++ でコンパイルするとします。XCode は C および C++ をネイティブにサポートしているため、ソースを XCode にコピーするだけでコンパイルできます。

次のフェーズは、エンジンをインターフェースに接続することです。繰り返しますが、これは難しくありません。プロトコル コマンドをエンジンに送信する必要があります。エンジンは結果を標準出力に返します。UNIX の pipe() を使用して結果をパイプする必要があります。詳細については、iPhoneの他のスレッド Fork() を参照してください。

例:

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 チェス エンジン プロトコルのドキュメントをよくお読みください。必要になります。

于 2010-09-22T02:31:21.880 に答える
1

iPhoneOSはマルチスレッドをサポートしています。NSThreadクラスを参照してください。ただし、iPhone CPUはシングルコアであり、マルチタスクはほとんどありません。

はい、ObjectiveCコードからCおよびC++コードを簡単に呼び出すことができ、その逆も可能です。C ++インタラクションの場合、ソースの名前を.mmに変更します。次に、ObjectiveC++としてコンパイルされます。

私はC++コードをiPhoneに移植した経験が豊富です。チャームのように機能します。

于 2010-03-10T16:41:45.277 に答える
1

Objective CはCのスーパーセットであるため、ライブラリがCで記述されている場合は、ラッパーなしで残りのObjective-Cコードを使用してコンパイルできます。

于 2010-03-10T16:36:00.597 に答える