読者です 読者をやめる 読者になる 読者になる

冥冥乃志

ソフトウェア開発会社でチームマネージャをしているエンジニアの雑記。アウトプットは少なめです。

follow us in feedly

棋譜の世界線を管理する何かを作ろうとしたら既に用意されていたという話

その他

タイトルで何が言いたいかわかる人は、良くご存知の話に終始しますのでこのエントリにこれ以上読む価値はありません。危うく本末転倒して車輪の再発明してしまうところでした(しかもOSO2015参加中だというのに)。

やりたかったこと

今はテキストの模範対局しか棋譜がありませんが、もう少ししたら以下のような棋譜データベースを使って他の棋譜を並べてみたいと思っています。

www.kihuu.net

模範として並べるだけでもそれなりに勉強になるとは思っていますが、より自分で局面について考えるために、ある時点から別の着手にしてみた場合にどのような結果になるか試してみて記録することを考えています。そして、それを元の棋譜と比較してみるとより勉強になるというか、自分の強みや弱みがわかるのではないかと思っています。

つまりある棋譜について、分岐と比較というあり得る世界線の管理です。というかVCSっぽいですよね?というわけで、みんな大好きGitの出番だと思い込み始めました(これが最初の早とちり)。そうなると自分で作ることを考え始めるのがエンジニアという生き物です。という訳で実装することを前提にアイデアを考えてみました。

イメージしていた実装案

棋譜の記録に使うSGF(Smart Game Format)というファイルフォーマットがあります。これは着手を時系列に配置したテキストログ(この理解が正確ではなかった、後述)であるため、このSGFファイルをGitの管理下におけば良いのかなあ、というのが思いついた時点での実装案です。

着手ごとにGitにコミットして、世界線が変わるところでブランチを切ります。このブランチは本来の棋譜の流れとは別のあり得た大局を示すものなのでマージされません。

SGFのパースやゲームの判定など、明らかに本末転倒な領域の実装も魅力的だったのですが、手を付け始めると囲碁どころではなくなるのでそこはさすがに我慢です。いや、色々面白そうな領域ではあるんですよ?コンピュータ囲碁はまだプロと対戦できるレベルまで行っていないと言われるくらい難しそうな領域らしいですし。ただ、こっちをやり始めると、囲碁を打つ時間を削ってこっちをやり続ける未来しか見えないので、我慢です。

とりあえずSGFフォーマットのファイルの解釈や表示は既存のアプリケーションに任せて、棋譜の分岐の管理と元棋譜との比較をGitを介してサポートしてあげるツールを考えていました。SGFのビューアとなってくれるソフトはどれでも良かったのですが、Gitが介在するツールなのでビューアもPC前提で選んでおく必要がありました。そのため、SGFフォーマットに対応している囲碁ソフトを調査してみました。ここからなし崩し的に色んなことがわかってくる訳です。

Smart Game Format

SGFフォーマットが使われているアプリを探すには、まずSGFフォーマットがどういう物か知るのが一番近道です。代表的な対応アプリもおそらくリストアップされているのではないかと思いますし。というわけで公式的な何かを読んでみます。

senseis.xmp.net

とか

Smart Game Format - Wikipedia

とかですね。

ところで、公式のサンプルでもWikipediaにも気になる記述があります。まずは公式のサンプル見てみましょうか。詰め碁のサンプルです。

 (;FF[4]GM[1]SZ[19]

 GN[Copyright goproblems.com]
 PB[Black]
 HA[0]
 PW[White]
 KM[5.5]
 DT[1999-07-21]
 TM[1800]
 RU[Japanese]

 ;AW[bb][cb][cc][cd][de][df][cg][ch][dh][ai][bi][ci]
 AB[ba][ab][ac][bc][bd][be][cf][bg][bh]
 C[Black to play and live.]
 (;B[af];W[ah]
 (;B[ce];W[ag]C[only one eye this way])
 (;B[ag];W[ce]))
 (;B[ah];W[af]
 (;B[ae];W[bf];B[ag];W[bf]
 (;B[af];W[ce]C[oops! you can't take this stone])
 (;B[ce];W[af];B[bg]C[RIGHT black plays under the stones and lives]))
 (;B[bf];W[ae]))
 (;B[ae];W[ag]))

C[Bkack to play and live.] からが実際の詰め碁の着手になります。着手のまとまりがかっこになっていますが、どう見ても構造が入れ子になってますよね。あと、コメントの中に所々正解、不正解のどちらにたどり着いたかっぽいものが見受けられます。

次にWikipediaの表記を見てみましょう。

SGFはゲーム情報の保存に木構造表現を使用する

木構造」とありますね。

というわけで、そもそもSGFは異なる世界線を表現できるファイルフォーマットでした。はい、ツール作る必要なし。

IGONOTEでの実装

まあ、そもそもIGONOTEの機能実装名が「検討」となっていて、これが分岐を表して世界線を記録してくれるとは思っていなかったんですよね(言い訳)。IGONOTEの実装については不満が三点。

  • どの手から分岐したのかわからない
  • 比較できない
  • 検討(分岐)が消せない

この辺りが改善されると私の目的にはマッチするかなあ、と思います。

Jago Client

というわけでJago Clientを試しに使ってみました。さっきの詰め碁サンプルを読み込んでみると、対局の流れと世界線がツリー構造のグラフとして表示されます。これですよこれ、求めていたのは。オープンソース万歳。

とまあ、Jago Clientは割と満足感の高いツールなのですが、比較ができません(そこまで使いこなせていない可能性あり)。オープンソースなので、比較ができるように修正を加える誘惑に駆られています。

まとめ

自分が思いつく程度のことは、だいたい誰かが考えてくれています。調べましょう。車輪の再発明も楽しみとしては良いですが、それが目的でなければさくっと既存のツールを使った方が良いと思いますよ。

ちなみに、どうでも良いですが碁盤を買いました。