56将棋開発ブログ

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

56将棋でPerft

はい。約10か月ぶりのブログ更新です。

競技プログラミングAtCoder)をしたり、ランニングしたりしてたらこんなに時間が経ってしまいました。

最近はAperyを56将棋エンジンに改造すべく、ぼちぼちソースコードをいじっていました。
で、指し手生成はできるようになったので、合法手生成がきちんとできているかチェックしました。
コンピュータチェス(将棋)では、Perftという方法でテストするのが一般的みたいなのでやってみました。

chessprogramming - Perft

将棋でPerftしてみたまとめ - Qiita

将棋でPerftしてみたまとめのまとめ | やねうら王 公式サイト

一言でいうと、「すべての合法手を生成して局面を進めたとき、n手後に現れる局面数を求める」テストです。(わたしの理解が正しければ)

本当は複数の人でテストして、結果が一致するか確かめたほうが良いのですが、
とりあえず今回はAperyベースとBonanzaベース(プチボナ)とでテストしました。
以下がその結果です。

平手初期局面
f:id:tetsuzuki1115:20180313173232p:plain
sfen rskgb/ppppp/5/5/PPPPP/BGKSR b -
depth: 1 5
depth: 2 25
depth: 3 198
depth: 4 1538
depth: 5 15301
depth: 6 149264
depth: 7 1685699


いろいろな指し手が現れるように適当に作った局面
Bonanza 56shogi 指し手生成 - 56将棋開発ブログのときに使ったやつ)
f:id:tetsuzuki1115:20180313173452p:plain
sfen 2kgB/1pp2/1s1P1/1B2p/r1PS1/3K1 b RG3P2p
depth: 1 63
depth: 2 1621
depth: 3 75088
depth: 4 1797781
depth: 5 71016894
depth: 6 1767336536
depth: 7 62269369719

2つの局面ともに、depth7までの局面数がBonanzaベースとAperyベースとで一致しました。
よかったですね。

【追記】


ブログ更新からわずか数時間。天才かよ。(感謝)


今後はAperyの改造をぼちぼち進めつつ、だいぶ放置しているAndroidアプリのほうもやっていきたいです。
それでは。

プチボナ 56shogi ver 2.0を公開しました

タイトルの通り、プチボナ 56shogi ver 2.0を公開しました。

リンク先のページからダウンロードできます。

将棋GUIプチ将棋」の思考エンジンとして登録することで、対局ができます。


ver 1.0では手調整だった評価関数ですが、ver 2.0では自己対戦棋譜から学習させて評価関数を作成しました。

最初は駒割りのみの評価関数同士を自己対戦させた棋譜から学習させて、
以降はできた評価関数同士をまた自己対戦→学習という手順を繰り返しました。

こちらのページに詳しく書いたので興味のある方はどうぞ。)


自己対戦→学習の繰り返しは数回で棋力が上昇しなくなってしまいました。
56将棋は本将棋と比べて盤面が狭く、決まった形が何度も現れやすいためかもしれません。

ver 1.0に対する勝率は7割弱くらいです。
自分の棋力(将棋倶楽部24中級くらい)ではまともに指したら勝てない強さになりました。
勝てなくて悔しいので、序盤だけいろいろな指し手を検討させたりしています。

ver 2.0は、「56将棋は先手有利」と主張しているような評価値を返すことが多く、
わたしはムキになって後手も戦える変化を探しています。

ちょっとでも反省させられると嬉しいですし、一応自分が考えた初期配置なので、
56将棋はそんなに浅くないということがわかると安心します。


今後としては、Aperyかやねうら王を56将棋で動作するように改変したいと思っています。

それでは。

ごーろく将棋 56shogi の実況動画

ごーろく将棋 56shogi ブラウザ版の実況動画を投稿してくれた方がいるのでご紹介します。

角 vs 飛車の動画で有名な、将棋の実況動画を投稿されているプロパンゴリラさんです。


ごーろく将棋やってみた ‐ ニコニコ動画:GINZA



