審判プログラムはシリアル / TCP でプレーヤと接続したり、 標準入力から棋譜を入力して、ターミナルに順次盤面を表示し、 勝敗判定などを行います。
標準入力から入力するには -R オプションとリダイレクトを使って、
% ./trax-host -R < tests/longest-60.trx % ./trax-host -R < tests/longest-60.trx | less -R
のようにすることができます。 Forced play (連鎖ルール) が適用される分は棋譜には記録されませんが、 その場合にはこのプログラムにより自動的に適用されます。
盤面には、タイルが +, /, \ で表示され、 VT100 なエスケープシーケンスで色がつきます。 これはタイルの右辺に出る線の色です。慣れれば盤面がみえてきます。
また、ループやラインが成立した場合、 該当するタイルにはアンダーラインが引かれます。
プレーヤとの通信には Trax 通信プロトコルを使って 2つのクライアントに接続してゲームを進め、 経過を審判プログラムに渡します。先手後手の決定や、 制限時間などはこのプログラムが判断します。
クライアントとの通信方法にはシリアルポートと TCP があり、 両方のクライアントともシリアル、あるいは TCP でも接続できますし、 一方のクライアントにはシリアル、もう一方には TCP でそれぞれ接続接続するような混在環境もサポートしています。 また、シリアルポートのかわりに任意の pty デバイスも指定できますので、 socat などと組み合わせてさまざまなインタフェイスで接続が可能です。
シリアルデバイスを使う場合には、たとえば、
% ./trax-host /dev/cuaU0 /dev/cuaU1
のようにデバイスを指定すれば、/dev/cuaU0, /dev/cuaU1 に接続され、先に指定した /dev/cuaU0 に接続されたクライアントが先手プレーヤーとなります。 シリアルポートの通信速度は 19200bps です。 また、
% ./trax-host 10000 10001
のようにポート番号を指定すれば TCP のポートを開けて接続待ちになり、 クライアントがこれに接続することでゲームが開始されます。この場合も、 先に指定した 10000 番ポートに接続したプレーヤーが ポート番号は 10000-10010 を使用してください。
デバイスやポート番号の指定を省略した場合、ソースコード中にある、 serial_devs[] に基づいて、シリアルデバイスの自動探索が行われます。 自動探索では、ここに列挙されたポートに対して Trax 通信プロトコルの -T コマンドが順次送信され、最初に応答があったものが先手、 次に応答があったものが後手となります。
一手あたりの持ち時間はデフォルトで 10 秒ですが、 これは -t オプションで変更できます (たとえば、-t 5 で5秒になります。) また、先手・後手を入れ替えるには "-r" オプションを使用します。
TCP で審判プログラムに接続するコードを書くのは、 それほど難しいことではありませんが、入出力が TCP になってしまうと、 デバッグの際になにかと面倒なので、やはり標準入出力を使いたい、 と思うこともあると思います。しかし、通常のパイプやリダイレクトでは、 これは困難です。このような場合に便利なのが、 socat というツールです。
たとえば、
% socat TCP:localhost:10001 exec:"./my_trax",pty,ctty,echo=0
のようにすると、socat が ./my_trax を起動し、 その標準入出力を TCP 経由で localhost の 10001 番を listen している審判プログラムに接続してくれます。開発用にどうぞ。
trax-host の通信部分は、 広島市立大の児島先生から寄贈されたコードを元にしています。