アンドリューの徒然日記

SDIN-デュエルオブレジェンドの記事をメインに書いています

DOLにレート戦を実装したいpart②~システム構築編~

はじめに

こちらの記事は「DOLにレート戦を実装したい

のpart2の記事となります。

 

part1では、なぜ「DOLレート戦」を作りたいのか

の”構想”について話していますが、

各パートごとにある程度に話を完結させているので、

見なくても問題はありません。

 

こちらのパートでは、DOLレート戦の心臓である

システム構築について話していきます。

分かりやすく書いてみたつもりではありますが、

情報量が非常に多く、専門性も伴う内容となってしまったため

・DOLレートのシステムに興味がある方

・DOLレートのシステムに疑問がある方

・DOLレートのシステムを参考にしたい方

 

のみ、このパートの閲覧を推奨させていただきたいと思います。

 

仕組みは分からなくても、使う分には特に問題はないため、

それでも良いという方はこのパートを飛ばしてください。

 

問題点の解決

前回、DOLにレート戦のシステムを導入する際には

プログラムをある程度組まなければいけないこと」と

DOLが2vs2であること」の2つの問題点がある

ということについてお話しました。

 

1つ目は頑張るしかないので、考える必要は特にないですが、

2つ目はシステム面で解決する必要があります。

 

どのように解決したのか。

結論から言えば、「同じチームの人のレートを1つ」にしました。

 

例えば、席にと座っているとして、

で対戦を始めたとき、ⅠとⅡⅢとⅣがペアになります。

そうした時にペアになった者同士のレートを足して

1つにすることによって、疑似的に2vs2を1vs1にした

ということです。

 

これによって、イロレーティングのシステムを

DOL対戦でも使用できるようになりました。

 

 

システムの構築

実際のシステムは以下のように構築しました。

・合計レートの算出

・変動レートの算出

・補正ボーナスの算出

・連勝記録の管理

・レート反映

 

それぞれ見ていきます。

 

 

合計レートの算出

こちらは変動レートの基となる

チームの「合計レート」を算出する項目です。

 

対戦者レートの列で、対戦者の対戦前のレートを表示。

 

1試合目の列での対戦(Ⅰ+Ⅱ、Ⅲ+Ⅳ)

2試合目の列での対戦(Ⅰ+Ⅳ、Ⅱ+Ⅲ)

3試合目の列で斜めの対戦(Ⅰ+Ⅲ、Ⅱ+Ⅳ)

で各試合ごとのチームのレートの合計を算出します。

 

 

変動レートの算出

こちらでは、「合計レート」と勝敗を基に

変動レート」を決定します。

 

変動レートの計算式は次のようになっています。

=(64/(10^((RA-RB)/800)+1))/2

 

RA = Aチームの「合計レート」RB Bチームの「合計レート」

となります。

 

AチームBチームレート差を出し、

なんやかんやして数値を割り出すものです。

 

Aチームが勝った場合は

=(64/(10^((RA-RB)/800)+1))/2」を参照

Bチームが勝った場合は

=(64/(10^((RB-RA)/800)+1))/2」を参照します。

 

なので、

勝敗記号でAが勝ったら「」、Bが勝ったら「」と記録。

それを基に「採用レート」のIF関数で参照する計算式を決定し、

変動レート」を算出します。

補足

補足ですが、元のイロレーティングの計算式は