COMのレベルは迷わずレベル5(JavaScript版プチボナ)を選択され、先手がプロパンゴリラさん。

1局目からプチボナは強襲します。

ごーろく将棋 56shogiを指したことのある人の中でも、知っている人は知っている角捨ての筋です。

f:id:tetsuzuki1115:20151202105355p:plain
似た局面でも現れるので、(別の方ですが)ツイートを紹介します。

狙いは▲同金に△5四歩で次に金取り+と金づくり、避けても△5五歩成で、と金ができて角が助からない形です。

いきなりプチボナが力を見せたか、と思いきや、▲同金と進んだ局面で、プチボナは△5四歩と突かずに△2四歩ととります。

f:id:tetsuzuki1115:20151202110130p:plain

f:id:tetsuzuki1115:20151202110215p:plain

これはなぜなのか。
動画内のコメントにもありましたが、角を切って▲同金の局面から△5四歩▲2三歩△5五歩成と進むと以下の局面になりますが、▲2二角打から以下後手玉が詰んでしまいます。

f:id:tetsuzuki1115:20151202111236p:plain

ということにプチボナは角を切ってから気づき、慌てて△2四歩と指したということだと思います。

しかしそれでは角を捨てた損が残ってしまい、局面はプロパンゴリラさん大優勢になりました。


その後、千日手の筋が現れ、千日手判定されるか試してみたいということで千日手の手順に。(実装しといてよかったです)


2局目はプチボナが得意の終盤力をみせて勝利しました。

ここでの△2五角合(逆王手)が印象的でした。

f:id:tetsuzuki1115:20151202111752p:plain

3局目は序盤からプロパンゴリラさんが駒得して優勢を築き、プチボナはいいところなくプロパンゴリラさんの圧勝でした。

奥のプチボナの形はあまり良くないと思うのですが、評価関数の問題なのか、たまにこうなってしまいます。
f:id:tetsuzuki1115:20151202112128p:plain


終始、指していて本当に楽しそうに実況していただいて、何度もリピートして観てしまいました。

これからもっとたくさんの人に指していただけると嬉しいです。


それでは。

プチボナ 56shogi を公開しました

【2015/10/28 追記】
ごーろく将棋 56shogi のページをリニューアル、移転したためリンク先を変更しました


プチボナ 56shogiを公開しました。

プチボナ 56shogi は、Bonanzaをベースにした5×6マス将棋盤で動作する
思考エンジンです。

ミニ将棋GUIプチ将棋」に思考エンジンとして登録することで
対局することができます。
プチ将棋」で対局するときの設定などはこちらをご覧ください。

Bonanzaをベースにしてはいますが、評価関数は簡単なものに変更しています。
(指し手生成、探索、1手詰みルーチンはほぼBonanzaそのまま、5×6マスに対応させました)
そのあたりの詳しいことはこちらをご覧ください。

プチ将棋」の添付エンジンで「ssp」という、
任意の大きさの盤面と開始局面、USIプロトコルに対応している素晴らしい思考エンジンがあります。
プチボナ 56shogi はそのsspに、勝率約95%程度です。

プチボナ 56shogiは評価関数がBonanzaのものではないのと、序盤が粗いので、将棋倶楽部24で上級くらいの棋力の方なら勝てるのではないかと思ってます。

将棋初心者、初級者の方には、以前から公開している
ごーろく将棋 56shogi
がおすすめです。
(こちらはダウンロードしなくてもブラウザで対局できます)

【2015/10/28 追記】
ブラウザ版にプチボナ 56shogi を移植したので、上級者の方でも楽しめると思います。


5×6マスのおすすめの初期配置は、これです。
f:id:tetsuzuki1115:20150430100733p:plain

これまで「ごーろく将棋 56shogi」と(勝手に)呼んでいた初期配置です。
居飛車のような戦いになり、面白いです。

また、プチボナ 56shogi は5×6将棋盤、成れる最大段は「2」という条件で動作します。
初期配置での最大数は、歩は10枚、金銀桂香は4枚ずつ、飛角は2枚ずつです。

