
将棋ベーシック改を開発した背景に多くのプログラマからの「VBなら分かる」という意見を受けてVBで開発すれば本当に分かるのかね?というサディスティックな動機があった。だが現実にはマゾヒスティックに個人で無料で開発を続けている。
良いコードは読まれ、クソコードは捨てられるとして、おれの20代の派遣社員の業務は捨てられたクソコードのお片付けであったのだと今更に振り返る。「VBなら分かる」というのも、フォームアプリケーションの応答なら分かる程度の事で、将棋ソフト界隈になるとC言語の分かる人ばかりで、結局C言語系が採択されている。
ただし、将棋ベーシック改もベクターのDL人気では三位まで浮上して、分かりたいけど何から読めばという人も多いだろう。だから大フローの概略図を書いてみた。
まず、将棋ベーシック改はVBで作られたフォームアプリケーションである。C言語ならメイン関数から始まるプログラムも、VBでは何から始まっているか分からない。内部的には画面表示して永久ループして、ユーザーの応答を待っている。応答待ちのフォーム画面はユーザーのボタン操作をトリガーにしてプログラムが走るのだ。
将棋ベーシックの場合はボタンがそのまま将棋の駒40個で暗黙的に先手番である。ボタンを押すと全てボタンの番地(0~80)の付いたUnitClick関数につながり、移動範囲を示すモジュールにつながって返す。移動範囲をクリックすると、今度はRobotMoveという暗黙の後手番のコンピュータ思考部に入って、Clickイベントでロボットもユーザーと同じように駒をクリックしてから移動範囲をクリックして返す。
このRobotMoveは基本的に将棋ソフト界隈で有名なアルファベータ法となっている。
・指し手生成部 GenerateMoves
・仮想指し手進行 Makemove
・再帰アルファベータ(探索深度マイナス1)
・仮想指し手逆行 UnmakeMove
・Best返答
となっている。基本的に探索深度は3なのが3手読みということで、アルファベータ後手、探索深度マイナス1、アルファベータ先手、探索深度マイナス1、アルファベータ後手、探索深度ゼロで評価関数が走り、三手仮想に動かしてみて、駒得だったら最善手をその手に更新する。
プログラムの半分くらい(2000行くらいか?)は指し手生成部GenerateMovesに従属する将棋の駒の動かし方のルールを9x9もしくは81の盤面に展開する関数である。どの部分の理解が一番難儀なのだろうと悩んだが、何位も分からないところから分かるところまで指導してゆくにあたり、大半の研究者は指し手生成部は当然として端折ってしまっているように思う。この部分の展開の速さもエンジン部の大事な部分であるにも関わらず、軽視されているように感じるのは将棋のルールに則り、計測して最も速いものを採択するだけで創造性がなさそうに見えるからだろうか。
指し手生成部にはBitBoardを採択して、詰められるところはアセンブリコードの0/1単位まで詰めている。しかし、コードを短く無駄を省けば速くなるというフェーズは既に過ぎており、探索の方法、枝の借り方、また評価関数の差分更新(毎回総計するのではなく動かした駒の得点差のみを計算する)などによる高速化の方が実効率が高かった。
まあ、誰が読むのか分からないのに親切な説明をするというのも気持ちの悪いもので、読者の中には悪意があり知ったことを他のものに語って授業料を取るようなものも潜んでいるかもしれないが、このブログの存在意義自体は人の善意にゆだねている。