将棋の詰みは難しい

iOSアプリ開発講座のファイナルプロジェクトとして将棋盤を作っているわけですが、だんだんiOSとは関係のないアプリ固有のロジックの部分を考える時間が多くなってきました。

現在、その中でも詰みがどうかを確認する処理でどっぷりはまっています。

詰みとは

思いつく範囲で将棋の詰みの状態を書き出してみると、こうなります。

( 1 ). 王手がかかっている

( 2 ). 王手をかけている相手の駒を自分の駒でとれない

( 3 ). 合駒ができない

( 4 ). 王が相手の駒のききがない場所に逃げられない

この4つのどれもがそれなりに確認するのが難しいのですが、特に、(2) の王手をかけている駒を自分の王で取れるかどうかの確認が複雑です。というのも、相手の駒にききがあるかどうかを確認しないといけないからです。「きき」と一言で言っても、人間なら見た目にすぐ分かるのですが、相手の王以外の駒がその場所にたどり着けるかどうかを確認するのは、駒の種類ごとにロジックをくまないといけません。

(3) の合駒ができるかどうかの確認もそれなりに複雑です。2歩になる場合に歩は打てませんし、歩と桂馬は打ったあとに動けないような場所に打つことはできません。

(4) が今はまっている部分で、王の動ける範囲を1つづつシミュレーションして動かしてみて、動かしたあとに (1) の王手がかかっているかどうかのチェックを行っています。

このシミュレーションが結構大変で、シミュレーションで駒を動かす時は現在の駒の状態に影響がないようにしないといけません。それをやろうとすると、今まで作ったロジックをかなりいじらないといけくなって、今までちゃんと動いていた部分もテストし直しです。

そしてiPadの実機で動かしてみると、なんとなく予想はしていたものの、処理に時間がかかりレスポンスがかなり悪くなってしまいました。

また、厳密には3手詰めや5手詰めなどのように、詰みは数手先まで読まないといけませんが、もちろんそんなことを考える余裕は現在ありません。現局面が詰みかどうかを確認するだけでアップアップです。

ああ、そういえば、打歩詰めは禁止というルールがあったのを思い出した!!

指した後に詰みをチェックするだけじゃなく、指す前に指したら詰みになるかどうか確認しないとだめなのか〜。

さらに遅くなりそう…。

<前の記事

Xcodeが泣いている             

- iTunesカードのキャンペーンがもうすぐ終了
次の記事>