More ... | 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 変数表示(デバッグ用)
内部表現駒の内部表現
先手の成り駒はそれぞれに+10します。後手の成り駒は-10します。 位置の内部表現将棋では右上から左に算用数字で1から9、右上から下に漢数字で一から九で升目を表しますがプログラムでは左上から0から8でそれぞれ表します。例えば7七は26になります。 指し手の内部表現
成りフラグは1が成り、0が不成りを表します。指し手の内部表現ですが、合法手のピックアップの際メモリノートパッド形式で変数に一時格納するので指し手は文字列で表すことになります。 25 8026 0 となります。 プログラムで使う素材現在ダウンロードできる素材はありません。 プログラムの現段階
今後実装したいもの
開発室オープンソースということでひとつの作品をみんなで作っていくのだけれど、注意するべきところは作業する部分が誰かと重ならないようにすることです。なのでサブルーチン単位で分けようと思っています。一緒にプログラムを作ってくれる方はまずはこちらへどうぞ。 コメント
参考ページコンピュータ将棋の基礎 「YSS 7.0」 --- そのデータ構造、及びアルゴリズムについて --- うさぴょん ~将棋を革命する力を~ 将棋ビギナーズ |