チェスエンジンを書くための最良のアプローチは?[閉まっている]


15

私はチェス好きでプログラマーです。私は最近、チェスとプログラミングの知識を使用してチェスエンジンの作成を開始することにしました。だからここに私の質問があります:

チェスエンジンを作成するときに、どの言語(Java、C ++、Pythonに精通しています)と方法論を適応させる必要がありますか?

少しのガイダンスをいただければ幸いです。

編集:

そこで、JavaScriptで作成することにしました。この Chess UIをgithubからダウンロードすると、準備は完了です!私の最初のステップは、そのための法的動きを書くことです。だから、誰かが私を正しい方向に向けることができますか?(私はjQueryを初めて使用しますが、多くのプログラミング経験があります)。

PS:私は非常に効率的なエンジンを作ろうとはしていません(私はその方法が難しすぎることを知っています)、ただプロセスに精通し、途中でいくつかの新しいテクニックを学びたいです。


5
主流の言語と方法論であれば、チェスエンジンに関して特別なことは何もありません(その点で)。
ヤニス

3
私は目標についてより具体的になります。単に一連の暗記ルールに要約したい場合、それは大きなタスクですが、プログラマーはそれを総当たり的な方法で分類できます。パターン認識やリスクと報酬の比較などを行いたい場合は、そこから答えを得ることができます。
エリックReppen

Chess Engine wikiのPedagogicalセクションをチェックアウトしましたか。これらは特にチェスプログラミングを教えるためのものであり、すべてオープンソースです。あなたは、実際のソースコードを使用しない場合でも、ドキュメントは通常、開発の背後に何があるかを説明します:en.wikipedia.org/wiki/Chess_engine#Categorizations
user60812

1
本当に難しいのは、選択するためにポジションAがポジションBよりも良いかどうかを確認する必要があるため、特定のポジションを評価する方法です。

1
あなたが知りたいことはまったく明確ではありません。ポジションの表現を決定しましたか?もしそうなら、次のステップはムーブジェネレータを書いてテストすることです。jQueryがそれとどう関係していると思うかわかりません。
ケビンクライン

回答:


19

2072級のチェスプレーヤーはこちら。私が作っこのウェブサイトを週末に純粋なJavaScriptで。それはチェスエンジンではありません(私は一種のひねくれたChess960エンジンのように面白い開始位置を作成するように設計しました)が、それは出発点です。ソースコードはこちらです。

機能的なボードの作成には、多くの複雑な問題が伴います。これらには以下が含まれます。

  • 最初に、基本的な法的動きをどのように表現するかを考えます。開始座標と終了座標を使用して数学を行う必要があります。たとえば、ルークの移動では、座標の1つが前後で同じである必要があります。ナイトの動きでは、座標変化の絶対値の合計は3でなければならず、両方の座標が変化しなければなりません。ビショップの移動では、座標の合計が同じままであるか、両方が同じ量だけ増加します。ポーンは、2つの正方形または1つの正方形を移動できるかどうかを把握する必要があるだけでなく(移動した回数を保存する代わりに行と色を確認する必要がある)、キャプチャ全体を斜めに処理する必要があるため、最も扱いにくい-前方のもの。
  • ポーンとチェックのため、キャプチャは挑戦です。ピースが別のピースの正方形に移動した場合、それはキャプチャであると言うことはできません。結局のところ、ポーンは他の駒の正方形に移動してキャプチャすることはできません-ポーンは独自の特殊なキャプチャ方法を持っています。
  • それが合法であるかどうかを判断するために、敵の駒が駒の動きを邪魔しているかどうかを確認する効率的な方法を見つけ出す必要があります。
  • チェックは対処が困難です。移動するたびに、敵の駒が移動できるすべてのマスをチェックし、そのうちの1つがあなたの王に関係しているかどうかを確認する必要があります。
  • キャスリング、アンパッサン、プロモーション、膠着状態、強制ドロー、繰り返し-これらはどれも、問題の規模を考えると簡単に対処できるものではありません。

すべてのチェスエンジンは、ポジション内のすべての(おそらくヒューリスティックに決定されたサブセット)を調べ、数値を評価してそれらのムーブを行い、結果のポジションに対して同じことを再帰的に行うことで相対的な値を表すことで動作します。あなたの双子の問題はここにあります

  • このデータを効率的に保存する方法
  • この再帰的検索を続行する方法-結局、それを永遠に続けることはできないので、制限を設定し、その制限内で最適かつ徹底的な検索を行うためのアルゴリズムを設計する方法を見つけ出す必要があります。たとえば、少なくとも開始可能な動きごとに何らかの評価を行うことを確認する必要がありますが、すべての動きに同じ時間を与えるのではなく、より有望な動きを評価するのにより多くの時間を費やすこともできます。