なので、桂馬や香車をつかって、
f:id:tetsuzuki1115:20150430101139p:plain
このような初期配置にしても面白いと思います。

わたしが考えた勝手な定義としては、「ごーろく将棋 56shogi」は、
・5×6マス
・成れる最大段は2
(2段目までがお互いの陣地で、移動元か移動先が敵陣の場合、成ることができる)
・トライルール
(先手なら3一、後手なら3六に自玉が移動した時点で、敵駒の利きがそのマスになければトライ勝ち)
・その他のルールは本将棋と同様
(二歩、行きどころのない駒を打つor不成、打ち歩詰め、連続王手の千日手、王手放置は反則)
・初期配置
 1.二段目に一列に歩を並べる
 2.お互いの玉は一段目におく
 3.残りの一段目のマスは、玉と歩以外の任意の駒を並べる

というルールです。

初期配置の3.残りの一段目のマスは、玉と歩以外の任意の駒を並べる
というルールは、先手と後手で非対称な初期配置でも面白いかな、
と思って幅をもたせたものです。
初心者のためのハンデとしても良いかもしれません。


プチボナ 56shogi 、できればたくさんの方に遊んでいただけると嬉しいです。
バグ、不具合のご報告、ご意見ご感想などは、このブログにコメントしていただくか、
以下のメールアドレスまでご連絡ください。
tetsuzuki1115@gmail.com

それでは。

プチ将棋

3ヶ月ぶりにしれっと更新してみます。

去年から、Bonanzaを5×6マスの将棋盤に対応させる、ということをやってきました。

前回の更新で、コマンドプロンプト上で対局できるようにはなっていたのですが、
プチ将棋という将棋GUIで対局できるようにしてみました。

プチ将棋は、
「任意の大きさの盤面と開始局面で対局することのできる将棋GUIプログラム」です。

(リンク先より抜粋)

USIプロトコルに対応している思考エンジンを登録することで、
思考エンジンとの対局が可能です。

さらに、任意の大きさの盤面と開始局面に対応した、
sspという思考エンジンまで用意されています。
sspは、こちらのページの、「任意盤面、マルチプロトコル対応GUI プチ将棋」の
「インストール方法」からダウンロードできます。


ということで、Bonanza 56shogiとsspを対局させてみました。
(注 fv.bin不使用、評価関数は自作。
わたしの勉強のため、探索部分を簡略化してます)
持ち時間はなし、1手20秒です。

初期配置。

f:id:tetsuzuki1115:20150206203015p:plain

 

途中図。
f:id:tetsuzuki1115:20150206193441p:plain
Bonanza 56shogi、2枚の自陣角で受ける。


結果は144手(!)で、sspの勝ち。
f:id:tetsuzuki1115:20150206193902p:plain


せっかくなので、棋譜を貼っておきます。
プチ将棋にコピペすれば並べることができます。


