はじめに
本記事ではいちエンジニアである @ebichan_88 が実業団囲碁大会の運営自動化に関わったエピソードを紹介します。
ちょっと大げさなタイトルですが、囲碁に興味ある方、個人開発に興味のある方等々、少しでも興味を持っていただけたら幸いです。
実業団囲碁大会とは
実業団囲碁大会とは、公益財団法人日本棋院が主催している企業対抗の3人1チームの団体戦です。
2024年から始まり、2026年1月時点で第4回大会まで開催されています。
大会の詳細については、以下サイトをご参照ください。
大会のルール
大会のルールは次の通りです。
- 3人1チームの団体戦
- 参加チームのレベルに合わせたクラス編成
- 1クラスに8チーム参加
- 全3回戦実施
- 対戦方式:スイス式トーナメント方式
- 持ち時間:40分(切れ負け)
- ハンデ戦:1段級差1子最大5子局
実業団囲碁大会と自身の関わり
私はWorks Human Intelligence(WHI)の一員として、第2回大会から参加しています。
第2回、第3回大会では選手として参加し、第4回大会では選手として参加する傍ら、ご縁があり大会運営の改善にも関わらせていただきました。
何をDXしたのか
今回は大会運営における次の2つの業務をDXしました。
- GoogleFormを利用して、各対局の対戦結果をスマホで入力・収集
- GASを利用して、収集した対戦結果から次の対戦相手を自動で決定
これにより、運営の負担が軽減され、スムーズな大会進行に貢献しました。
DXに至った流れ
DXの詳細に入る前に、DXに至った流れを説明します。
きっかけ - 第2回大会に参加してみて -
2024年に囲碁経験がある営業部署のメンバーに誘われて、第2回実業団囲碁大会(2024/11開催)に参加しました。
社会人以降、ネット碁は打っていましたが対面で打つのは学生以来で久しぶりでした。
第2回実業団囲碁大会の写真
気になった大会の進行
久しぶりの対面の囲碁大会(団体戦の参加は人生2回目!!)でとても楽しかったのですが、大会の進行を見ていて気になる点がありました。
説明にあたり、当日の大会の流れを簡単に紹介します。
次の図はあくまでも参加者側から見て、大会がどのように進行しているか見えている部分を示したものです。
運営側目線だと正確ではない部分があるかもしれませんがご容赦ください。
会場平面図
大会は日本棋院東京本院2階ホールで開催されました。
会場の平面図は以下の通りです。
1回戦実施中
各チームは所属クラスごとに決められた席で対局を行います。
対局カード記入
対局実施後、各チームは 対局カード(※) に対戦結果を記入します。
※実際に利用した対局カード
対局カード提出
対局カードを運営側に提出します。
対戦結果の集計と次の対戦相手の選定
運営は提出された対局カードをもとに対戦結果を集計し、次の対戦相手を選定します。
対局カードの配布
次の対戦相手が決定したら、運営は対戦結果をホワイトボードに記載し、各チームに対局カードを配布します。
2回戦実施前
配置された対局カードをもとに、各チームは次の対戦相手の席に移動し、対局を開始します。
ここまでが大会の流れの説明です。
当時、40チーム以上が参加されていましたが、
- 対局カードに記載されている対戦結果を対戦表の用紙へ転記する作業
- スイス式トーナメント方式による次の対戦相手の選定
などを手作業で実施している様子を見て、率直に「これは大変そうだな」と感じました。
補足:スイス式トーナメント方式について
本記事を読むにあたり、スイス式トーナメント方式について理解する必要があるため、このタイミングで補足説明します。
-
概要
- 各チームが毎回、同じ勝数のチームと対戦
- 3回戦終了時点での勝数で順位を決定
-
特徴
- 総当たり戦よりも少ない試合数で順位を決めることが可能
- 例:4チームが参加した場合
- 1回戦:全チームランダムに対戦
- 2回戦:1勝チーム同士、0勝チーム同士で対戦
- 3回戦:2勝チーム同士、1勝1敗チーム同士、0勝2敗チーム同士で対戦
1回戦、2回戦の対戦相手の選定はそこまで難しくないですが、3回戦以降から対戦相手の選定の手間が増加していきます。
スイス式トーナメント作成アプリについて
第2回大会が終わった後、ふと 対戦相手のマッチングやランキング、対戦表の作成を紙ベースではなく、ツールで出来ないのか? と思い調べてみました。
調べてみると、スイス式トーナメントのExcelのテンプレートや、対戦相手をマッチングするマクロ付きのExcelファイルを公開しているサイトは検索するとすぐに見つかりました。
また、デスクトップアプリや、Webアプリもありましたが、スイス式といえばこれ!という定番のものがあるわけではなさそうでした。(個人的主観ですが)
ということもあり、 個人開発のネタとして面白いのでは? と思い始めました。
作りたいアプリがあったとしても、大体他の誰かが既に同じようなアプリを作っているのが個人開発の世界だと思っていました。
ですが、スイス式トーナメントに関しては、まだまだ発展途上のように感じました。
ということで作ってみました
作ったのはデスクトップアプリとして動作するスイス式トーナメントの対戦組み合わせアプリです。
こちらからダウンロードできます。
公開サイト:swiss-stage-project
GitHubリポジトリ
使用技術
使用技術は次の通りです。今回はデスクトップアプリを採用しているため、Electronを利用しています。
-
フロントエンド
- Vue3
- TypeScript
- Vuetify3
-
デスクトップアプリケーション
- Electron
- Electron Builder
-
ローカルデータベース
- SQLite3
-
ビルドツール
- Vite
主な画面・機能
画面としては、次の4画面があります。
主な機能については、公開しているこちらのサイトをご参照ください。
大きいポイントとしては、各対戦結果を入力しておけば、ボタン一つで次の対戦相手を自動でマッチングしてくれる点です。
もちろん、スイス式トーナメント方式に準拠しているため
- お互いの勝ち点の差が0.5点
- 一度も対戦していない相手
という条件を満たした上で、次の対戦相手を決定します。
とりあえず社内には共有してみた
上記アプリは第3回大会が開催される直前に完成し、デスクトップアプリとして公開しました。
ただし、主にVue3の勉強の一環として個人開発したものであり、実際の大会で実用化するつもりはありませんでした。(作ったアプリも団体戦ではなく、個人戦向けのものでした)
とはいえ、せっかく作ったアプリなので、note記事を書き、囲碁大会に参加した社内のメンバーに共有しました。
大会の運営改善のオファーが来た
第2回大会に引き続き、第3回大会(2025/5開催)にも参加しました。
第3回大会参加後、囲碁大会に誘ってくれた営業のメンバーから
スイス式トーナメントの対戦組み合わせアプリについて
「団体戦にも対応し、Webアプリとして提供できないか?」
という話を囲碁大会を運営している一般社団法人IGOPRO代表の方から頂いている
と聞きました。どうもお二方が元々面識があり、第3回大会のタイミングで代表の方へ私のnote記事を紹介してくれたようです。
運営と打ち合わせ
IGOPRO代表、運営スタッフの方とオンラインで打ち合わせをしました。
打ち合わせの場では、ありがたいことに自分が作成したスイス式の対戦マッチング機能に関心を持って頂きました。
背景として、次の理由により次の対戦相手の決定に時間がかかり、大会のタイムスケジュールがひっ迫していることに課題を感じられているようでした。
- 対局カードの回収
- チーム数が50チーム以上かつ、主に受付で回収するので時間がかかる
- 対局カードの対局結果を運営が利用しているスプレッドシート等への転記作業が手間
- 対戦相手の選定を手作業で実施
- チーム数が50チーム以上のため時間がかかる
- 手作業のためミスが発生しやすい
解決策について
話を聞いている限り、自分が作ったアプリの延長線上で何か作るというよりも、スプレッドシート、GAS、GoogleFormを利用するだけで、もっと簡単に実現できるのでは? と思いました。
そのため、GoogleForm、スプレッドシート、GASを活用した、次の提案・実装しました。
対局カードの回収について
- 対戦の結果を「運営会場への報告」→ 「GoogleFormで送信」 に変更
- そのデータをスプレッドシートに集約
- 迅速かつ正確にデータを集約可能に
対戦相手の選定を手作業で実施について
- 全チームの対戦結果が揃ったら、GASを実行して次の対戦相手を自動でマッチング
- 対戦相手マッチングのアルゴリズムは自分が個人開発した時のプログラムを踏襲
全体像
全体像としては次の通りです。
図の【参加者用】大会の対戦結果表、【運営用】大会の対戦結果表は第3回大会から存在しました。
そのため、今回自分が担当したスコープとしては
- 対戦結果送信フォームのGoogleFormの追加
- 対戦マッチングのGASの追加
- 【参加者用】大会の対戦結果表、【運営用】大会の対戦結果表の改修
となります。
対戦結果を送信するGoogleForm
各クラス毎にGoogleFormを用意し、次の項目を用意しました。
- 何回戦
- 自身の企業名
- 主将の対戦結果
- 副将の対戦結果
- 三将の対戦結果
- チームの対戦結果
大会当日に配布された説明資料とQRコード
上記GoogleFormへアクセスするためのQRコードを用意しました。
大会当日にQRコードと使い方を記載した説明資料を配布することで、スマホから簡単に結果を送信できるようにしました。
※この説明資料自体は運営側が作成しております。
対戦マッチングのGAS
GoogleFormから対戦結果のデータがスプレッドシートに連携され、各クラスの対戦結果が揃ったらGASを実行します。
GASを実行することで次の対戦相手を自動的にマッチングします。
対戦マッチングアルゴリズムについて
今回のGASでは、次の条件を満たすように対戦相手を決定しています。
- お互いの勝ち点の差が0.5点以内
- 勝:1点
- 引分:0.5点
- 負:0点
- これまでに対戦していない相手
ペアリングするにあたり、最初に思いつくのは、次のような方法です。
- 勝ち点ごとにチームをグルーピング
- 上から順に、条件を満たす相手とペアにする
- ペアができたら次へ進む
ただし、この場合先にペアを確定した結果、後続のチームが「勝ち点差」や「既対戦」の条件を同時に満たす相手が存在しないケースが発生します。
これは貪欲法と呼ばれるアルゴリズムの一種で、全体としての最適解が必ずしも得られるとは限らないです。
マッチングシステムを作成するにあたり、マッチング精度の高さは大事であるため、このアルゴリズムは採用しませんでした。
そこで今回はバックトラック法を採用しました。
概要としては次の通りです。
- 1組ずつペアを仮決定
- 行き詰まったら1つ前に戻って別の選択肢を試す
- 全チームのペアが成立した時点で確定
運用してみた結果
大会進行について
上記の運用を実際に第4回実業団囲碁大会で実施しました。
といっても、自分はGoogleForm、GASの作成、スプレッドシートのメンテしかしていないため、当日は参加者として対局をするだけでしたが・・・。
大会が無事に終了して、懇親会の時間になったタイミングで運営スタッフに感想を聞いてみたところ、次の声を頂きました。
- 大きなトラブルなく完了
- マッチングシステムは問題なく動作した
- 1、2回戦のマッチングについては手作業とそこまで時間は変わらないが、3回戦のマッチングにかかる時間は改善した!
- 運用が複雑になるほど(人数×回戦×スイス式)、効果が発揮される仕組みと評価頂きました!
- この仕組みを他の大会にも展開予定
ということで、概ね好評だったのではないかなと思っています。
ちゃんと動作するか不安だったので無事に進行ができてよかったです。
個人的な感想
- 多少の遅延はあったものの概ねタイムスケジュール通りに進行しており、過去の大会と比較してもスムーズに進行していた気がする(正確な時間を計測はできていませんが)
- 対局が終了した後、運営がすぐに対局カードを改修していた等、自分のツール作成以外の部分でも運営側で大会がスムーズに進行するように工夫されていたと思います
- 大会のルールの説明で、対局の結果をGoogleFormで送信する話が出たときに会場が盛り上がっていたのが印象に残っている
- 運営にかかわっている方々から 「システム作った人」 と認知されていた印象(懇親会で声をかけられた)
- 今回の施策はGoogleFormやGASを利用するシンプルな仕組みですが、多くの参加者からポジティブなフィードバックをいただきました
おわりに
今回の取り組みについて多くの方から直接反応を頂けたのは素直にうれしかったです。
囲碁界という、自分が学生の時から関わっていた領域で少しでも多くの人の役に立てて良かったなと思います。
ちなみにWHIの第4回大会の結果ですが、全勝の成績を収め、3回目の参加で初めて優勝することができました!!🎉🎉


















