詰将棋創作プログラミング 21 サンプルソースコード
[2017年1月13日最終更新]
詰将棋創作プログラミング 21 サンプルソースコード
詰将棋創作プログラミング 1 最初は年賀詰で開発した、持駒サーチのプログラムのソースコード(Ruby)を、自分でも創作プログラミングをしてみたい方のために、サンプルとして公開する。
1.サンプルソースコードの公開について
詰将棋創作プログラミングで作成しているプログラムは、私自身だけで利用する前提で書いているため、ユーザインターフェースは最小限にしか用意していない。例えばフォルダーやファイル名は固定、パラメタは柿木将棋で事前設定およびプログラムを直接書き替えて設定する。そういう事情と、使い捨てのプログラムで次々いろいろな機能を試していることもあって、これまで要望はあったが、プログラムの公開はしていなかった。
作成しているプログラムはいずれも数十~数百行の小さなもので、テキストファイルの処理と柿木将棋の呼び出しぐらいしかしていないので、少しプログラミングできる方なら、この連載を読めば自分でも書けると思う。しかし、最初はどんな風に書いていいかとまどうかもしれないので、自分用のプログラムでも少しは参考になるかと思い、サンプルとして一つソースコードを公開することにした。
プログラミング言語はRubyを使用しているが、私も初めて使用した言語で、早く動かすこと優先で本やWebの情報を見ながら書いたので、Rubyらしくないコーディングになっていてお手本としては適切ではない。あくまで参考程度にとどめて、みなさんはもっとよいプログラムを書いてほしい。また、質問されても答えられない可能性が高いので、自力で読める方だけ参照されるようお願いする。
盤面や駒の表し方は、池さんの「コンピュータ将棋のアルゴリズム」を参考にしている。
http://usapyon.game.coocan.jp/ComShogi/index.html
「将棋のルール」の章を読めばソースコードも説明されていて参考になると思うので、将棋のプログラムを初めて作る方は参照されることをお勧めする。
2.持駒サーチのソースコード
Windows用。Ruby 2.3の64ビット版使用。
頭に、使い方、パラメタがある。
#! ruby -Ks
=begin
持駒サーチ 1.01 2014年4月8日
盤面図を入力に、詰将棋として成立する持駒の組み合わせを探す。
まずはTETSUの環境に特化して記述。汎用化は考えない。
必要なファイルはc:/tstに置く(詰将棋創作支援ツール)。
コマンドプロンプトより起動、文字コードはSJISにしておく。
起動前にtstに移動しておく(cd c:/tst)。
入力盤面図はms_in.kifにあらかじめ作っておく。
余詰設定は柿木将棋IXで事前にしておく(1手100秒、進行度300、検出時打切り)。
思考・対局設定の詰将棋の設定で、棋譜に解答時間を設定するをオンにしておく。
実行結果ファイルは上書きするので、必要なら他にコピーすること。
ms_result.txt 全実行結果
ms_kanzen.txt 完全作リスト
ms_tsumi.txt 最小持駒リスト
持駒の最大枚数、駒種の最大枚数をMOCHIMAX、KOMASYUMAXで指定できる。
解図時間の上限をKAIZULIMITで秒単位で指定できる。
KSHOGIRESULTのユーザ名は実行環境ごとに書き替えること。
=end
# パラメタ
MOCHIMAX = 15 # 持駒の最大枚数 1-38
KOMASYUMAX = 7 # 持駒の最大種類数 1-7
KAIZULIMIT = 30 # 解図時間制限 秒単位
KSHOGIEXEM = "c:/PROGRA~2/Kakinoki/KShogi9/KShogi9.exe ms_kshogi.kif /M" + KAIZULIMIT.to_s # 解図
KSHOGIEXEZ = "c:/PROGRA~2/Kakinoki/KShogi9/KShogi9.exe ms_kshogi.kif /Z" # 余詰を探す
KSHOGIRESULT = "c:/Users/ユーザ名/Documents/柿木将棋/KShogiResult.txt" # 柿木将棋実行結果
##### ユーザ名は実行するPC毎に、そのPCでのユーザ名に書き替えること
INKIF = "c:/tst/ms_in.kif" # 持駒サーチの入力棋譜
KSHOGIKIF = "c:/tst/ms_kshogi.kif" # 柿木将棋に渡す棋譜
RESULT = "c:/tst/ms_result.txt" # 持駒サーチの結果
KANZEN = "c:/tst/ms_kanzen.txt" # 見つかった完全作
TSUMI = "c:/tst/ms_tsumi.txt" # 見つかった詰んだ組み合わせ(最小持駒)
・・・・・・
全ソースコード(約300行)はこちら。
詰将棋創作プログラミング 3 裸玉全検の可能性のときに高速化のため事前チェックなど手を加えて少し大きくなっているが、元々は200行ぐらいだった。
3.持駒サーチの実行について
このソースコードは、詰将棋創作プログラミングをしてみたい方のためにサンプルとして公開するものであり、そのままで実行することは想定していない。
私の環境では動いているプログラムなので、Rubyと柿木将棋IX(最新のアップデート)をインストールして環境を整えれば実行は可能かもしれないが、保証できないので、動かしたい方は自己責任でお願いする。
4.持駒サーチ実行例
1) 事前準備
1a. 未インストールなら、Ruby、柿木将棋IXをインストール
c:/tstフォルダを作り、Rubyのパスを張っておく。
1b. 柿木将棋IXで、余詰設定、詰将棋設定
(軽く設定しておいて、完全作候補だけあとから時間をかけて調べるのが効率的)
☑ 時間制限をする 10秒
☑ 進行度制限をする 100
☑ 各局面で複数の余詰を検出する
☑ 余詰検出で中断する
・ 長手数用
・ 詰上り局面から調べる
☑ 棋譜に解答時間を記録する
1c. 上記のms.rbをc:/tstにダウンロード、パラメタ、ユーザ名を書き替え
MOCHIMAX = 8 # 持駒の最大枚数 1-38
KOMASYUMAX = 4 # 持駒の最大種類数 1-7
KAIZULIMIT = 5 # 解図時間制限 秒単位
KSHOGIRESULT = "c:/Users/xxx/Documents/柿木将棋/KShogiResult.txt" # 柿木将棋実行結果
xxxは実行するPCでのユーザ名を設定
2) 盤面図を作って持駒サーチを実行
2a. 柿木将棋IXで、c:/tst/ms_in.kif を作成
9 8 7 6 5 4 3 2 1
+---------------------------+
| ・ ・ ・ ・ ・ ・ ・v桂v香|一
| ・ ・ ・ ・ ・ ・ ・v玉 ・|二
| ・ ・ ・ ・ ・ ・ ・ ・ ・|三
| ・ ・ ・ ・ ・ ・ 銀 ・v歩|四
| ・ ・ ・ ・ ・ ・ ・ ・ ・|五
| ・ ・ ・ ・ ・ ・ ・ ・ ・|六
| ・ ・ ・ ・ ・ ・ ・ ・ ・|七
| ・ ・ ・ ・ ・ ・ ・ ・ ・|八
| ・ ・ ・ ・ ・ ・ ・ ・ ・|九
+---------------------------+
持駒:なし
2b. 持駒サーチ実行
コマンドプロンプトを起動(文字コードはSJISに)
cd c:/tst
ruby ms.rb
2c. 実行結果は下記ファイルに格納される
c:/tst/ms_result.txt 全実行結果
c:/tst/ms_kanzen.txt 完全作候補リスト: 手順は保存されないので後で柿木将棋で調べる。ちゃんと時間をかけて検討することも必要。
・・・
持駒枚数最大:8 持駒駒種最大:4 解図時間最大5秒
飛 銀 歩四 : 27手で詰みました(▲2三飛、0:01)。
余詰:0、非限定:1、手順前後:0、迂回:0 検出しました。
角 金 桂 香 : 15手で詰みました(▲4四角、0:02)。
余詰:0、非限定:6、手順前後:0、迂回:0 検出しました。
金二 : 3手で詰みました(▲2三金、0:01)。
余詰、非限定等は見つかりませんでした。
金 銀 : 5手で詰みました(▲2三銀打、0:00)。
余詰、非限定等は見つかりませんでした。
・・・
c:\tst\ms_tsumi.txt 最小持駒リスト: 裸玉の検討のときなど有効
なお、上記ファイルをブラウザで表示して文字化けする場合は、テキストエンコーディングをShift_JISに設定すること。
| 固定リンク
「コンピュータ詰将棋」カテゴリの記事
- 詰将棋創作プログラミング 26 同一作リストの分析(2019.03.27)
- 詰将棋創作プログラミング 25 記録に挑戦!(2018.08.30)
- 詰将棋創作プログラミング 24 飛角図式のランダム生成(2018.01.22)
- 詰将棋創作プログラミング 23 柿木将棋自動化の効果(2017.01.22)
- 詰将棋創作プログラミング 22 詰将棋創作AIを作るには(2017.01.17)
コメント