これはすべて、そもそもアルゴリズムの設計に加えて、多くの情報が利用可能です。

どの言語を使用するかについては(すでにJavaScriptを決定していると思いますが)、他の何よりもあなたの目標に依存していると思います。私は私のものをオンラインにしたかったので(そしてJavaScriptをより良くしたかった)、JavaScriptが私の選択でした。ただし、オブジェクト指向プログラミング言語ならどれでも可能です。

自分がやっていることに慣れたら、次のリソースがおそらく非常に役立つことがわかるでしょう。

幸運を!


たくさんのおかげで、それは確かに私がたくさん始めるのに役立ちました。学ぶことと実装することはまだたくさんありますが、チェスエンジンは簡単に書くことはできません。しかし、私はあなたが愛する何かと仕事をするのが良いと思います!
アドナンザヒド

同意する。私はプロジェクトの非常に多様な履歴書を持ちたかったのですが、正直なところ、チェスの開発をもっと楽しんでいます。
アンドリューレイサム

ドメインlathamcity.comは現在販売中です。コードは別のWebサイトで利用可能になりましたか?
IkWeetHetOokNiet

14

概念としての「チェスプログラム」の問題は、多くの時間を吸収できる多くの要素があり、必ずしも現時点では興味がないことです。グラフィックス、アルファベータ検索、または視覚化に取り組んで、検索エンジンの開発を支援するために何年も費やすことができます。または...たくさんあります。

オープンソースのチェスプログラムを見つけて(多くなければなりません)、最も興味のある部分を改善することをお勧めします。最終的には、プログラム全体を一度に1つの関数で置き換えるか、十分な学習を行い、それを捨てて独自のプログラムをゼロから設計するように動機付けられます。いずれにせよ、プログラム全体を設計する前に、「光」を開始し、ロープを学ぶことが重要です。


確立されたインターフェイスプロトコルのいずれかに準拠することにより、既存のフロントエンドをエンジンで使用できます。

アルファベータ版を書くのに何年もかからないことを願っています
ケビン

1
何年も書くのではなく、何年も
苦労する

9

チェスのルールに精通している場合、基本的なテクニックについての良い出発点はhttp://www.frayn.net/beowulf/theory.htmlです ここにある資料とリンクの広範なコレクション: http:// chessprogramming .wikispaces.com / そして3番目:他の人のコードから学ぶ。Craftyのソースをご覧ください。最先端のオープンソースエンジンです。非常に重要なのは、テストケースについて考え、改善するかどうかを確認することです。たとえば、3〜4桁の簡単なゲーム終了ポジションから始めます。


3

前述のように、チェスエンジンを構築するのにそれほど難しいことはありません。おそらく、このアプリケーションを使用する方法と(潜在的に)デプロイする方法に集中する必要があります。これにより、おそらく言語の選択が決まるからです。

これが単なる楽しい演習である場合は、JavascriptでコーディングしてWebページとしてデプロイすることをお勧めします。あなたがそれを専門のチェスゲームにしたくないなら、少なくとも他の人はそれとそのソースコードで遊ぶことができます。

WPFのように特定の技術を同時に学びたい場合、これは1石で2羽の鳥を殺すのに良い方法かもしれません。MVVMはこのアプリにとってはやり過ぎかもしれませんが、少なくともそれは覚えているでしょう。

Androidデバイスをターゲットにしたい場合は、Javaが適しています。同様に、iOSデバイス用のObjective-C。

長いことも短いこともありますが、言語の選択は真空状態では存在しません。


3

Min-Maxの概念、ツリーと枝刈り、ヒューリスティックおよびその他の基本についてはすでにご存知だと思います。ここで書いているのは、過小評価されている可能性のある詳細の一部です。

会社の友人と私は時々前に自分のチェスエンジンを書いた。私たちが持っていたいくつかの問題やアイデアを共有し、それらがあなたの役に立つことを願っています。

二人ともJavaプログラマだったので、私たちの言語はJavaに変わり、オブジェクト指向のアプローチから始めました。ピースはオブジェクト、ボードはオブジェクト、ファイルとランク(チェス文学の行と列)はオブジェクトでした。そして、これは間違っていました。オーバーヘッドは非常に大きく、プログラムは検索ツリーで2移動(4プライ)を超えるのに苦労していました。

