Help us understand the problem. What is going on with this article?

DB無しでゲームへランキング機能を実装する方法

More than 1 year has passed since last update.

自分で作ったゲームにランキング機能を追加したい……

プレイヤーの競争心を刺激してより沢山プレイしてもらう為に、ランキング機能を追加したい。
こう思った時、データをRDBMSに保存する方法ならそれぞれのRANK関数を使えば実現できる。
しかしDBを建てるのって正直面倒……:rolling_eyes:
DB無しでランキング機能を実装する事は出来ないだろうか。

GAS×スプレッドシート×RANK関数で実現する。

で、考えついたのがこれ。
仕組みとしてはGASで作ったWebアプリケーションへゲーム側からリクエストを送り、
GAS側でスプレッドシートを操作、スプレッドシートに組み込まれているRANK関数の結果を返す。

実装手順

①スプレッドシートを作成

ドライブからスプレッドシートを作成する。

②スクリプトを追加

作成したスプレッドシートの上部にある「ツール」から「スクリプトエディタ」を押下する。

③アプリケーション実装

var funcStr = "=RANK({0},A:A,0)"
function doGet(e){
  var result = {};
  //パラメータがある時だけ処理する
  if(e.parameter.score != undefined){
    //スプレッドシートを取得
    //①、②で作ったらこの取得方法じゃなくても良い。
    var spreadSheet = SpreadsheetApp.openById("[スプレッドシートID]");
    var sheet = spreadSheet.getSheetByName("[シート名]");

    //スコアパラメータの取得
    var score = e.parameter.score;
    //スプレッドシートに追加
    sheet.appendRow(new Array(score));

    //最低スコアの順位を母数ににする
    //当該セルにRANK(MIN(列),列,0)を設定しておく
    var totalRow = sheet.getRange("B2").getValue();

  //RANK関数をセルに設定
    var funcCell = sheet.getRange("B1");
    funcCell.setFormula(funcStr.replace("{0}",score));
    //結果を取得
    var rank = funcCell.getValue();

    result.rank = rank + "/" + totalRow;
  }else{
    result.rank = "取得失敗...ごめん";
  }
  //jsonでレスポンス
  return ContentService.createTextOutput(JSON.stringify(result));
}

④webアプリケーションとして公開

最後にこれをWebアプリケーションとして公開する。

ただし……

ただしこの方法では、同タイミングでランキング取得されると、RANK結果の取得がズレる可能性がある。
厳密にやるなら、追加中か否かのチェック機構が必要なので、注意。
しかし厳密にやるなら、DB使った方が安心な気が……

まとめ

これでDB無しでゲームにランキング機能を(一応)実装する事が可能。

SARU_KABUTO
ゲーム会社でゲームを作ってないWebエンジニア ブログの方が更新頻度高いらしい
http://wannabehuman.hatenablog.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away