開始日時:2015/01/23 9:45:34
先手:56bona
後手:ssp
後手の持駒:なし
5 4 3 2 1
+---------------+
|v飛v銀v玉v金v角|一
|v歩v歩v歩v歩v歩|二
| ・ ・ ・ ・ ・|三
| ・ ・ ・ ・ ・|四
| 歩 歩 歩 歩 歩|五
| 角 金 玉 銀 飛|六
+---------------+
先手の持駒:なし
*成り段=3
先手番
手数----指手---------消費時間--
1 3四歩(35) (00:20/00:00:20)
2 2三歩(22) (00:20/00:00:20)
3 1四歩(15) (00:20/00:00:40)
4 5三歩(52) (00:20/00:00:40)
5 4四歩(45) (00:20/00:01:00)
6 5四歩(53) (00:20/00:01:00)
7 5四歩(55) (00:20/00:01:20)
8 5四飛(51) (00:20/00:01:20)
9 3五銀(26) (00:20/00:01:40)
10 2二金(21) (00:20/00:01:40)
11 5五歩打 (00:21/00:02:01)
12 5三飛(54) (00:20/00:02:00)
13 4五角(56) (00:20/00:02:21)
14 5二飛(53) (00:20/00:02:20)
15 2六飛(16) (00:20/00:02:41)
16 3三歩(32) (00:20/00:02:40)
17 2四歩(25) (00:20/00:03:01)
18 3二銀(41) (00:20/00:03:00)
19 2三歩(24) (00:20/00:03:21)
20 2一金(22) (00:20/00:03:20)
21 2四銀(35) (00:20/00:03:41)
22 3四歩(33) (00:20/00:03:40)
23 3四角(45) (00:20/00:04:01)
24 5三飛(52) (00:20/00:04:00)
25 4五金(46) (00:20/00:04:21)
26 3三歩打 (00:20/00:04:20)
27 1六角(34) (00:20/00:04:41)
28 5一飛(53) (00:20/00:04:40)
29 4六玉(36) (00:20/00:05:01)
30 2二歩打 (00:20/00:05:00)
31 2二歩成(23) (00:20/00:05:21)
32 2二角(11) (00:20/00:05:20)
33 3四歩打 (00:20/00:05:41)
34 3四歩(33) (00:20/00:05:40)
35 2三歩打 (00:20/00:06:01)
36 3五歩成(34) (00:20/00:06:00)
37 3五銀(24) (00:20/00:06:21)
38 1一角(22) (00:20/00:06:20)
39 2四銀(35) (00:20/00:06:41)
40 3三歩打 (00:20/00:06:40)
41 5六玉(46) (00:20/00:07:01)
42 4一玉(31) (00:20/00:07:00)
43 4六玉(56) (00:20/00:07:21)
44 2二歩打 (00:20/00:07:20)
45 2二歩成(23) (00:20/00:07:41)
46 2二金(21) (00:20/00:07:40)
47 2三歩打 (00:20/00:08:01)
48 2一金(22) (00:20/00:08:00)
49 5六玉(46) (00:20/00:08:21)
50 3一玉(41) (00:20/00:08:20)
51 3六飛(26) (00:20/00:08:41)
52 5三飛(51) (00:20/00:08:40)
53 3五歩打 (00:20/00:09:01)
54 2二歩打 (00:20/00:09:00)
55 3四歩(35) (00:20/00:09:21)
56 3四歩(33) (00:20/00:09:20)
57 3四角(16) (00:20/00:09:41)
58 3三歩打 (00:20/00:09:40)
59 2二歩成(23) (00:20/00:10:01)
60 2二金(21) (00:20/00:10:00)
61 1六角(34) (00:20/00:10:21)
62 2三歩打 (00:19/00:10:19)
63 1五銀(24) (00:20/00:10:41)
64 2一金(22) (00:20/00:10:39)
65 2四歩打 (00:20/00:11:01)
66 2四歩(23) (00:20/00:10:59)
67 2四銀(15) (00:21/00:11:22)
68 2三歩打 (00:20/00:11:19)
69 3五銀(24) (00:20/00:11:42)
70 2二金(21) (00:20/00:11:39)
71 2四歩打 (00:20/00:12:02)
72 5一飛(53) (00:20/00:11:59)
73 2五角(16) (00:20/00:12:22)
74 2四歩(23) (00:20/00:12:19)
75 2四銀(35) (00:20/00:12:42)
76 4一玉(31) (00:20/00:12:39)
77 3五銀(24) (00:20/00:13:02)
78 2一金(22) (00:20/00:12:59)
79 3四歩打 (00:20/00:13:22)
80 3四歩(33) (00:20/00:13:19)
81 3四角(25) (00:20/00:13:42)
82 3三角(11) (00:20/00:13:39)
83 1六飛(36) (00:20/00:14:02)
84 2二角(33) (00:20/00:13:59)
85 2四銀(35) (00:20/00:14:22)
86 3三歩打 (00:20/00:14:19)
87 1三歩(14) (00:20/00:14:42)
88 1三歩(12) (00:20/00:14:39)
89 2五角(34) (00:20/00:15:02)
90 2三歩打 (00:20/00:14:59)
91 3五銀(24) (00:20/00:15:22)
92 3一玉(41) (00:20/00:15:19)
93 1四歩打 (00:20/00:15:42)
94 1四歩(13) (00:20/00:15:39)
95 1四飛(16) (00:20/00:16:02)
96 1二歩打 (00:20/00:15:59)
97 1五飛(14) (00:20/00:16:22)
98 1三角(22) (00:20/00:16:19)
99 3六角(25) (00:20/00:16:42)
100 3五角成(13) (00:20/00:16:39)
101 3五金(45) (00:20/00:17:02)
102 2六銀打 (00:20/00:16:59)
103 2五飛(15) (00:20/00:17:22)
104 3五銀成(26) (00:20/00:17:19)
105 3五飛(25) (00:20/00:17:42)
106 3四金打 (00:20/00:17:39)
107 1五飛(35) (00:20/00:18:02)
108 4四金(34) (00:20/00:17:59)
109 2六角打 (00:20/00:18:22)
110 4三銀(32) (00:20/00:18:19)
111 5四銀打 (00:20/00:18:42)
112 5四金(44) (00:20/00:18:39)
113 5四歩(55) (00:20/00:19:02)
114 4四銀打 (00:20/00:18:59)
115 4六玉(56) (00:20/00:19:22)
116 3四歩(33) (00:20/00:19:19)
117 2五金打 (00:20/00:19:42)
118 5五歩打 (00:20/00:19:39)
119 1六歩打 (00:20/00:20:02)
120 5六歩成(55) (00:20/00:19:59)
121 5六玉(46) (00:20/00:20:22)
122 5五歩打 (00:20/00:20:19)
123 4六玉(56) (00:20/00:20:42)
124 3三銀(44) (00:20/00:20:39)
125 5五玉(46) (00:20/00:21:02)
126 2四歩(23) (00:20/00:20:59)
127 1四金(25) (00:20/00:21:22)
128 3五歩成(34) (00:20/00:21:19)
129 3五角(26) (00:20/00:21:42)
130 2五歩成(24) (00:20/00:21:39)
131 2五角(36) (00:20/00:22:02)
132 5四飛(51) (00:20/00:21:59)
133 4五玉(55) (00:20/00:22:22)
134 4四銀(33) (00:20/00:22:19)
135 4四角(35) (00:20/00:22:42)
136 4四飛(54) (00:20/00:22:39)
137 3五玉(45) (00:20/00:23:02)
138 3四歩打 (00:20/00:22:59)
139 3六玉(35) (00:01/00:23:03)
140 5四角打 (00:01/00:23:00)
141 2六玉(36) (00:01/00:23:04)
142 4六飛成(44) (00:01/00:23:01)
143 3六銀打 (00:01/00:23:05)
144 3五歩成(34) (00:01/00:23:02)
145 投了
まで144手で後手の勝ち


