コンピュータ囲碁プログラム 設定を作ろう

前回の記事 : 「コンピュータ囲碁プログラム CGF碁盤プロトコル」 http://qiita.com/muzudho1/items/ddf9eb068ecfce8c5ec2

囲碁ソフトでは　対局を始める前には、19路盤でコミ6.5、置き石９つ　とか入力することになるんだが、
対局相手のソフトによっては　独自実装で　置き石の場所が

      |ABCDEFGHJKLMNOPQRST|
    --+-------------------+
     1|                   |
     2|                   |
     3|                   |
     4|   x     x     x   |
     5|                   |
     6|                   |
     7|                   |
     8|                   |
     9|                   |
    10|   x               |
    11|                   |
    12|                   |
    13|                   |
    14|                   |
    15|                   |
    16|   x     x     x   |
    17|                   |
    18|                   |
    19|                   |
    --+-------------------+
    # x:black o:white

こんな配置だったりして　初期配置を手作業でさくっと作りたかったときもあり、

**ＧＵＩ＋バイナリで全て解決だろ**

ではあるんだが、**ソフトをいくつか交互に作っているとバイナリの仕様なんか覚えていたくない** という心境、および **マークアップ・ランゲージもめんどくさい** という心境が重なり

**非汎用的**、**ださい**、**先祖帰りプロパティ・ファイル風**、**コマンドライン風** 設定ファイルに行きつく。

ここで、

#「ださい」設定ファイルとは何か

について説明する。

##「ださい」例

      |ABCDE|
    --+-----+
     1|     |
     2| x x |
     3|  x  |
     4| x x |
     5|     |
    --+-----+
    # x:black o:white

メールの文面か、という突っ込みが入るような仕様だ。

コンピューター将棋の CSAプロトコル という仕様も発想が似ているが CSAプロトコルの方は行頭に記号を１文字置くという　ひと工夫が加えられている。

**１行１命令、テキストエディターで読める。文字列検索のようだ。仕様変更への耐性が富む**

指し手の送受信に使うが、**そのままログ、研究用の棋譜にも転用できる。** 対局者情報を付けたり、棋譜にコメントを添えれたりする。
アスキー文字で ＭＳ ゴシック にしておけば **桁も揃えられるぞ。**
ださい。

##「かっこいい」例

    fen 5/1x1x1/2x2/1x1x1/5

チェスに fen という仕様があり、各行を / で区切って（改行相当） スペースを数字で表す手法なんだが、
ちょっと拡張すれば 将棋でも　どうぶつしょうぎでも　囲碁でも応用が利く。
おそらく　ダイヤモンドゲームでも　ぷよぷよ　でも、その**盤面**を記述できるだろう。

**テキスト形式だが、送信バイト数を短く。仕様へはかっちり合わせる**

指し手の送受信に使うので、対局者情報とか、棋譜コメントとかは付けない。
逆に、**定跡ファイルはコンパクトに作れる。** かっこいい。
アスキー文字にしておけば **通信できない環境とか出会わないだろう。** (※別に受信側が対応していればいいんだが、スペインのＳＮＳサイトに漢字で氏名を書いたらPHPが落ちてページが真っ白になったことがある。危険を感じたらアスキー文字。アスキー文字の上半分には不思議な安心感がある)
コンピューター将棋の SFENプロトコル の発想はこっち。

#でもダサい方を選ぶ
おっさんになろう！

#「先祖帰りプロパティ・ファイル風」とは何か
について説明しよう。

今では XML に置き換えられて絶滅したと思うが、クリティカルなところには割とよくいる。

    [Init]
    sitename=xxxxx
    url=http://xxx.yyy.com/

みたいなやつだ。
アパッチの設定ファイルも　PHPの設定ファイルも発想は似ている。

要するにこれも **ださい** 方なんだが、**いじりやすさ** は神ががっている。な、**構文とか覚えたくないだろ**。

#「コマンドライン風」とは何か
について説明しよう。

今ではパワーシェルに置き換わって説滅したと思うが、クリティカルなところには割とよくいる。
コマンドラインと言うのは

    panda-game -abc --iro kuro

みたいなやつで Windowsのアクセサリー・フォルダーの中に入っている コマンド・プロンプト とか言うのを開くと出てくるんだが、
これはあんまり **ださくは** ないがなんか**宇宙語**だし、**古い**、**いじりやすさ** は神ががっている。

スマホの操作に慣れてきたぞ、LINEでスタンプも送ったぞ！と　時代に追いついたと思ったら、画面もなく、キーボードもつながっていないＰＣ に遠隔ログインして 打鍵するはめになる。**コマンドなんか覚えてない。**

##気づいたら……

![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-03/201703011157a1.png?raw=true)

![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-03/201703011157a2.png?raw=true)

![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-03/201703011157a3.png?raw=true)

あれっ、こんな画面になってる……、囲碁には GUI があったはずだが……。
**PC98ぐらい便利にしようかな** とか分けのわからないことを言い始める……。

画面と設定ファイルとログが　シンクロしようかというところだ。なぜ　そんなことに。
ああ便利だ～。

Mac使いには　コマンドライン動かない　とか言われるんだが

ズボンのヒモ　のように　ずるずる　と拡張できる。一度覚えると抜けられないだろう。使いやすさは **神がかっている。**

#で、設定ファイルの仕様はどうしよ

    # 草案
    # (UTF-8 BOM有 CR+LF)
    boardSize 19
    board
      |ABCDEFGHJKLMNOPQRST|
    --+-------------------+
     1|                   |
     2|                   |
     3|                   |
     4|   x     x     x   |
     5|                   |
     6|                   |
     7|                   |
     8|                   |
     9|                   |
    10|   x     x     x   |
    11|                   |
    12|                   |
    13|                   |
    14|                   |
    15|                   |
    16|   x     x     x   |
    17|                   |
    18|                   |
    19|                   |
    --+-------------------+
    # x:black o:white
    turn black
    com_black true
    com_white true
    rule chinese
    komi_chinese 7.5
    komi_japanese 6.5

こんな感じでいい感じじゃないかと思っている。
対局者情報とか　棋譜は付けたければ付けろ、という感じ。

**全角文字、〇●にしたら表現力が上がる** と思っていた時期もあったんだが、プログラムのソースにコピペ貼り付けすると　フォントサイズが働いていないのかと思える文字もあって　行列がずれたんで　**アスキー文字**　にした。 これで**桁揃え** ができる。

既存のコードも実装しなおすかなあ。

##コミは中国ルールと日本ルールの両方書くのが工夫
コミなんか　片方でいいだろ！　と思うかもしれないんだが、
勝敗が違ってくるんでプレイヤーは　中国ルールと日本ルールのどちらでやっているか意識してプレイすると思うんだが、
それとは別に　開発中は　両方のルールで勝敗判定を見たいことがよくある。

で、**固定でいいだろ** と思うかもしれないんだが、**対局相手のソフト** によっては コミ 0 かな、と思うときもある。

- 中国7.5、日本6.5　パターン
- 中国0.0、日本0.0　パターン

の２つでいいんじゃないかというと、**あれっ？中国ルールで偶数のコミに意味はあるのかな？**

- 中国1.5、日本0.0　パターン

にした方がいいんじゃないか……？　と疑問に思うこともある。日本でコミ 0 のときに釣り合う中国ルールとか、ルールに無いのでよくわからん。 **好きにしろ** という意味合いで２つ用意することにした。設定する側へ丸投げだ。

実装方法など、記事は続くかどうか分かんない。