---------------------------------------------------------------------- gg2sgmp ver 0.1 2004/01/22 山下 宏 http://www32.ocn.ne.jp/~yss/index_j.html ---------------------------------------------------------------------- 1.gg2sgmpって何? GnuGoと自作の囲碁ソフトを対戦させるためのツールです。 標準入出力 RS-232C(COMポート) (stdin/stdout) クロスケーブル GnuGo <--- GTP ---> gg2sgmp <--- SGMP ---> 自作の囲碁プログラム 図にするとこういう感じです。 GnuGoとgg2sgmpはGTP(Go Text Protocol)で通信し、 gg2sgmpは他のSGMPに対応した囲碁プログラムと COMポート経由で対戦できます。 Linuxの環境だとcgobanを使えばあっさり出来るのですが、Windowsの環境で SGMP経由でGnuGoと対戦するツールがあまり見当たらないので作りました。 2.使い方 まず、GnuGoの実行ファイルを手にいれる必要があります。 最新のWindows用にコンパイルされたexeは下のページから落とせます。 http://www.public32.com/games/go/ ここにある(現在の最新版は3.4) http://www.public32.com/games/go/gnugo-3.4-vc.zip このzipを手に入れて展開し、中の gnugo.exe を C:\go\gnugo\gnugo.exe に置くとします。 そして gg2sgmp "C:\go\gnugo\gnugo.exe --mode gtp" で実行できます。 強さを指定する場合は gg2sgmp "c:\go\gnugo\gnugo.exe --mode gtp --level 12" 実行しますとCOMポートの番号と黒か白か(1か2)を聞いてくるのでそれに答えると SGMP経由で対局が始まります。 クロスケーブル繋がっているあなたのソフトを受信待ちにしておいて下さい。 マシンが1台の場合でもCOM1とCOM2にRS232Cのクロスケーブルを繋げば対局は可能です。 gg.bat を起動しても実行できます(適当に編集してください)。 なお、対局が終わると30秒後に自動的に先後を入れ替えて対局を開始しようとします。 同封のCGFCOM.DLLはTimeOutを60秒に変更してあります。 3.ソース GnuGoとどうやって通信しているかというと、gg2sgmpから子プロセスとして GnuGoを起動して、パイプを使ってGnuGoが普通に画面に吐き出す文字を 横取りして、なおかつキーボードからGnuGoに送られる入力も横取りして与えます。 原理は C:\>dir | more とかで使うパイプと一緒です。 ソースも添付しています。 pipe_gtp.cpp 作成理由は彩とGnuGoをGTP経由で連続対戦させることでした。 LinuxのGTPで通信するサンプルはたくさんあったのですが Windows用があまりなかったので 4.リンクとか GTP(Go Text Protocol) http://www.lysator.liu.se/~gunnar/gtp/ SGMP http://www.hiroshima-pu.ac.jp/~sasaki/cgf/gomodemj.txt SGMP(英語) http://www.britgo.org/tech/gmp.html パイプの作成はかなりややこしかったです。 参考にしたWinboardのソース(チェスのCraftyとかと同じ方法で通信できる) http://ftp.gnu.org/gnu/xboard/xboard-4.2.7.tar.gz パイプでプロセス間通信の基本 (98/12/29/Tue,99/12/9/Thu 補足) http://www.fides.dti.ne.jp/~tokai/vc/vcpipe.html [Delphi] GUI アプリからコンソールアプリを実行するには http://hp.vector.co.jp/authors/VA026252/tips/delphi_anonymous_pipe.html Win32で動くプログラムで標準入出力をパイプに対応させるには stdin,stdoutではなく、 hStdout = GetStdHandle(STD_OUTPUT_HANDLE); hStdin = GetStdHandle(STD_INPUT_HANDLE); で取得したハンドルを使わないと動かないようです。 彩をGTPクライアントとして他のアプリから子プロセスとして呼び出したときには stdout、が正常に動作しませんでした。 Creating a Child Process with Redirected Input and Outputをgoogleで検索。
GTP(Go Text Protocol)について
思考ルーチンを持った囲碁プログラムとGUIの間で通信するための仕様です。 きれいなGUIを作らなくても思考ルーチンさえ作ればOK、という用途向きです。 最初はGnuGoをターゲットに作成されたプロトコルのようです。 SGMPは昔の電話回線とモデムを利用することに作られた古いやつなので これが今後スタンダードになっていくと思われます。 GTP(Go Text Protocol) http://www.lysator.liu.se/~gunnar/gtp/ SGMP http://www.hiroshima-pu.ac.jp/~sasaki/cgf/gomodemj.txt SGMP(英語) http://www.britgo.org/tech/gmp.html 簡単なメモ ・座標系 19路の場合、左から右にA-Tまで('I'は除く) 左上がA19、右下がT1になります。 SGFは'i'も含む形式で左上が"aa"なのでかなり違います。 左下がA1 右下がT1 左上がA19 右上がT19 となります。 19 18 17 16 15 14 13 12 11 10 9 8 7 6 6 4 3 2 1 A B C D E F G H J K L M N O P Q R S T ・主なコマンド "boardsize 19" ... 19路盤に "clear_board" ... 盤面初期化 "play black D16" ... 黒がD16に打った(とGnuGoに伝える) "play white R17" "genmove white" ... 白の手を打て!(とするとGnuGoから "= Q16" などと返ってくる) "genmove black" コマンドが成功した場合に返ってくる文字列、 先頭が "=" エラーの場合、 先頭が "?"GTPの通信例 (GnuGoとgoguiの画面から)
name = GNU Go protocol_version = 2 version = 3.4 list_commands = aa_confirm_safety all_legal analyze_eyegraph attack attack_either black block_off break_in boardsize captures clear_board clear_cache color combination_attack connect countlib cputime decrease_depths defend defend_both disconnect dragon_data dragon_status dragon_stones dump_stack echo echo_err estimate_score accuratelib accurate_approxlib experimental_score eval_eye final_score final_status final_status_list findlib finish_sgftrace fixed_handicap get_handicap get_random_seed set_random_seed genmove genmove_black genmove_white get_connection_node_counter get_life_node_counter get_owl_node_counter get_reading_node_counter get_trymove_counter gg_genmove gg-undo help increase_depths influence is_legal known_command komi get_komi ladder_attack level set_search_diamond reset_search_mask limit_search set_search_limit draw_search_area limit_search list_commands list_stones loadsgf name new_score analyze_semeai analyze_semeai_after_move tactical_analyze_semeai owl_attack owl_connection_defends owl_defend owl_does_attack owl_does_defend owl_substantial owl_threaten_attack owl_threaten_defense play popgo printsgf orientation place_free_handicap protocol_version query_boardsize query_orientation quit restricted_genmove reg_genmove report_uncertainty reset_connection_node_counter reset_life_node_counter reset_owl_node_counter reset_reading_node_counter reset_trymove_counter same_dragon set_free_handicap showboard is_surrounded does_surround surround_map start_sgftrace test_eyeshape time_left time_settings top_moves top_moves_black top_moves_white trymove tryko tune_move_ordering undo version white worm_cutstone worm_data worm_stones komi 0.0 = boardsize 19 = clear_board = play black D16 = genmove white = Q4