連休最終日にのんびりしているので1file match(仮)の参考資料を集計してみます。
1file match(仮)に関しては前述の記事参照。
Pythonユーザでライブラリとしてcshogiを利用すれば合法手をランダムに指すプログラムならなんと40行要りません。
import numpy as npimport cshogi
board = cshogi.Board()
def position(sfen, usi_moves):if sfen == 'startpos':board.reset()elif sfen[:5] == 'sfen ':board.set_sfen(sfen[5:])for usi_move in usi_moves:board.push_usi(usi_move)
def go():if board.is_game_over():return 'resign'if board.is_nyugyoku():return 'win'legal_moves = list(board.legal_moves)move = np.random.choice(legal_moves)return cshogi.move_to_usi(move)
while True:cmd = input().split(' ', 1)if cmd[0] == 'usi':print('id name this is a sample')print('usiok', flush=True)elif cmd[0] == 'isready':print('readyok', flush=True)elif cmd[0] == 'position':pos = cmd[1].split('moves')position(pos[0].strip(), pos[1].split() if len(pos) > 1 else [])elif cmd[0] == 'go':print('bestmove ' + go(), flush=True)elif cmd[0] == 'stop':print('bestmove resign' , flush=True)elif cmd[0] == 'quit':break
これをsample.pyとかの名前で保存しておいて,
python sample.py
と一行書いたsample.batファイルを同じフォルダに置いておけば将棋所で動くはずです。
本batファイルはPythonを呼び出すためなので1ファイル構成の範囲とします。
一切勝てないと思いますが,これで反則負けはありません。
(ベース素材としてnp.random.choiceの部分を弄って頂いてかまいませんが,まずはnameを弄って下さい)
C++で1ファイルに収める良いサンプルがこちらにあります。
盤面定義・合法手生成から駒得関数・アルファベータ探索まで実装されています。
C++分かる人は一度読んでみることをお勧めします。
第5回電王トーナメントバージョンも同様に1ファイル構成で公開されています。
将棋のエンジンを作り始めると最初に立ちはだかるのがLesserKaiだと思いますが,こちらもソースが公開されており参考になります。但しこちらは1ファイル構成ではありません。
http://shogidokoro.starfree.jp/download.html#LesserkaiSrc
今となっては古本でしか手に入りませんが池さんの著書が参考になるでしょう。
https://www.amazon.co.jp/gp/product/4777511103
アルゴリズムに関しては今となっては随分沢山の書籍が出ておりますので特に参考書を挙げることはしません。各個人の背景によって最適な文献は変わると思います。
1ファイルで構成するのが余計に難しいって方は恐らく初心者ではないので一般人として参加いただければと思います。
入門者向けコンペを荒らして回るのは大人気ないですよ。
何度か1file match(仮)をやっていくうちに参考にするようなサンプルが増えていくと期待しています。
---
追記:
池さんの書籍が絶版になってからWebで公開されています。
学術的な文献引用ルールが癖になって書籍優先で紹介していましたが,一般の方はこちらの方がいいですね。
---
追記2:
python-shogiを使ったものも以前あげてました。
今回貼ったソースと意味的にはほぼ同じですね。