質問
(座標の)リストを3つ作成しますか
- 空のポジション
- 黒の位置
- ホワイトポジション
または必要なときに配列をループして、結果を毎回再生するだけですか?
何が最良でしょうか? (速度に関して)
解決
2つの主な選択肢は、速度とコードの明確さです。
速度が優先される場合、ボード上のピースのセットごとに64ビットデータ型を使用する必要があります(たとえば、白いポーン、黒いクイーン、パッサンのポーン)。移動を生成し、移動の合法性をテストするときに、ネイティブのビット単位の操作を利用できます。
コードの明瞭さを優先する場合は、ビットシャッフルを忘れて、他の人が既に提案しているようなうまく抽象化されたデータ型を選びます。この方法を使用すると、おそらくパフォーマンスの上限に達することを覚えておいてください。
開始するには、 Crafty (C)および SharpChess (C#)。
(もともと投稿されたこちら)
他のヒント
探しているのは、ボード表現です。 Chess Programming Wiki には、トピックに関する非常に詳細なセクションがあります(間違いなく読む価値があります) AIの作成について真剣に考えてください)、ウィキペディアはこのテーマの概要を説明しています。
適切なボード表現を選択するときは非常に思慮深くすることが重要です-それらはすべて独自の利点(および落とし穴)を提供します-主に移動の実行やボード状態の評価などの特定の操作の速度/実行に関係しますO(1)からO(n)までの時間の複雑さ(方法とタスクに応じて)。私の知る限り、「ベスト」に関するコンセンサスはまだありません。ボード表現ですが、最近は一般に一部が好まれています(たとえば、ビットボードは必須アイテムです) 。これが、ほとんどの強力なチェスAIが、動きを検索するときに複数(最大4または5まで)の異なるボード表現を使用するのが一般的である理由です。
次のような64項目の配列を提案します。
byte [64] Squares;
この方法では、チェス盤の位置を1バイトで表すだけで済み、はるかに高速です。
チェス盤の位置を参照するために単一のインデックスを扱う場合、生活を楽にするために知っておくべきことがいくつかあります。たとえば、2つの位置が両方とも同じ行または列にあることをどのように知るのですか?それを理解する簡単なトリックがあります。
行
位置の行を計算するには、位置を8で除算し、結果の整数部分を取得します。たとえば、位置63を8で割った値は7.875で、行7に相当します。位置3を8で割った値は0.375ですので、0です。
Row = (int)(position / 8)
列
ポジションの列を計算するには、ポジションモジュラス8を実行してモジュラス演算子を使用します。たとえば、ポジション24モジュラス8は列0です。ポジション15モジュラス8は7です。したがって、
Column = position % 8
これらの2つの概念を活用して、64の正方形ボード上の任意の位置を列と行に変換できます。
独自のチェスエンジンの作成について詳しく知りたい場合は、 http://www.chessbinをご覧ください。 com