「K/(10^((RA-RB)/400)+1」(K= 定数)となっており、

実装で採用している「=(64/(10^((RA-RB)/800)+1))/2」と

少し違いますが、

これは合計レートを基に算出しているために

RAとRBの差もプレイヤーレートに比べて倍近い数値が出るため、

他の数字を倍にすることで調整をしているからです。

 

 

補正ボーナスの算出

補正ボーナス」では、勝ったプレイヤーに対して

「変動レート」に加えて与えるボーナスレートを算出します。

 

DOLレート戦では全体のレートが上がりやすくするため

かつ、実力をレートに反映しやすくするため

2つの補正ボーナスを採用しています。

 

1つは「卓内平均ボーナス

もう1つは「連勝ボーナス」です。

 

まず、「卓内平均ボーナス」についてですが、

まず対戦者全員の「平均(Average)レート」を算出します。

その「平均レート」と対戦者レートをそれぞれ比較し、

「補正ボーナス」を算出します。

 

計算式は以下を採用しています。

=(32/(10^(((対戦者レート*3)-(平均レート*3))/800)+1))/((対戦者レート+2000)/1000)

 

=(32/(10^(((対戦者レート*3)-(平均レート*3))/800)+1))の部分で

仮として「平均レート」と対戦者を対戦させ、

対戦者が勝った場合の仮の「変動レート」を算出。

 

/((対戦者レート+2000)/1000)」の部分で

対戦者レートの数値を使用しつつ、

仮の「変動レート」を割っています。

 

つまり、ここではレートが高ければ高いほど、

卓内平均ボーナス」が低くなるように設定しています。

 

次に「連勝ボーナス」についてですが、

次で説明する「連勝記録」を基に算出される「現連勝数」を基に

卓内平均ボーナス」を追加で付与するというものです。

 

詳しく説明しますと、

計算式は以下を採用しています。

=IF( 現連勝数 > 0,( 現連勝数 -1 ) * 卓内平均ボーナス ,0)

 

連勝数が0なら「連勝ボーナス」は0。

連勝数が1以上なら「連勝ボーナス」は

連勝数から1引いた数*「卓内平均ボーナス」となる。

 

ということです。

 

つまり、2連勝目から「卓内平均ボーナス」を基とした

連勝ボーナス」が試合ごとに発生するということです。

 

この2つの「補正ボーナス」としてレートを調整しています。

補足

ちなみに「勝敗記録表」と「試合数」もこの項目に記載していますが、

これはプレイヤー表への記録用なので、

補正ボーナスとは現状関係ありません。

(これに関わるボーナスを実装予定だったのでこの位置にあります)

 

 

連勝数の管理

各プレイヤーの現連勝数をリアルタイムで算出する項目です。

 

勝ったら連勝数に+1

負けたら連勝数を0にリセット

とできれば非常に楽ですが、

 

スプレッドシートでは他のセルに干渉することができないので

かなり複雑な構築になってしまいました。

 

計算式は

=IF(最後の試合=負け,0を表示,IF(最後の試合=まだ,もとの連勝数+勝っている数(まるのかず),IF(1試合目が負け,勝っている数(まるのかず),IF(2試合目が負け,1,それ以外は0))))

となっています。

 

下の段で再構築を試みようとしましたが、

1試合前の連勝数は記録できても、

リアルタイムでの現連勝数を記録できなかったので、

結局残しています。

補足

ちなみに下の段も、プレイヤー表への記録用として残しています。

 

レート反映

これまで算出した数値を基に

対戦者レートへ反映させます。

 

計算式は次のようになっています。

=IF(勝った場合,元レート+変動レート+卓内平均値ボーナス+連勝ボーナス,IF(AND(負けた場合,対戦者レートが変動レートより低い場合),0,IF(AND(負けた場合,対戦者レートが変動レートより高い場合),対戦者レート-変動レート,"")))

 

勝った場合はレートが加算されるので

元々のレートに、「変動レート」の数値と

「補正ボーナス」の2つの数値を足す処理をします。

 

負けた場合は2パターン

1つ目が元々のレートが「変動レート」より低かった場合

これは”0”になるようにしています。

 

2つ目は元々のレートが変動レートより高かった場合

こちらは通常通り元々のレートから

「変動レート」の数値分引く処理をしています。

補足

なぜ、元々のレートが「変動レート」より低かった場合に

”0”になるようにしているかというと

レートにマイナスの数値を出させないようにしているからです。

 

次回予告

ということで「DOLレート戦」のシステム構築

について話していきました。

 

次回は実装に向けて、ボタン1つで操作できるよう

マクロの実装について話していきます。

 

ここまでお付き合いくださりありがとうございました。

 

 

という感じで今回はこの辺で!