そのため、いくつかの検索で、素晴らしいアイデアになりました(ただし、私たちのアイデアではありません!)。ピースとボードを長整数(64ビット)として表現します。チェス盤には64個の正方形があるため、これは理にかなっています。残りは少し賢明な操作でした(CPUに非常に近い速度で実行=非常に高速)。たとえば、あなたの作品が攻撃できるボード上の正方形を1が提示しているバイナリ64ビット整数を考えてみましょう。このように2つの数値間で論理「AND」を実行すると、ゼロ以外の結果は、攻撃者との正方形があることを示します。チェス盤と駒を提示するにはいくつかの方法があります。

1- ボードプレゼンテーションについて決定する

次に、データベースを開く必要があります。チェスのオープニングは何らかの形で解決され、オープニングブックを持っていることを強くお勧めします。この場合、電撃戦には余計な時間がかかります。

2-最初の本を見つけます。

私たちはこれらを行いましたが、それでも私たちは良いとはほど遠いものでした:

3-優れたチェスエンジンは、6ムーブ(12プライ)先を見ることができるはずです。

そのため、私たちが行ったのは、デッドタイムを使用することでした(人間とコンピューターのエンジンの場合)。

4-相手がツリーのいくつかのレベルを作成することを考えている時間を使用します。

それでも、私たちは12プライから遠く離れていました。さらに研究することで、いくつかのトリックを発見します!たとえば、ツリーの1つの層をスキップし、次の層から開始することが提案されました(対戦相手がないように)。アイデアは、動きが非常にばかげている場合、なぜ時間を無駄にし、その動きに対する対戦者の反応を確認することです。ただし、1つの優れたエンジンは、ばかげた動きと天才の女王の犠牲を区別できるはずです。

5- この特定の問題(チェス)のプログラミングトリック学びます。

私と私の友人は、この状態ではまだ悪かったです:/私たちができること-そして部分的にやったこと-は、計算された位置を保存することでした。位置を計算したら、将来のために保存してください!同じことは、検索ツリーのループにも当てはまります。ポイントは、効率的に保存/取得することでした:

6-生成したデータを保存する...効率的に!

そして最後に:

7-最大の最適化を備えたコード。

この問題は、CPU時間とメモリの両方で非常に高価です。コードを非常に効率的に記述することは非常に重要です。35のブランチファクターについて話していることを思い出してください。これは、ヒューリスティックのどこかで3.3792205e+18役に立たない「if」が、検索ツリーのどこかで役に立たない「if」に変わることを意味します。

チェスプログラミングは非常に興味深い挑戦であり、プログラミングの機能を本格的なテストにかけることができます。他にも提案できる点はいくつかありますが、自分でそれらを発見できると確信しています。私が知らない多くのポイントがありますが、インターネットでそれらを見つけることができます!

頑張って楽しんでね!

ps私はjavascriptをあまりよく知りませんが、問題の難しさに基づいて何かを教えてくれます。おそらく、C ++が提供できるすべてのことを考えると、javascriptをドロップしてC ++で実行する方が良いでしょう。


2

編集に従って、「合法的な」動きを定義する段階まで進んでいます。

チェスで動きを記述する方法は2つあります。 記述表記と代数表記。おそらく必要なのは、パラメーターとして開始位置と終了位置を取得する関数です。例えば。QN1からQB2へのナイトは無効ですが、QN1からQ2へのナイトは有効です。それについて考えると、代数表記法は、「相対」ポジショニングを簡単に計算できるため、より単純な場合があります。

必要な最小限のコードを記述していることを確認するために、まずその関数のテストの記述から始めます。代数表記法を使用している場合、ピース/開始/終了ごとのテストはおそらく必要ありません。各テストを機能させ、次の「移動」に進む前に重複をリファクタリングします。あなたのコードはよりきれいになります。

各ピースの法的および違法な動きを十分にカバーしたら、他の変数のチェックを追加し始めます(キングを「チェック」および「メイト」条件に移動するなど)。

JavaScriptの単体テストにはqunitを、動作テストにはジャスミンをお勧めします。


1

私は実際にチェスエンジンを書きました。御treat走と悪夢の両方に備えましょう。私の友人と私がそれをしたとき、それは時限プログラミングコンテストであり、私たちが一緒に行くことを決めた言語はJavaでした。JavaまたはCが最良の選択だと思いますが、Javascriptを使用することに決めたことがわかります。私はそれをよく知らないので、本当にそれをノックすることはできません。

