56将棋開発ブログ

5×6マスのミニ将棋、「56将棋」で遊べるものをいろいろ開発してます。

将棋プログラムのつくりかた(C++) ~ 手の内部表現 ~

【2015/11/28 追記】
当時、プログラミング超初心者のわたしが勢いで始めたものの、完結させずに放置してしまっています。すみません。
コンピュータ将棋のアルゴリズム HTML版のリンクを貼っておくので、こちらを参考にしてください。

コンピュータ将棋のアルゴリズム




前回から貼っているC++のコードなのですが、

JavaScriptで将棋盤をつくっているときから書いていたので、

現状はこんな感じのところまですすんでいます。


f:id:tetsuzuki1115:20140213072854p:plain


見にくいですが、□ は空白のマス、vがついている駒が後手の駒です。(v歩など)

この局面(先手番)での合法手が、画面下に表示されています。


とりあえず、盤上の駒を動かす手を生成するところまでできました。


昨日まで、あるマスに利きがあるかどうか調べる関数のなかに、

飛び駒(飛車、角、香車)が全方向に動けるという、とんでもないバグがありまして、

それがなかなか発見できませんでした。あほすぎてつかれました。


それでは、現状の進行とずれますが、

「手の内部表現」の部分のコードを貼ってみたいと思います。


gist8966353


駒の位置を、「 Pos 」という構造体、

指し手(打つ手も含む)を、「 Te 」という構造体で表現しています。


このへんのやり方は、ほとんど、

「うさぴょん」の作者様のページ
ページ移転のお知らせ

とおんなじです。


ただ、オーバーロードしている演算子がすこしちがうのと、

「 Pos 」や「 Te 」をリストにしてあつかうための、ポインタが用意してあります。


よくみると、KomaInf(駒番号をいれる型)の変数名(koma)が、

「 Pos 」と「 Te 」でおなじですね。これはまずいです。あとで修正せねば。


あと、なぜか「 Te 」にだけ、

初期値(ぜんぶ0)を代入してくれるコンストラクタが用意されています。

(Posのは忘れてました)


演算子オーバーロードや、コンストラクタの中身はこのようになっています。


gist8966375


なにかまずい部分などありましたら、コメントいただけるとうれしいです。

それでは。


P.S 

JavaScriptで将棋盤のページ
http://www54.atpages.jp/tetsuzuki/
ですが、

広告の位置がかわったことで、駒がぜんぶズレてますね。

駒画像を追加する要素以外を、

ぜんぶabsoluteで指定しているのが原因かなあと思っています。

近いうちに直すと思います。たぶん。



2014/2/14 12:41追記

広告の位置によるズレを直しました。