他にも何局か指させてみたのですが、sspに全然勝てませんでした…。

探索部分をかなり簡略化しているので、評価関数はともかく探索部分だけでもBonanzaと同等にすれば、sspにはかなり勝つんじゃないかと思っているので、がんばります。

ちなみにこれを書いている現在、未実装の探索手法は、
・置換表
・Principal Variation Search (PVS)
・null move pruning
・futility pruning
・killer move
・extension、reduction
・multi PV
・並列処理

さらに1手詰、3手詰ルーチン、dfpnも未実装です。

未実装だらけです。ははは。(乾いた笑い)

「実装」というより、探索手法について理解して(ここが大事)、

そのままくっつけるだけなのですが。

 

おまけとして、探索について勉強する上で、参考になったものをいくつか。

Chess Programming Wiki
困ったらとりあえずここで検索。

CiNii 論文 -  3.コンピュータ将棋における全幅探索とfutility pruningの応用(<ミニ小特集>コンピュータ将棋の新しい動き)
Futility pruningについて解説されてます。擬似コードもあるのでわかりやすいです。

将棋:SEE - スズメレンダラー・クマ将棋の開発日記
SEE(static exchange evaluation)について。
リンク先の図がとてもわかりやすいです。


それでは。

Bonanza 56shogi とりあえず対局できるようにしてみた