ここでの主な問題は、説明する必要があるすべてのピースに非常に多くの移動/勝利シナリオが存在することです。したがって、実際にコーディングを開始する前に、各ピースのこれらの可能な状況をすべて書き出すことをお勧めします。計画せずに飛び込むだけで、この楽しいプロジェクトは繰り返しの雑用になります。しかし、それが本当に重要なことです。最初にコードの外側で計画を立て、一度に1つのピースのすべてのシナリオを取得するようにしてください。

幸運を


1

ゲームのコンピュータープレイヤーの意思決定の部分については、「人工知能:現代のアプローチ」という本(ウェブサイトhttp://aima.cs.berkeley.edu/)をお勧めできません。数学の背景に応じて(グラフ理論が役立ちます)、少し高いレベルかもしれませんが、この学術的なものと同じくらい簡単に書かれており、最新の技術の概要(およびある程度の深さ)が含まれていますプログラムに物事を決定させる。

目標(チェックメイトまたはnull)を述べる、特定の状態(ボードレイアウト)がその目標にどれだけ近いかを評価する、現在の状態から開始する異なる可能な次の状態を生成する方法、広大な問題空間をどのように横断するか。

AIアルゴリズムの設計に役立つ可能性のあることの1つは、勝ったゲームに非常に近い状況から始めて、あたかも世界中にいるかのように次にどの動きをプレイするかを決定する方法を見つけることです。合理的な時間(時間)で解決策を見つけるように最適化し、まだすべての結果を検討していなくても勝ちパスを選択する方法を見つけて、「考える」ことを実際に中断できるようにします。ターンの時間の価値。

そのときだけ、提案されたように長い整数を使用するなど、個々の計算を高速化するための表現の最適化を検討します。どれほど高速に単一の比較を行っても、問題の空間を横断する方法に優れたヒューリスティックがなければ、それを行うには時間がかかります。


0

あなたは本当に好きなように行くことができますが、これらはこのテーマに関する私の考えです:

Javaを使用すると、非常に高レベルになり、ユーザーインターフェイスライブラリ(AWT、Swing)を自由に使用できます。オブジェクト指向のアプローチを使用して、チェス盤と駒をモデリングできます。他のオブジェクトは、移動履歴とスコアリングの代わりになります。プレーヤーでさえオブジェクトになる可能性があり、将来、Playerクラスを拡張して人工知能コンピュータープレーヤーを提供する可能性があります。

あなたはを見てみたいかもしれませんモデル・ビュー・コントローラ(MVC)それは、ユーザインターフェース(ビュー)にモデルオブジェクト(ドメインモデル)を結びつけるために、ユーザーが操作することができるようにするには、この場合には非常にいいアプローチであるとしてモデル(コントローラー経由)。

また、テスト駆動開発を適用することもできます。これは、すべてのメソッドが期待どおりに動作することを保証するだけでなく、テスト可能なモジュラーコードの作成を強制します。


4
チェスエンジンはUIとは関係なく、最高の動きを計算する「マインド」のみです。
CSE

@CSE- engineの定義に依存します。
ダニエルAA Pelsmaeker

@CSE-Adnanの編集が示すように、彼実際に UIも探していました。だから私の答えは関連しています。
ダニエルAA Pelsmaeker

-8

チェスのルール自体はかなり単純です。ボードのマトリックス(2次元配列)を作成し、ピースの概念、各ピースの動作ルール、動作が正当であることの検証、およびシグナルを送る条件をエンコードする方法を見つける必要があります。ゲームの終わり。それについて特に難しいことは何もありません。最もよく知っている言語を使用する必要があります。

プレイヤーの1人の役割を担うチェスプレイAIを作成したい場合は、ここで注意が必要です。ただし、ここでも言語の選択は最大の問題ではありません。関連するAIの原則を理解することです。それははるかに重要な要素になります。

(そうは言っても、この種の意思決定は非常に計算集約的であり、スクリプト言語ではなくネイティブコードにコンパイルするものを使用したいと思うでしょう。そしてC ++は非常に悪い選択です。 -この問題に適していますが、それは単に一般的に非常に悪い言語であるため複雑なものを実装しようとすることは、あらゆる種類の頭痛を自分でコード化するための良い方法です)


15
聖なる戦争を避けるために、なぜこの特定のタスクにC ++が不適切なのかについて、もう少し具体的にする必要があると思います。
エリックReppen

9
聖戦を開始する試みに対しては-1。
Doc Brown

1
なぜC ++は一般的に非常に悪い言語だと思いますか?
アンソニー

間違いなく彼を間違えたと思う。私は彼の意見を共有するために、C ++は最初から良い言語ですが、複雑なものを扱うときは苦痛になります!
アドナン・Zahid
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.