テキスト形式のデータ構造は人間に扱いやすい
2021/03/21

順調に減っていたのにここのところ下げ止まりで、リバウンドしそうな勢いになっていますね。 なかなか理想的にはいかないものです。…って私の体重の話です。
さて前回ご紹介したスイスドロー形式の対戦マッチングツールをここから少しずつ解説しようかと思います。 最初になる今回は、ツールの応用的な使い方にも繋がる、次の回戦のために受け渡す、内部的なデータの形式について。
テキスト形式のデータ構造で次回戦へ渡す
本ツールは、名前登録、1回戦、2回戦…、と進めていきます。 その際に、名前の情報や、勝敗の結果を更新していく必要がありますが、 本ツールでは、名前のリストや試合結果を以下のようなテキスト形式のデータとして渡していく方式を用いました。

この例は、AAAさんは1回戦でCCCさんに勝ち、2回戦でBBBさんに負け、BBBさんは1回戦で不戦勝、2回戦でAAAさんに勝ち…などを表しています。
場合分けをできるだけ減らす
プログラミングをする際は、場合分けを少なくしてシンプルにした方がベターです。 本件の例では、1回戦と2回戦は同じ形式で結果が表現できると良いです。 そしてできれば名前登録部分もそれらと同じルールにできると、さらに良いです。
そのため本ツールでは名前登録時は以下の形式で入力してもらうようにしました。
AAA BBB CCC DDD EEE
そして1回戦の結果は
AAA +CCC BBB +nobody CCC -AAA DDD -EEE EEE +DDD
2回戦の結果は
AAA +CCC -BBB BBB +nobody +AAA CCC -AAA -EEE DDD -EEE +nobody EEE +DDD +CCC
というように、元々のテキストの各行に追加していくような形式にしています。
このように拡張できるルールを決めることで、同一のプログラムで扱うことができます。
テキスト形式はHTMLおよびJavaScriptで扱いやすい
テキスト形式にしたのはHTMLやJavaScriptで比較的扱いやすいためです。 プログラミング言語によっては扱いづらいケースもあるので選択には注意が必要ですね。
テキスト形式は人間にも扱いやすく応用が効く
テキスト形式は人間にも扱いやすく、読みやすい、書ける、というメリットもあります。
さらに前述の通り本ツールの各回戦が統一された形式で、実装としても受け渡しデータの読み込み部分は同一のプログラムです。 そのため本ツールは最初の名前登録のところで直接、
AAA +CCC -BBB BBB +nobody +AAA CCC -AAA -EEE DDD -EEE +nobody EEE +DDD +CCC
と書くこともできます。 これで「ゲームスタート」を押下することで、3回戦から開始することができるといった応用が効きます。
まとめ
スイスドロー形式の対戦マッチングツールで用いた、 対戦結果を次の回戦へ受け渡すための内部的なデータ形式について紹介しました。 またその応用についても記載しました。
実際に本ツールを用いて何度かオンライン大会を実施しましたが、その中で、 1回戦を開始して間もない頃に2人が加わり、せっかくなのでその2人で対戦する、ということがありました。 本ツールは遅刻者を不戦敗として追加する機能はあるのですが、このシチュエーションには対応していません。 そのため、直接テキストで結果を書いて乗り切りました。
ツールには、レアケースに対応する機能を追加していくことも必要ですが、 機能が増えると製作者としても使用者視点でもどんどん複雑になってしまいますので、実際に機能追加すべきかどうかは悩ましいところです。 そういった時に応用が効くようになっているのは悪くないかなと思います。
補足
・テキスト形式ではないデータ構造はバイナリ形式と呼ばれます。バイナリ形式は人間には読みづらいのですが、コンピューターには扱い易い場合が多く、高速に処理できます。ただし本ツールの範囲ではテキスト形式で十分高速ですしプログラムも書きやすいので、テキスト形式のメリットの方が大きいと思います。・「1回戦と2回戦は同じ形式が良いです」と書きましたが、本ツールでは3回戦以降いくつ回戦があるかわかりませんので、1回戦用のプログラムと2回戦用、3回戦用…のプログラムがそれぞれ別々になっているのはよろしくないです。つまりここの統一化は必須レベルですね。
・この形式のテキストを扱う実際のプログラムも機会があればまた解説したいと思います。
・画像内のラスタライズ文字フォントにOpen Font LicenseのNoto Sans Monoを使用しております。
カテゴリー:スイスドロー
Copyright (C) Logic Lovers Inc.