kyoto24.life

【GAS】スプレッドシートを使ったガチャのシミュレーターの作り方

2020/3/12

 こんにちは。このページを閲覧いただき、ありがとうございます。私は、文系の大学生でして、エンジニアでもプログラマーでもなんでもありません。Google Apps Script(GAS)の存在を知って、面白がっている初心者です。

 以前には、こんなものも作ってみましたので、よろしければ合わせてどうぞ。

【GAS】Googleカレンダーで時給計算をする方法

2019.12.08

 今回、ご紹介するのは素人が日曜大工の気分で作った「ガチャのシミュレーター」の作り方です。きっと、もっと効率の良いスマートな方法があると思います。

 趣味程度に最低限、楽しめれば良いという方は、参考になさってください。初心者向けとしては参考になるかと思います。

 シミュレーターを作るゲームとして「ユニゾンエアー」というアプリを選びました。完成したシミュレーターをJavaScriptで動かすとこんな感じになります。というリンクを貼っておきます。

【ユニエア】撮影ガチャシミュレーター

2020.3.2

スプレッドシートを用意する

 シートを2枚用意します。1つ目はガチャの提供割合を表にしたもの、2つ目はガチャの結果を出力するものです。私の場合、写真のようになりました。

 A列が提供割合、B列がレア度、C列が属性を表すカラーコード、D列がカードの名前です。A列について、排出率が0.667%であるSSRを667としています。

 以降はそれぞれのカードの排出率の和になっています。SUM関数を活用して作ってください。

 Google Apps Script (GAS)上で乱数を生成し、大小を比較することで排出されるカードを選択する仕組みにしています。

Google Apps Scriptのスクリプトを書く

 上のタブから「ツール」を選択して、「スクリプトエディタ」をクリックしてください。エディタが新しいタブとして表示されれば、次のコードを書いてください。

function myFunction() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('エクスポート用');
  var maxRow = sheet.getRange(1,1).getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow();
  var max = sheet.getRange(maxRow,1).getValue();
  for (var i=0;i<100;i++) {
    var rand = Math.floor(Math.random() * max) + 1;
    var t = 1;
    while (rand >= sheet.getRange(t,1).getValue()) {
      var rank = sheet.getRange(t+1,2).getValue();
      var name = sheet.getRange(t+1,4).getValue();
      t++;
      if (rand === sheet.getRange(t,1).getValue()) {
        var rank = sheet.getRange(t,2).getValue();
        var name = sheet.getRange(t,4).getValue();
        break;
      }
    }
    if(rand < sheet.getRange(1,1).getValue()) {
      var rank = sheet.getRange(1,2).getValue();
      var name = sheet.getRange(1,4).getValue();
    }
    if(rank === "SSR") {
      var rand2 = Math.floor(Math.random() * 10);
      if (rand2 === 0){
        var rank = "SSR(サイン)";
      }
    }
    var sheet2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('デバッグ');
    sheet2.getRange(i+1,1).setValue(rank);
    sheet2.getRange(i+1,2).setValue(name);
    sheet2.getRange(i+1,3).setValue(rand);
  }
}

 2行目のシートの名前は適宜、置き換えてください。3行目と4行目は、乱数の最大値を取得する処理です。提供割合の表を作ったシートのA列の最後の値が、最大値になるように取得しています。

 for文の中が実際のガチャの処理です。6行目の100の部分は、100連することを意味しています。ここの数字は自由に変えることができます。7行目が乱数を生成する処理です。

 8行目で定義しているtは行数です。毎回、1行目から順に乱数との大小を比較し、排出するものを選びます。rankにレア度(SSR,SR,R)、nameにカードの名前を代入します。

 23~28行目は「ユニゾンエアー」の仕様に合わせたものです。SSRのうち10%の確率で、欅坂46・日向坂46のメンバーのサイン入りのものが手に入るという処理をしています。省いていただいて構いません。

 29行目以降が、ガチャの結果をスプレッドシートに出力する処理になります。ここもシートの名前は適宜、置き換えてください。

シミュレーターを起動する

 コードがかけたら、上の方のタブから「▶」マークのものをクリックして、実行してみましょう。スプレッドシートは次のように表示されるはずです。countif関数などで、排出率に偏りが無いか確認してみましょう。試行回数が多くなれば多いほど、偏りは減るはずです。

(画像はSR以上確定枠について検証したものなので、Rが0になっています。)

 ただ今回のコードの場合、処理に時間がかかるので、150連程度でTimeOutになってしまいます。

 間違いやもっと良いやり方についてご存知でしたら、Twitterにて教えていただけると幸いです。よろしくお願いいたします。お読みいただき、ありがとうございました。

最近の記事

【Webテスト】適性検査cubicの例題と対策まとめ

2021.3.8

大学生が読むべき本は東大の教科書! -教養の教科書が面白い-

2020.5.22

【2020前期】京大般教の教科書(人社群)

2020.3.13

人気の記事

【GAS】Googleカレンダーで時給計算をする方法

2019.12.08

大学生が読むべき本は東大の教科書! -教養の教科書が面白い-

2020.5.22

【2020前期】京大般教の教科書(人社群)

2020.3.13

記事一覧