美味しい平面の煮込み方

意味はあるが特に意味はない事を書く

正真正銘のスマブラ戦績管理とMU作成をしてみよう

はい、悔い改めて~~~~~~~~~~

こういうブログを書いている平面です。

hzk-428.hatenablog.com


のちょうさんにも鮫木さんにも拡散されてびっくりしましたこのツール。
後継として、大幅改良されたYONさんツールがありますのでこちらも是非せひよろしくお願い致します!

yon4.hatenablog.com




まあそれはそれとして、

f:id:hzk_428:20210320001749p:plain
前回のあらすじ


と、宣言していたので何を作っていたかと、
どう実装したかのお話をこの記事で公開していこうと思います。



先に釘を打っておきますが、
自動もへったくれもないアナログ作業を公開するだけなので
いんふぉめ~しょんてくのろじ~要素に期待しないよう
何卒よろしくお願いします。




■目次

1.正真正銘のスマブラ戦績管理とMU作成


こんなもん作ってました。はい、どーん。


f:id:hzk_428:20210320002024p:plain

f:id:hzk_428:20210320002051p:plain


これは私のスマメイト13.5期の戦績を基にした集計の可視化です。

f:id:hzk_428:20210320002213p:plain
22戦しかしてねぇ。。。。


造ったきっかけはずばり
スマメイトのマイ対戦データを見るではデータの精度に限界があったからです。
なんで精度が?って話は前に少し話したので割愛。


それを打破するために少なくともプレイしている
自分の記録はつけておきたいと思いました。
結局は自分のためにデータが使えればいいわけですしね。
MUでキングクルール有利だからって普通に負ける時は負けらぁぁ(フラグ)

とりあえずオンはこれで溜めて、
将来的にはオフ対戦もここに記録する予定です。
たぶん結果は変わるしステージも小戦場とかは顕著に使わなくなりそう~~~~~


13.5期だけを見た結果としては、まだ何も言えません。
とにかくデータが少ない。
スマメイト試合数が22、総試合数が66試合、戦ってないキャラも大量にいる。。。。。
数が重要だなぁとしみじみ。


ただこれでデータを溜めれば
ほーずきの勝率や実績ベースMUは作れそうです。


このブログ書いていたの、13.5期の頃なんですけど月日が経って
14.5期まで終わっています。

14期および14.5期のデータもまとめましたので
とりあえず13~14.5期で簡単な可視化をしていきましょう。


■総対戦数が多い順

f:id:hzk_428:20210710201306p:plain
一人(二人)だけ桁違うの由々しき事態ですよ桜井さん。こっちこっち~~~~~~~

と、いうかスネークから吸い過ぎた。


f:id:hzk_428:20210710201102p:plain
これは14期のみ。ボコボコ
f:id:hzk_428:20210710201134p:plain
これは14.5期のみ。ちょっとだけ対策の進歩がみられる。というかどっちも一番試合した数多いのホムヒカなの大爆笑案件過ぎる。桜井さん!!!!!


■勝率が高い順ソート

f:id:hzk_428:20210710201616p:plain
試合数少ないキャラもいるけどひとまず勝率8割超え。ワリオとスネークおいちい。ちゅぱちゅぱ。ばっぶ~ん
f:id:hzk_428:20210710201723p:plain
同じように勝率6割超えキャラ。ピトブラ増えすぎだょ~~~
f:id:hzk_428:20210710201905p:plain
勝率5割~4割。パルテナに勝ち越しなの褒めて。。。褒めて。。。クロムもSP最初期ムリムリ言いまくってたけどここまで来れた。


■勝率が低い順ソート

f:id:hzk_428:20210710202033p:plain
キングクルールとかというキャラ、強い人のサブとか1800超えとかばっか当たってもう無理です。はい~~~ガン不利(現実逃避)

クッパ、サムス、キンクル、ホムラ、テリーが対戦数の割に……ってかんじだ。
アイクも勝てそうで負けるを繰り返している。
あと対しずえさん釣り糸の仕様知らなくて無限に外れて
地面に垂れていた糸に当たって捕まってた。
待ち方もあんまよくなかったのは覚えている。。。

ティーブは遂に対策固まりそうなので、フリーばんばんしたみある。
メタナイトは……これforと全く同じ対策になるオチ見えていて顔面蒼白なうです。(つまりは崖端ガン待ち……ってコト?!)


うーーーーーん777試合(まさかの)入れても
これ本当にほーずきさんの得意苦手表やんけ。。。っていうオチになった。まる。



以下はアナログ実装のお話。です。



2.レポート作成のための構成


