[トップ][編集][ノート][編集履歴][一覧][最近の更新][->English]

HSPで将棋プログラムを作ろう!!

将棋プログラムでは読みをするので局面の内部表現が速度面でとても大切です。後、局面を評価する評価関数と呼ばれる部分がとても大切です。色々試したことがなくてどれが速度面で有利なのかわかりませんが、とりあえずは今私が作っているプログラムの内部表現で進めていきます。内部表現が速度面でとても大切なのですが、この盤面を表す配列変数を1次元にすると速くなるのかは試していません。

プログラムの概要

盤面は9×9ですが持ち駒を打つ場合の内部表現のためにひとつ多く配列変数を取ります。 持ち駒を表す配列変数を先手後手それぞれ駒の種類の8つと駒を取ってないことを表す0の1つで合計9つ分取ります。 変数の名付けは重要だと思いますがとりあえずは私が付けた名前で書きます。

        sndload "k.wav",0               ;O2ID=HSPがこの素材を提供します。
        buffer 2,,,0 : picload "hamugoma1.bmp";http://hamster.cool.ne.jp/「はむの頭脳」フリー素材を使用しています。
        sx2=winx : sy2=winy
        screen 0,dispx,dispy,0 : width 640,480,(dispx-640)/2,(dispy-480)/2
        font "MS ゴシック",12 : objmode 2 : title ""
        gosub *wnd
        #define KXS 31          ;駒のxサイズ 盤のxサイズもこれを使用
        #define KYS 32          ;駒のyサイズ 盤のyサイズもこれを使用
        BX=50 : BY=50           ;盤の左上座標
        gosub *st               ;stはスタート、駒の初期配置を行う
        randomize
                
*main
        await : redraw 0 : color 255,255,255 : boxf : color
        
        
        gosub *bh               ;盤表示
        gosub *ks               ;駒操作
        gosub *kh               ;駒表示
;       gosub *hh               ;変数表示(デバッグ用)
        
        
        redraw 1 : goto *main

サブルーチン説明一覧

*wnd                            初期ウィンドウを最大化する(ここでllmod.asをインクルードしている)
*st                             stはスタートの意味で、駒の初期配置を行う
*bh                             盤表示
*ks                             駒操作
        *nari                   人が駒を操作した場合に、成り不成りを決めるダイアログを出すか決めたり
                                不成りが許されない手の場合は成りの手にする
        *hk                     人が駒を操作した場合に、合法手リストに指した手があるか調べる
        *yomi1                  1手読みCPU
                *hyouka         局面を評価する。
        *back                   変数kifの最後の手を戻す
        *go                     指し手を表す文字列型変数teをもとに駒を動かす
        *ghsy1                  後手の合法手を文字列型変数okte.1に格納する
                *msx2y2         駒番号別にokte.1に合法手を加える
                *msx2y29        駒番号別にokte.1に合法手を加える
                *kr1            krは利きルーチン。kiki.1.x.yにxy升の後手の駒の利きの合計を格納する
                                *kr0も*kr1もxy升に何の駒が利いているかを示すのにsdim kikistr,512,2,9,9として
                                メモリノートパッド形式で駒番号を入れるのもいいかも知れない。
                                しかしこれは評価関数に関わる事なので評価関数次第で今後実装するかを決める。
        *ghsy0                  先手の合法手を文字列型変数okte.0に格納する
                *x2y2           駒番号別にokte.0に合法手を加える
                *x2y29          駒番号別にokte.0に合法手を加える
                *kr0            krは利きルーチン。kiki.0.x.yにxy升の先手の駒の利きの合計を格納する
*kh                             駒表示
*hh                             変数表示(デバッグ用)

内部表現

駒の内部表現

  
先手 1 2 3 4 5 6 7 8
後手 -1 -2 -3 -4 -5 -6 -7 -8

先手の成り駒はそれぞれに+10します。後手の成り駒は-10します。

位置の内部表現

将棋では右上から左に算用数字で1から9、右上から下に漢数字で一から九で升目を表しますがプログラムでは左上から0から8でそれぞれ表します。例えば7七は26になります。

指し手の内部表現

Byte 1 1 3 1 1 1 3
説明 移動先のx座標 移動先のy座標 移動元の駒の番号(動かした駒) 成りフラグ 移動元のx座標 移動元のy座標 移動先の駒の番号(取った駒)

成りフラグは1が成り、0が不成りを表します。指し手の内部表現ですが、合法手のピックアップの際メモリノートパッド形式で変数に一時格納するので指し手は文字列で表すことになります。
文字列での駒の内部表現は最大で3バイト必要ですので(-18など)、例えば先手が7七の歩を駒がない7六に移動させた場合

 25  8026  0

となります。

プログラムで使う素材

現在ダウンロードできる素材はありません。
自分で素材提供しているサイトを検索するか、自作するなどして用意してください。

プログラムの現段階

  • 人が駒を操作する場合関係する *nariと持ち駒を打つ操作は先手用しか作っていない
  • 成りでも不成りでも合法手ではなくて実際には指せない手に不必要に成り不成りダイアログが出る。これを防ごうとするとプログラムが乱雑になるので上手くできるアイディアが出るまでこのままにしている
  • 読みの部分は1手読み
  • 評価関数は駒得の場合種類に関係なく+100ポイントしている

今後実装したいもの

  • 棋譜の読み書き O2ID=HSP,12/11,1:00
  • 任意の数だけ先まで読む部分 ミニマックス法、αβ法など
  • 評価関数
  • 詰め将棋を解くサブルーチン 攻める方は王手だけ、受ける方は王手を回避する手だけになるので短時間で深く読める。終盤でお互いの玉に詰みがあるか判定するのに必要

開発室

オープンソースということでひとつの作品をみんなで作っていくのだけれど、注意するべきところは作業する部分が誰かと重ならないようにすることです。なのでサブルーチン単位で分けようと思っています。一緒にプログラムを作ってくれる方はまずはこちらへどうぞ。
HSPで将棋プログラムを作ろう!!開発室

コメント

  • なーんだ、HSPのソースが公開されてるわけじゃないのね(´・ω・`)
    • ソースがほしいだけならどうぞ。 つ将棋 - GENKI
  • 私は読みがなく評価関数だけのCPUまでは作れたことがありますがそれ以上の、任意の数だけ先まで読む部分を作るのが難しくてできませんでした。特に読みを行う部分はコンピュータ将棋選手権で活躍しているプログラムに使われているような色々なアイディアがありとても楽しくまた難しいです。みんなでアイディアやノウハウを出し合って素晴らしいものができたらいいと思います。--O2ID=HSP

参考ページ

将棋サイト

コンピュータ将棋の基礎 将棋プログラムを作成する上での基礎的な理論で、現在確立されているもの

「YSS 7.0」 --- そのデータ構造、及びアルゴリズムについて ---  「YSS 7.0」の仕組みと、優勝のきっかけとなった探索アルゴリズムについての説明

うさぴょん ~将棋を革命する力を~ 将棋プログラムの作り方

将棋ビギナーズ 将棋のルールなど