はい。こんな感じです。

Windowsコマンドプロンプト上で、
指し手を入力するかたちで対局できるようにしてみました。

f:id:tetsuzuki1115:20141021204802p:plain

探索は単純なAlphaBetaです。
探索の最大深さ7なら、数秒で指し手を決めてくれます。

評価関数は、駒割 + 敵玉との相対位置によるボーナス(歩、金、銀)
というふうにしてみました。

とりあえず対局できるようにはなりましたが、
画像をご覧のとおり、将棋倶楽部24で中級のわたしが勝ててしまうレベルです。

本将棋(ふつうの将棋)より狭いとはいえ、
ごーろく将棋 56shogiがどれくらい深いゲームなのか知りたいので、
Bonanza 56shogiプロジェクトをこの調子で進めていきたいです。
(なんたらプロジェクトっていうとカッコいいと思ってます)

次は、置換表 + 反復深化にとりかかろうと思ってます。

それでは。



【 2014/10/22 18:43 追記 】
うっかりミスで、敵玉との相対位置によるボーナスが加算されてませんでした。
それを修正して、さらに、飛・角の利きのあるマスの数のボーナスを追加したところ、
こんな感じで3連敗しました。


玉の顔面受けで飛角両取りを食らうの図
f:id:tetsuzuki1115:20141022182226p:plain


腰掛銀で好形かと思いきや、角を詰まされるの図
f:id:tetsuzuki1115:20141022182436p:plain


4回目はなんとか勝てました。ははは。
f:id:tetsuzuki1115:20141022183902p:plain

乱数を入れてないので、今のところはまったく同じ順で勝つことができてしまいます。

探索部分をもとのBonanzaと同じものにしたときに、
どれくらいの強さになるのか楽しみです。

それでは。

Bonanza 56shogi 指し手生成

できました。

f:id:tetsuzuki1115:20140905085641p:plain


指し手生成祭り開催 - Bonanzaソース完全解析ブログを参考に、
局面は適当につくりました。

ちなみに、自殺手(1五玉)を生成していますが、
これは本家Bonanzaでも生成します。
詳しいことは指し手生成祭り開催 - Bonanzaソース完全解析ブログに書いてあります。


5M回ループを回して指し手生成関数を呼び出して、実行時間が3076msでした。

指し手生成の回数は、約1.62M/secということになりますが、

生成される手が指し手生成祭り開催 - Bonanzaソース完全解析ブログの局面は199手で、

ごーろく将棋 56shogi のこの局面は60手です。

本将棋の指定局面に換算するために、

1.62M回を単純に0.3倍( 60 ÷ 199 ≒ 0.3 )すると、

約0.486M/secになります。

指し手生成祭り開催 - Bonanzaソース完全解析ブログによると、

『この局面を素のBonanzaで計測してみましたが、
私の普段使っているマシン(Core2Duo2.8GHz)で、1.1M/secぐらいでした。
素のBonanzaからは多少改造してあるソースで測定したので
参考スコアということでお願いします。』

ということで、だいたい速度が半分になってしまっています。

いまつかっているノートPCが、Core2Solo 1.4GHzと、スペックが低いということと、
どの程度かわかりませんが改造してあるソースということなので、
参考スコアが素のBonanzaより少し早くなっているのかもしれません。
(だったらいいな)

それにしても遅い気がしますが。うーむ。


ビットボードが3つから1つに減っているのですが、
(5×6=30マスで、32bit整数型1つにおさまる)
どうしても増えてしまう処理があります。

例えばということで、先手の角が移動する手を生成する関数のソースを引用します。

