1

を予防する場合、チェックにそれを置く動き選ぶことを未然に防ぐために、次のように私はアルゴリズムを持っている無限再帰を回避:ボードをコピーし、コピーした上で働くことによって(チェス - チェック

  1. 偽の動きをボード)
  2. 移動が偽造された後に、すべての正当な相手の動きを得る。
  3. 法的な動きの1つがプレイヤーの王を攻撃することができれば、当初の偽造された動きは選択できません。

ただし、ステップ2(太字)では、プログラムは、他のプレーヤーが行っていることがあれば、他のプレーヤーをチェックしないようにチェックする必要があります。これは、アルゴリズム的に回避する方法がわからない無限の再帰を作成します。人々はこのような状況に対してどのような示唆を持っていますか?

+1

"プログラムは、他のプレイヤーが何をしても、他のプレイヤーをチェックしないようにチェックする必要があります。"プログラムはこの状況でこの条件をチェックしてはいけません。 [ケース・イン・ポイント](https://lichess.org/editor/8/8/8/8/8/7k/6r1/R3KQ2_w_KQkq_-)1.Ke2は黒人がルークを動かすことができないにもかかわらず、合法ではない。 –

+0

なぜそれは合法ではないでしょうか?黒人は王を奪うために何もできないので、チェックしていないだろうか? – user7518095

+1

いいえ、FIDEによって公表された公式チェス規則は、この状況を第3.9項で明示的に扱っています。チェスエンジンを実装する前にルールを読んでおくべきです。 –

答えて

2

trueを返す別の関数を定義することができます。これは、プレーヤーのピースが相手のキングのセルに移動できる場合はfalseとなります。

移動を偽ったときに、相手に対してこの機能を呼び出します。

+0

しかし、相手が自分自身をチェックしないことを確認する必要はありませんか?実際に最初のプレイヤーの作品が本当にチェックされているかどうかを判断するには?おそらく私はチェックの定義を誤解しています/カウントしてカウントしないもの... – user7518095

+0

法的な動きを得るためには、チェックを防ぐ必要があります...これは私の再帰ループが起こっているところです – user7518095

+1

偽の動きの後、あなたは相手の王が脅威にあるかどうかを確認する必要はありません。相手が直接王を攻撃することができれば、王が危険にさらされているかどうかは関係ありません。なぜなら、王をノックアウトしてゲームが終わったからです。 この関数の法的な動きは、それが王の細胞に移動できるかどうかを意味します。 – foo

関連する問題