目標

  • 対戦相手に対して勝利したかを記録する
  • 対戦相手の拒否ステージを記録する
  • 対戦相手との実際の試合の勝敗、キャラクター、ステージを記録する


最低限の要件

  • 集計できる表が欲しい
  • キャラ勝率が見たい
  • ステージ勝率とBAN率が見たい


これを達成するためには下記3つが必要だな~~とおおまかにまとまった。

試合結果のインプットできるもの ─ データを溜めるもの ─ データを見せるもの


実装する際は下記無料サービスをばんばん使いました。あとはインプットの運用でGoogleAppScript。
インプット→Googleフォーム(結局めんどくさくなって使わなくなったけどな!)
ストレージ→Googleスプレッドシート(DWHとDMを兼ねる)
可視化→Googleデータポータルが無料で使えたので採用



3.データ蓄積:フォームのアンケートを使おう

簡単にスプレッドシートにデータを入れてくれるサービス
ないかな~~と思っていたところ
「そういえばクロブラのアンケートはスプレッドシートで集計してたな」
ということを奇跡的に思い出した。

f:id:hzk_428:20210710203807p:plain

ちなみに格上格下とかという上から目線項目は
最終レートで判断(近い場合は大まかな平均で比較)するように変えた。
結果入力、結局シーズン終わってからまとめて入れてたんすよね。
時間効率考えたら入力の時間設けるのもったいなかった。。。。

私は結局スプレッドシートに直接結果を書くようになってしまったけど
これならだれでもできるのでいいんじゃないのかな~~~~~
公開用作る気ないですけども。

で、ちょっと厄介なポイントがここで発覚。

f:id:hzk_428:20210710204050p:plain

80キャラもリストで書いていくの
クッソだるいな、と。


キャラクターのマスタをさっさと更新できるようにしたいね。。。




4.フォーム運用:GASでDLC対応

キャラクターのマスタ(一覧)、数は多いわDLCがいるわで大問題に。

理想はデータはスプレッドシートに書いておくから
それを勝手にフォームに持ってくるみたいなやつ。
なんかないのかよ~~~~~















qiita.com

あった~~~~~~


と、いうことで早速実装。IDは伏せてます。

function overwriteDjList() {

  /**
  // スプレッドシートの情報を取得する
  // 
  **/

  //スプレッドシートのID →「https://docs.google.com/spreadsheets/d/△△△/edit#gid=0」の△△△を↓に記述
  var sheets = SpreadsheetApp.openById('△△△').getSheets();

  // シート1の情報を取得
  //(デフォルトのスプレッドシートの場合、シート1という名称になっています)
  var sheet = sheets[0];

  // スプレッドシートのA1のセルが「DJ」の場合
  if("キャラクター" == sheet.getRange("A1").getValue()){

    // A行の2行目からコンテンツをもつ最後の行までの値を配列で取得する
    var colA = sheet.getRange(2, 1, sheet.getLastRow() - 1).getValues();
  }

  /**
  // Googleフォームのプルダウン内の値を上書きする
  // 
  **/

  // GoogleフォームのIDを設定 →「https://docs.google.com/forms/d/〇〇〇/edit」の〇〇〇を↓に記述
  var form = FormApp.openById('〇〇〇');

  // 質問項目がプルダウンのもののみ取得
  var items = form.getItems(FormApp.ItemType.LIST);

  items.forEach(function(item){
    // 質問項目が「好きなDJを選択して下さい」を含むものに対して、スプレッドシートの内容を反映する
    if(item.getTitle().match(/.*戦目の相手キャラを選択.*$/)){
      var listItemQuestion = item.asListItem();
      var choices = [];

      colA.forEach(function(name){
        if(name != ""){
          choices.push(listItemQuestion.createChoice(name));
        }
      });

      // プルダウンの選択肢を上書きする
      listItemQuestion.setChoices(choices);
    }
  });

}

こいつをデプロイして実行で対応されます。
ちょうどカズヤが実装されたので対応するか。


f:id:hzk_428:20210710205030p:plain

まずはスプシに書いておく。
見分けついたほうが個人で使う分には楽なので苗字を記載。



f:id:hzk_428:20210710205140p:plain

まだリストにはカズヤがいませーん。



f:id:hzk_428:20210710205114p:plain

じゃあ、実行するっと。。。



f:id:hzk_428:20210710205212p:plain

3秒で完了したよ。じゃあフォームの画面を更新しましょう。





f:id:hzk_428:20210710205255p:plain

やった~~~~~!



……



これやるのあと1回やんけ!!!!!!!!


ただのお勉強で終わってしまった。
実際セフィロス実装時期くらい?に
これ作り始めたので運用回数めっちゃ少ないという。