厳密にいうと、角が移動する手の中で、
1.中段までの移動(成ることができない移動)で駒をとる手 
            +
2.駒をとる手もとらない手も含む、駒を成る手(敵陣への移動 or 敵陣からの移動)
を生成します

Bonanza (gencap.c)

  bb_piece = BB_BBISHOP;
  while ( BBTest( bb_piece ) )
    {
      ifrom = LastOne( bb_piece );
      Xor( ifrom, bb_piece );

      AttackBishop( bb_desti, ifrom );
      bb_desti.p[0] &= bb_movable.p[0];
      if ( ifrom < A6 )
	{
	  bb_desti.p[1] &= bb_movable.p[1];
	  bb_desti.p[2] &= bb_movable.p[2];
	}
      else {
	bb_desti.p[1] &= bb_capture.p[1];
	bb_desti.p[2] &= bb_capture.p[2];
      }

      while ( BBTest( bb_desti ) )
	{
	  ito = LastOne( bb_desti );
	  Xor( ito, bb_desti );

	  utemp = ( To2Move(ito) | From2Move(ifrom)
		    | Cap2Move(-BOARD[ito]) | Piece2Move(bishop) );
	  if ( ito < A6 || ifrom < A6 ) { utemp |= FLAG_PROMO; }
	  *pmove++ = utemp;
	}
    }

56shogi

bb_piece = BB_BBISHOP;
  while ( BBTest (bb_piece ) )
    {
      ifrom = LastOne( bb_piece );
      Xor( ifrom, bb_piece );
      
      AttackBishop( bb_desti, ifrom );
      bb_desti_a = bb_desti & bb_movable & bb_w_position;
      bb_desti_b = ( ifrom < A4 ) ? bb_desti & bb_movable & ~bb_w_position
                                  : bb_desti & bb_capture & ~bb_w_position;
      bb_desti = bb_desti_a | bb_desti_b;
      
      while ( BBTest(bb_desti) )
        {
          ito = LastOne( bb_desti );
          Xor( ito, bb_desti );

          utemp = ( To2Move(ito) | From2Move(ifrom)
                      | Cap2Move(-BOARD[ito])
                      | Piece2Move(bishop) );
          if ( ito < A4 || ifrom < A4 ) { utemp |= FLAG_PROMO; }
          *pmove++ = utemp;
        }
    }

Bonanzaではp[0]が後手陣、p[2]が先手陣になっていまして、
敵陣/自陣の区別が容易です。

56shogiでは、
bb_w_position(後手陣だけビットが立っているビットボード)を用意して、
それと論理積をとっています。

こういう処理があるので、ビットボードが1つになっても、
それほど高速にならないだろうなと思っていたのですが、
それにしても半分は遅いような気がします。ぐぬぬ

もしかしてもしかして、unsigned short int( 16bit )3つの構造体を用意して、
下位10bitだけつかって上位6bitは余らせる、
なんてことをしたほうが高速だったんでしょうか。

それならソースをほとんど書き換えなくてよくなるんですが。ぐぬぬぬぬ。

とりあえず、bb_w_positionのビットを反転させたビットボードを
あらかじめ用意しておくようにすれば、
ビット反転の処理が省略できるので、
少し速度がマシになるでしょうか。


とにもかくにも、指し手生成ができるようになったことは、とてもうれしいです。
去年のいまごろ、Windows付属のメモ帳でプログラミングをはじめたころは、
Bonanzaのソースを読んで、書き換えるなんて想像もしていなかったので。


ちなみに、いまは王手を生成する部分(genchk.c)を書き換えてます。

しばらくは、王手生成、王手回避手生成、1手詰ルーチン、3手詰ルーチンを
書き換えることになると思います。

5×6将棋盤でのrotated bitboardの実装方法というか、
Bonanzaのどの部分を書き換えたかという記事を、いま書いているのですが、
きちんと書こうとすると、とても長くなりそうで参ってます。

ぼちぼち、ゆっくり書いていこうと思います。

それでは。