私の「週間ランキング戦」運営記

こんにちは。韓国の国家代表の「ハガネちゃん弱すぎ」です。

今日の記事では、私がふるよに「週間ランキング戦」を4ヶ月間運営することで発生した問題点および解決方法を紹介したいと思います。始める前には知らなかった難点がいくつかあったので、私の記事がランキング戦を運営しようとする人の役に立てば幸いです。

この記事はChatGPTの助けを借りて日本語で直接書きました。誤字や文法の誤りがある場合、Twitterでお知らせください。

(※この記事はふるよにAdvent Calendar 2023に参加しています)

はじめに

韓国初のふるよに研究会である「ピザ・チキン研究会」を運営してから1年になりますが、研究会というのがそうなように、ふるよに研究はせずに親睦行為をするDiscordになりました。

このような慣性を打破するためにランキング戦を作ることにしました。

ランキング戦の問題点

最初に思ったのは、決闘場から自由に募集をする方式でしたが、大きな問題が2つありました。

1. 既存の韓国Discordの決闘募集と差がない。
2. 弱い相手を探し回る狩り行為ができる。

Fig 1. 今日も好況の韓国サーバー

そんなに悩んでいたところ、「週間ランキング戦」いう運営方法を知りました。

週間ランキング戦

「週間ランキング戦」は下の方法で運営します。

1. プレーヤーはApex Legendsのようにratingを受けることになる。
2. 毎週Ratingが類似したプレーヤーとmatchingしてゲームする。
3. 一度会った相手とはX週間matchingされない。(一般的にX=3)

これらの方法は多くの利点を持っています。

① 同じレベルのプレーヤーとmatchingされるので、面白いゲームができる。
② 一度会った相手とはしばらく会わないので、いろんな相手とゲームができる。
③ Ratingの存在で、一生懸命プレーしたいという意欲が出て、ふるよに研究をするようになる(?)
④ Ratingによって本人の客観的な実力が分かる。
⑤ 週に1戦で負担にならず、多くの人が参加するようになり、運営側でも負担が少ない。
⑥ 順序の問題が生じない。

不慣れな⑥についてだけ説明します。

Rating制度は毎試合プレイによってratingが増加または減少することになりますが、このとき相手のratingによって増減幅が異なります。これにより、同じ実力の相手でもいつ会ったかによって、ratingの増減幅が変わります。具体的には、1ゲーム前に会った時と今会った時の増減幅があまりにも大きく異なる場合があります。

しかし、「週間ランキング戦」の場合、毎週人々が重ならないようにmatchingされるため、これらの問題から自由になります。

(2024/10/02: 今、もう一度考えてみたら特に問題がなかったということで…忘れてください。)

運営開始

それで「週間ランキング戦」を運営するための準備を始めました。

また、このように興味を持った日本側のプレイヤーがいたので、Discord全般的に韓国語と日本語を一緒に支援できるように苦心しました。

Fig 2-1. 韓国語と日本語を併記し、絵文字を活用して探しやすくした。

Fig 2-2. Discordロールを使用してユーザ分類

Rating algorithmはGlickoを使用しました。 

これは少ない版数でも本人の実力に合ったratingを早く見つけることができるalgorithmです。Glicko2を使用しなかった理由は、volatility farmingという問題があるからです。(※ Volatility farming

運営陣は私一人なので、便宜のためにGoogle SheetsおよびApps Scriptを使って作業しました。 また、これにより、ランキング戦の運用に必要なすべてのsource codeおよび資料が公開されるため、誰でも透明に確認できます。

幸いなことに15週間大きな問題なく運営できるようになり、今回S9にも無事転換しました。

(2024/10/02: 今もS9-2が進行中です。)

Fig 3. おめでとうございます、もっちさん

運営的な難点と解決法

もちろん問題が全くなかったわけではありません。

まず最初に発見した問題点は、連勝を通じて高いratingを得た後、これ以上ゲームをしないプレイヤーが生じる可能性もあるという点でした。実際に一度1位になると、その後はratingが非常に低い相手とゲームをしなければならない不利な状況になるので、このような選択をする可能性が高かったです。

これを解決するために、4週間プレイしない場合はランキングから除名する方法を選択しました。また、次回復帰時にはほぼ無条件で2位とゲームすることになり、1回負けたら順位がひっくり返る確率が高く、3週間に1回プレイする方法による異常な1位維持を難しくしました。

Fig 4. 規定の一部

第二に、プレイヤーが1週間以内にプレイを終えることができない場合です、今週の結果によって来週のマッチングが決まるので、来週のランキング戦が遅れることになります。

これを解決するために、postpone制度を導入して今週のmatchを望むなら来週まで引っ張っていけるようにしました。

Fig 5. pp(postpone)により1週間延長された競技

テクノロジーが私たちを救われる

もう1つの問題は、match結果の解釈でした。日本語はわかりますが、漢字を全部覚えられなかったので、日本語のmatchレポートを読むのに大変でした。

これを解決するために翻訳機を作って使用しました。

Fig 6. ふるよに翻訳機

技術的な難点

(この部分は技術的なので読まずに下に進んでもいいです)

その次に技術的な難点があります。Google Sheetが正常にロードされない問題が発生しました。

Fig 7. 数多くのLoading… と共に止まってしまったsheet

これはrating計算に使われたGlickoRating()関数が原因でした。

週間ランキング戦は、rating計算のためにJavascriptで作成したGlickoRating関数を使用しますが、毎回sheetをロードするたびに、1週から現在まですべてのratingが再計算されるために生じた問題でした。

Fig 8. 1秒足らずで数千回呼び出されたGlickoRating()関数

これを解決するために、S9に移しながらGoogle Sheetを書き直して、たった一度の関数呼び出しですべてのratingが計算されるように解決しました。

Fig 9. 必要な時だけ関数を呼び出すように変更

結び言葉

Fig 10. 週間ランキング戦のためにプログラミングするたびに流しておいた歌


サーバーを運営するのは難しい仕事です。すべてのサーバーadminに幸運がありますように。

댓글

이 블로그의 인기 게시물

[복기] 제1회 리그전 복기

당신의 덱의 승리 플랜은 무엇인가요?

[사이네A/쿠루루] 정말 쉽다! 초보자도 가능한 반주 빅골렘 덱!