マガジン

チェスの合法手が難しい理由:チェックを避ける条件

遊びをつくる

執筆にClaudeを使用しています。

キングとルーク、クイーンの影を持つポーン、隣り合うポーンを描いたチェスのイラスト
記事のテーマをもとに制作したAI生成イラスト。

白のルークが盤の端から端まで動ける局面でも、そのうち実際に指せる手は半分以下ということがあります。ルークの動きだけを見れば、縦横に空いているマスへは行けます。それでも、動かした瞬間に自分のキングが取られる形になる手は指せません。チェスの合法手が難しいのは、駒ごとの動きを書くだけでは足りず、「動かしたあとの盤面」まで調べる必要があるからです。 この記事では、動ける手(駒の動き方としては成り立つ手)と、動いてよい手(指したあと自分のキングがチェックされていない手)の差を、小さな盤面の図で数えて確かめます。そのうえで、ゲームに組み込むときの作り方、見落としやすい場面、「灯りのチェス」の設計から読み取れることを順に整理します。

この記事の目次
  1. 動ける手と、動いてよい手
  2. 図の局面で数えてみる
  3. 「動かして、調べて、戻す」という作り方
  4. チェック中と特殊な手が加える条件
  5. 灯りのチェスの設計から読み取れること
  6. 自分で確かめる手順
  7. 次の行動

動ける手と、動いてよい手

次の局面を考えてみます。大文字が白、小文字が黒で、ドットは空きマスです。白番です。

  a b c d e f g h
8 k . . . r . . .
7 . . . . . . . .
6 . . . . . . . .
5 . . . . . . . .
4 . . . . . . . .
3 . . . . . . . .
2 . . . . R . . .
1 . . . . K . . .

駒は4つだけです。

  • 白キングがe1
  • 白ルークがe2
  • 黒ルークがe8
  • 黒キングがa8

e列には、下から白キング、白ルーク、黒ルークが並んでいます。黒ルークは白ルークに遮られているので、白キングはいまチェックされていません。

この白ルークが2段目を横に動いたとします。たとえばe2からa2へ動くと、e列の途中にあった遮りが消え、黒ルークの利きがe1の白キングまで届きます。つまりa2は、ルークの動きとしては成り立っても、ルールとしては指せません。

整理すると次のようになります。

  • 動ける手:駒の動き方だけで決まる手です。ほかの駒の影響は見ません。
  • 動いてよい手:指したあとで自分のキングがチェックされていない手です。合法手と呼びます。

この2つの差を生むのは「ピン」と呼ばれる状態です。キングと相手の長距離駒(ルーク、ビショップ、クイーン)の間に自分の駒が1つだけ挟まっていると、その駒は挟まっている直線に沿ってしか動けなくなります。

図の局面で数えてみる

先ほどの局面で、白の手を一覧にします。

白ルーク(e2)の動ける手は13手です。

  • 上へ:e3、e4、e5、e6、e7、e8の6手です。e8は黒ルークを取る手です。
  • 左へ:d2、c2、b2、a2の4手です。
  • 右へ:f2、g2、h2の3手です。
  • 下はe1が自分のキングなので、動けません。

このうち合法なのは、e列を上に動く6手だけです。動いてもe列の上に白ルークが残るか、黒ルークを取って攻撃そのものを消すからです。2段目を横に動く7手はどれも違法です。

白キング(e1)の動ける手は4手です。 d1、f1、d2、f2で、e2は自分のルークがいるので行けません。黒ルークの利きはe列と8段目だけで、黒キングのa8は遠く離れています。4手ともキングが攻撃されないので合法です。

  • 白ルーク、動ける手:13、合法手:6、違法になる手:7(2段目を横へ動く手)
  • 白キング、動ける手:4、合法手:4、違法になる手:0
  • 合計、動ける手:17、合法手:10、違法になる手:7

なお、ルークでe8を取る手は、取った白ルークがa8の黒キングにチェックをかける形にもなります。b8からd8が空いているためです。合法手の一覧を作ると、こうした「相手にチェックをかける手」も同じ手順で拾えます。

ここで大事なのは、駒の動き方の規則を1行も変えずに、17手が10手に減ったことです。違法かどうかは駒単体の規則からは出てきません。盤全体を見て初めて決まります。

「動かして、調べて、戻す」という作り方

合法手を作る一般的な方法は、2段階に分けることです。

  1. 駒ごとの動きだけで「動ける手」を全部並べます。ほかの駒の影響は見ません。
  2. 並べた手を1つずつ盤の上で実際に指し、自分のキングが攻撃されていないかを調べ、攻撃されていれば捨てます。調べたら手を戻します。

先ほどの17手でいえば、2段階目でa2へ動かした盤を作り、「白キングのe1は黒の駒に攻撃されているか」を問います。答えが「はい」なら、その手は捨てます。

この方法の利点は、特別なケースを個別に書かなくて済むことです。ピンのことも、キングが攻撃されるマスへ行く手のことも、「指したあとでキングが攻撃されていないか」という1つの問いで同時に片づきます。

落とし穴:キングが元いたマスを残さない

この方法で起きやすい誤りを1つ挙げます。次の場面を考えてみます(他の駒は無いものとします)。

  • 黒ルークがa1にいます。
  • 白キングがd1にいて、b1とc1は空いています。黒ルークの利きが通り、白キングはチェックされています。
  • 白キングがe1へ逃げようとします。

この手は違法です。キングがd1を離れると、a1のルークの利きは遮りなくe1まで届くからです。ところが、「キングが元いたd1にまだ駒がある」盤を使って調べてしまうと、e1が安全に見えてしまいます。

そのため、キングを動かす手は、キングを元のマスから外した盤で、移動先の攻撃を調べる必要があります。「動かして、調べて、戻す」の「動かして」を省かないことが肝心です。

