その他
    ホーム 技術発信 DoRuby ボックスガチャの実装をしよう(ソーシャルゲームにおけるサーバーサイド) 4
    ボックスガチャの実装をしよう(ソーシャルゲームにおけるサーバーサイド) 4
     

    ボックスガチャの実装をしよう(ソーシャルゲームにおけるサーバーサイド) 4

    この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

    ど゛う゛じ゛で゛

    前回までのあらすじ

    前回

    ボックスガチャを作る事になりました。
    改修、追加すべきAPIは以下で、

    ・ボックスガチャを引く POST: gachas/draw
    ・現在のボックスの中身を確認 GET: gachas/current_box_contents
    ・各ステージでのボックスの中身の確認 GET: gachas/all_box_contents
    ・ボックスガチャのリセット POST gachas/reset_box
    

    それらの処理の為に、GachaBoxContentManagerという、ユーザーのボックスガチャの状態を一括管理するクラスを作成しました。

    そうすると、

    ・現在のボックスの中身を確認 GET: gachas/current_box_contents
    ・ボックスガチャのリセット POST gachas/reset_box
    

    この二つのAPIの実装は大体終わったも同然であり、また、

    ・各ステージでのボックスの中身の確認 GET: gachas/all_box_contents
    

    このAPIの実装もマスタデータを返すだけなのですぐに終わりました。
    残りは、

    ・ボックスガチャを引く POST: gachas/draw
    

    のみです。

    ボックスガチャを引く処理を作る

    通常ガチャを引くコードは大まかに以下のように分けられていました。

    APIが叩かれる
     受け取ったパラメータを元にガチャのプロセスを初期化
     ガチャのプロセスを実行する
      アサーション
      ガチャを指定回数だけ引く
      ガチャの結果からユーザーデータを更新
      ログの出力
     実行後、レスポンスを返す
    

    さーばーえんじにあ「このコードでの一番の問題は、1回ガチャを引く毎に中身のコンテンツが変わる事を考慮していないという事だ。
     ……どうしようかなこれ。
     ボックスガチャを引く為に大きく改修すべき部分は、
     ・ガチャを指定回数だけ引く
     ・ガチャの結果からユーザーデータを更新
     基本的にこの三つか。それ以外の部分は大きく変えたりは多分しなくて良い。
     A. ガチャのプロセスを継承してその部分だけを変えるか
     B. ガチャのプロセスそのものを拡張するか
     どっちが良いかな。
     うーん、例えば、他にも色んなガチャを実装するとしたらどうなるかな……。
     Aだと、それぞれのガチャの特性に合わせた部分だけを変更した新しいプロセスを作る必要が出てくる。でも、他の部分は基本のガチャに準じている訳だからまあ、見やすいかな。
     Bだと、一つのガチャのプロセスの中に色んなガチャに応じた分岐がどんどん増えていく事になる。完ッ璧に見辛いな。更に、改修を加える度に他のガチャに影響が出る可能性も否定出来ない。
     Aだな、うん。そうしよう」
     そうして、以下のように実装が進みました。

    APIが叩かれる
     (受け取ったパラメータを元にガチャのプロセスを初期化 <= ガチャ種が増えた事によって削除)
     受け取ったパラメータと、そのガチャの種類に応じたプロセスの初期化を行う <= new!
     プロセスを実行する
     実行後レスポンスを返す
    
    通常ガチャプロセス
     初期化
     アサーション
     ガチャを指定回数だけ引く
     ガチャの結果からユーザーデータを更新
     ログの出力
    
    ボックスガチャプロセス <= new!
     初期化 <= GachaBoxContentManagerの初期化もする
     アサーション
     ガチャの指定回数だけ
      ガチャを引く
      ボックスの中身を減算する
     ガチャの結果からユーザーデータを更新 <= GachaBoxContentManagerからボックスの中身も更新する
     ログの出力
    

    さーばーえんじにあ「こんな感じか。
     既存の通常ガチャへの影響はほぼ無し。じゃ、APIも作り終えたから、後はテストコード書いて……マスタのインポート処理とかをマスタが来次第作成、クライアントとの繋ぎこみをその後、か。
     あれ、まだまだやる事結構あるんか。
     ちょっと面倒だな……」

    記事を共有