詰将棋創作プログラミング 2 柿木将棋の活用
[2013年12月29日最終更新]
詰将棋創作プログラミング 2 柿木将棋の活用
1) 柿木将棋はプログラムの中からでも利用できる。
柿木将棋はアイコンから起動するのが普通だが、Windowsのプログラムなので、コマンドラインから起動したり、バッチファイルから起動することも、そして他のプログラムの中から起動することもできる。柿木将棋IXのアップデートでインターフェースが追加されているので、ここでは柿木将棋IXの最新版を前提とする。柿木将棋IXは下記より購入できる(1000円+税)。
柿木将棋を単に起動した場合、詰将棋を解かせたり余詰を探させたりするには、起動したあとで手操作でファイルを開いたりメニューから選択する必要がある。しかし、起動オプションでファイル名や行う操作を指定して起動することで、これらの操作を自動化することができる。
2) 詰将棋で有用な起動オプションと実行結果の確認方法
柿木将棋IXのヘルプの「高度な使い方」のところに「起動オプション」の説明がある。ここでは必要な詰将棋系のオプション(/Mと/Z)だけ引用するので、全オプションはヘルプを参照されたい。
/M : 詰将棋の解答を実行し、棋譜を上書保存します。/Mの後に制限時間を秒数で指定することができます。指定がないとき、無制限となります。
/Z : 余詰検査を実行し、棋譜を上書保存します。/M と同時に指定することができます。
例: KSHOGI9 詰将棋.kif /M100
/M、/Zで解答、余詰検査を実行した結果のサマリは、下記ファイルに出力される。これは毎回上書きされるので、どちらかというとプログラムからの呼び出し時の確認用。人間が確認する場合はメッセージや直接棋譜ファイルを見ればよい。
マイドキュメント/柿木将棋/KShogiResult.txt
/M の結果
"メモリ不足です。\n"
"詰みませんでした。\n"
"解が得られませんでした。\n"
"不詰です。\n"
"時間切れです。\n"
"*手で詰みました(初手、*:**)。\n" 例:873手で詰みました(▲6七金、0:19)。/Z の結果
"メモリ不足です。\n"
"余詰、非限定等は見つかりませんでした。\n"
"余詰:*、非限定:*、手順前後:*、迂回:* 検出しました。\n"
/M の結果で詰んだ時、駒余りの場合は末尾(\nの前)に"駒余り。"が付く。
固定ファイルのインターフェースは多重に柿木将棋を呼んだとき競合する可能性があるので、この辺は今後変更されるかもしれない。
3) バッチファイルから柿木将棋を呼び出す
私は次のようなバッチファイルを作っている。
柿木9詰将棋.bat
cd C:\Program Files (x86)\Kakinoki\KShogi9\
KShogi9.exe %1 /M /Z
このバッチファイルのアイコンに詰将棋の棋譜ファイルをドラッグすると、詰将棋の解答、余詰検討までやってくれてとても便利。結果を棋譜ファイルに書いて柿木将棋は自動的に終了するので、結果は棋譜ファイルを開いて確認する。
なお、/Zで余詰検査させたとき、「余詰を調べる」のオプションは以前使ったものがそのまま使われる。
4) Rubyのプログラムから柿木将棋を呼び出す
プログラムからの柿木将棋IXの起動は、プログラミング言語やOSの環境によって異なるので、各言語のマニュアルなどを参照されたい。私は今回Windows 8 64ビット版でRuby 2.00を使用したので、その場合を書く。
柿木将棋のファイルはシフトJISなので、プログラムの頭で次のように指定。
#! ruby -Ks
起動するコマンド、結果ファイルを定義(私の環境の場合)。xxx.kifは棋譜ファイル、必要に応じてパスを設定。uuuはユーザ名。解答時間はこの例では上限100秒を指定。
KSHOGIEXEM = "c:/PROGRA~2/Kakinoki/KShogi9/KShogi9.exe xxx.kif /M100"
KSHOGIEXEZ = "c:/PROGRA~2/Kakinoki/KShogi9/KShogi9.exe xxx.kif /Z"
KSHOGIRESULT = "c:/Users/uuu/Documents/柿木将棋/KShogiResult.txt"
Rubyは空白を含んだファイル名が使えないので Program Files (x86)は短縮形を使用。
Rubyでは外部プログラムの呼び出し法もいろいろあるが、system() を利用した。
system(KSHOGIEXEM) # 解答
system(KSHOGIEXEZ) # 余詰検査
余詰検査の時間制限や進行度制限は、柿木将棋で事前に設定しておく。最近追加された「余詰検出で中断する」のチェックを入れておけば、1件余詰が見つかった時点で終了してくれる(非限定などでは中断しない)ので、多数の図を調べるとき、時間の短縮に有効である。
柿木将棋の実行が終わったら、結果ファイルを読んで結果をチェックする。
s = File.read(KSHOGIRESULT)
if s.include?("詰みました") then
詰んだ時の処理
else
詰められなかった時の処理
end
私はRubyを使うのは初めてで、必要なことだけ調べながらプログラムしているので、変なことを書いているかもしれない。とりあえず、私の環境では動いているので、参考になれば幸い。
| 固定リンク
「コンピュータ詰将棋」カテゴリの記事
- 詰将棋創作プログラミング 26 同一作リストの分析(2019.03.27)
- 詰将棋創作プログラミング 25 記録に挑戦!(2018.08.30)
- 詰将棋創作プログラミング 24 飛角図式のランダム生成(2018.01.22)
- 詰将棋創作プログラミング 23 柿木将棋自動化の効果(2017.01.22)
- 詰将棋創作プログラミング 22 詰将棋創作AIを作るには(2017.01.17)
コメント