5.データ加工その①:スプレッドシートにぶちこむ

公開するにあたって、特定されていちゃもん付けられたら泣いちゃうので
(ほんまに)(最終レートで出してるのに)
(短くていい表現あったらむしろ教えてください)
一部非表示にしていることご了承ください。


フォームの場合は結果がシートで入ってくるので、
まずはそのままコピーして溜めるシートを作成。
(14.5期は全部手打ちしたけど)

f:id:hzk_428:20210710205449p:plain


更に実際の試合(BO3)単位で並べたシートを作成。

f:id:hzk_428:20210710205652p:plain


もう殆ど完成しました。
集計するだけならスプレッドシートでもいいんですが
折角なのでもうちょい良いツール使います。



6.データ加工その②:データポータルで集計

冒頭で見せたような形で出力~~~
このへんは正直直感と言うか、集計でCASE文とかSUMとか使うくらい。

f:id:hzk_428:20210710221226p:plain
今用意しているシートはこんなかんじ


冒頭で見せていなかった2シートだけ簡単に紹介。


■シーズン別総括

f:id:hzk_428:20210710221341p:plain
特異点いい加減にせい!

シーズンのタブだけあるシート。そのシーズンの勝率とかを簡単に見るためのシート。
分布図にするつもりが間違ってバブルチャートを選んだ挙句
後から何故か変えられなかったこの円のサイズの意味のないグラフは
縦が勝率、横が総試合数になってます。
クッパとホムラァ!!!!!


f:id:hzk_428:20210710221541p:plain

最終レート準拠格上/下勝率という要るのかわからんグラフ。
当然レートが下の相手には勝ってるし上の相手には負け越してますね。
マッチングはほぼ同数程度のようだ。



■ステージ傾向レポート

f:id:hzk_428:20210710221722p:plain
ほーずきさんは戦場拒否ですが、将来拒否なしにするかもなので欄があります

・実試合で使ったステージ 集計
では実際に使われたステージの集計を出しています。
個人的予測ですが自分よりレート平均の下の人達は終点を選びがちな気がするけど、
上の人達は小戦場出してくるよ~とかそのうち明かす……つもり。


f:id:hzk_428:20210710222111p:plain

・キャラ別 拒否ステージ集計
ではマッチング相手の拒否ステージの集計を出しています。
終点とすま村が絶賛不人気のようだ。
勿論これはマッチング当時の拒否であって、
サブ等出された時のことは考慮しないが
まあ大まかな拒否傾向は見れるようになっただろう。
終点拒否が多いキャラがオフ大会で終点をBANしてなかったら
しめしめ、するときに使える集計かも。


ちなみにゲムヲはこんなかんじ。
f:id:hzk_428:20210710222457p:plain

なおゲムヲは戦場が弱いわけじゃなくて、
不利相性といわれているパルテナとかシュルクとか
そのへんが戦場の立ち回り強いので拒否していると思う。
少なくとも私はそう。
本当なら戦場でやりたいカードもあるのでうーん、過信は禁物かもしれない。


f:id:hzk_428:20210710222838p:plain

・ステージ別 勝率集計
では実際そのステージで戦った際の純粋な勝率を計上している。
カロスでなかなか試合できてないけど勝率高め。
カロスは撃墜面も防御面もゲムヲの恩恵が
強くなるのでありがたいです(ただしDDとかゼロサム除く)
逆にすま村絶不人気=苦手な人多い中なかなか勝てていないの勿体ないのかもしれない
(すま村でやりたくない、広いステージでやりたいキャラがカウンターで出すケースが多いってのは
ごもっともだけど、ゲムヲは機動力低めの近~中距離キャラなので
やっぱ慣れておきたいんじゃあ)


そのうち見たい軸が思い当ったら集計して見るかもしれない。



7.あとがき

のちょうさん、
スマメイトでレート収支見れるようにしていただき
本当にありがとうございます(爆泣)


自力で勝敗記録つけるの、結構根気がいるしちゃんと活かせるか未知数です。
でも露骨に苦手キャラとかステージとか
スマメイトでの流行が見れるようになったのは大きいかもしれない。

いちおうスマメイトしている限りは記録はつけていく所存です。
これと同じことを最上位がやってくれ(他力本願)
でも私がスプシとか可視化やる気はない(協力性皆無)(典型的なB型)

いまあとがき書いてて思ったのは
キャラ別の実際の試合の勝敗ステージの表が
欲しいなってなりました。ただの。
これが一番(自己反省の意味で)早いと思います。。。。。


そのうちネタが思いついたらブログを書きます。
それでは人間の皆さま、悔い改めて