チェック中と特殊な手が加える条件

合法手の判定が難しいのは、ピンだけが原因ではありません。次の場面でも、同じ「指したあとでキングが無事か」が問われます。

チェックされているとき。 自分のキングが攻撃されている手番では、指せる手はチェックを解消する手に限られます。方法は次の3つです。

  • キングを攻撃されないマスへ動かす。
  • 攻撃している駒を取る。
  • 攻撃している駒とキングの間に駒を置く(ルーク、ビショップ、クイーンによる攻撃のとき)。

2つの駒が同時にチェックをかけている状態(ダブルチェック)では、1手で両方を止められないので、キングを動かすしかありません。ただし、これを個別の規則として書かなくても、「動かして、調べて、戻す」を通せば自然に絞り込まれます。

キャスリング。 キングとルークを同時に動かす特別な手です。キングがチェックされている間は指せず、キングが通過するマスや到達するマスが攻撃されていてもいけません。通常の「動いた先だけを調べる」では足りず、通過マスも調べる点が違います。

アンパッサン。 相手のポーンの横を通るときに取る特殊な取り方で、取られるポーンは取った駒の移動先とは別のマスから消えます。このため、同じ段の駒の並びによっては、指したあとで自分のキングが攻撃される形になることがあります。盤を実際に更新してから調べる方法なら、この場合も同じ処理で扱えます。

昇格。 ポーンが最奥の段に着いたときの変身です。何に昇格するかは選べても、昇格先によって合法性が変わらないことが多い一方、昇格した駒がチェックをかけるかどうかは選択で変わります。「灯りのチェス」は選択式の昇格に対応していると確認されています。

終局判定。 合法手が1手もなく、かつチェックされていればチェックメイト、チェックされていなければステイルメイト(引き分け)です。つまり合法手の一覧は、終局判定の土台でもあります。「動ける手」が残っていても、合法手が0なら終局になる点に注意してください。

灯りのチェスの設計から読み取れること

「灯りのチェス」について確認されているのは、次の点です。

  • 判定エンジンとしてchess.jsを同梱している。
  • キャスリング、アンパッサン、選択式の昇格、標準の終局判定に対応している。
  • 3段階の相手、駒の動き方ガイド、ヒント、一手戻す、同じ画面でのふたり対局、招待リンクのオンライン対局がある。
  • CPUの思考時間は約450msに制限されている。
  • 取った駒と全棋譜が表示される。

アソバース側の確認済み事項としては、オンライン対戦(「潮目のオセロ」と「灯りのチェス」のみ)で、手番・合法手・勝敗はサーバーで確認される、とされています。

ここから読み取れるのは、合法手の判定をゲームの中心に据えた設計だということです。ガイド、ヒント、CPU、ふたり対局、終局判定は、どれも「いまの局面で指してよい手は何か」という同じ問いに答える必要があります。判定を実績のあるエンジンにまとめておけば、表示の部分は「エンジンが返した手を見せる」だけで済みます。ただし、盤面のUIとサーバーがどの部分を共有しているか、駒の動き方ガイドが合法手だけを示すのか動ける手を示すのかといった細部は、確認済み事項にありません。この部分は作品を開いて確かめてください。

自分で確かめる手順

読者自身が、動ける手と動いてよい手の差を観察できる手順です。結果は書きません。

準備するもの:「灯りのチェス」を開き、同じ画面でのふたり対局か、弱い相手との対局を用意します。紙とペンも使います。

手順:

  1. 対局を進め、自分のキングと相手のルーク、ビショップ、クイーンの間に、自分の駒がちょうど1つだけ挟まっている形を探します。キングと相手の駒が同じ列、同じ段、または同じ斜めに乗っているのが条件です。
  2. その挟まっている駒を選び、動かせるマスがどう表示されるかを見ます。駒の動き方ガイドで表示される範囲と、実際に指せるマスを比べます。
  3. 同じ局面で、挟まっている駒を挟んでいる線の外に動かそうとして、何が起きるか(拒否される、表示が出るなど)を記録します。
  4. 別の局面でも、同じことを3局面以上繰り返します。

記録の取り方:局面ごとに、駒の種類、本来の動ける手の数(盤の駒の動かし方から数えます)、画面で選べた移動先の数、動かせなかったマスの数を並べます。

結果の読み方:

  • 本来の数より選べた数が少なく、少ない分がピンの線の外にあたるなら、画面は合法手だけを選ばせていると読めます。
  • 選べる数が本来と同じなら、指したあとに拒否される作りかもしれません。拒否時の表示も記録してください。
  • 数が合わないときは、数え間違いがないか、別の駒の利きを見落としていないかを先に確かめます。

起こりやすい誤り:

  • ピンの線の上には動ける点を数え忘れること(線に沿って動く手や、挟んだ駒を取る手は合法です)。
  • 相手のポーンやキングの利きを数え忘れること。
  • 一手戻すを使ったあとに、局面を取り違えること。

自分で作る場合も同じ形のテストが使えます。この記事の4駒の局面を最初のテストケースにして、動ける手17、合法手10になるかを確かめてください。次に、黒ルークa1と白キングd1の例で、キングのe1への移動が弾かれるかを加えると、キングの移動判定の誤りを見つけやすくなります。

次の行動

まず「灯りのチェス」で、ピンの形を3局面探して、選べる移動先の数を記録してみてください。自分でチェスを作る場合は、「動ける手を並べる→指す→自分のキングを調べる→戻す」の4段階を最初の骨組みにし、この記事の4駒の局面をテストケースに加えるのがおすすめです。外部のエンジンを使う場合も、同じ局面で期待どおりの数が出るかを最初に確かめておくと安心です。