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

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

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

このキャラクターにこれだけの価値があったのだろうか……? いや、ある、無ければ困る! だって、だって、だって、これだけのお金を掛けたんだもん! 高級なYAKINIKU以上の価値があるんだもん! もん! もん……。タン塩……。焼けて少し丸まった歯ごたえ豊かなタン塩にレモンをキュッと絞って……。

前回までのあらすじ

前回

 ボックスガチャのサーバーサイドのコードの実装が完了しました。
 残るは、テストコードの作成、マスタのインポート処理、クライアントとの繋ぎこみくらいです。

テストコードの実装をしよう

さーばーえんじにあ「仕様書からだと

・ボックスガチャは通常ガチャと同様、1連と10連で引ける
・ボックスガチャで引けるものは通常ガチャと同等
・10連を選択した時にボックスの中身が9個以下だった場合、消費される対象はその中身分のみとなり、全てを自動で排出する
・リセットする度に上限までボックスの中身は変わる
・リセットは自由に可能。そのステージのボックスガチャを1回も引かなくともリセットが出来る

 こんな感じのことが書かれていて、これに対応したテストコードと、
 まあ、後は普通のガチャと同じように、消費する物がそもそも足りなかった場合とかにエラーが起こることを書いておけばいいか。
 後、今回はGachaBoxContentManagerっていうボックスガチャの状態を一括管理するクラス作ったからそこの点でもテストコード作っておくか」

さーばーえんじにあ「必要なテストは

・ボックスガチャを1回引いた時、そして10回引いた時に
 ・ボックスの中身が正常に引かれている事
 ・ユーザーのキャラクターが増えている事
 ・ユーザーの消費対象物が減っている事
 ・ログが記録される事
・ボックスの中身が9個以下だった場合に10回引くを選択した場合に
 ・中身が空になり、ユーザーの消費対象もその分だけ減っている事
・リセットに対して
 ・正常にリセットが出来て
 ・次のステージのボックスがフルの状態である事
 ・リセットは指定回数より多くやろうとしたらエラー
......

 よし! 必要なテスト項目は20個オーバー!
 そしてそのテストをする為には

・ダミーキャラクターマスタ複数作って
 ・それに付随するキャラクターのパラメータマスタとか作って
・ダミーガチャマスタ作って
 ・ダミーボックスガチャ中身マスタ作って
・ダミーユーザー作る為に
 ・ユーザーランクマスタとかそういうのも必要で
・それ作ってからダミーユーザー作って
 ・ダミーユーザーに消費対象のブツを十分に渡した上で
・プロセスのコンストラクタを呼び出してプロセスを実行! 
 ・実行された事に対して想定される結果を書く!

 …………つ、疲れる。
 でも、書いとかないと、リファクタリングとか気軽に出来ない……。
 頑張ろう……」

マスタインポートの処理を書こう

ぷらんな「仮マスタ出来たよ」
さーばーえんじにあ「了解ですー。こっちもテストコード作成がキリ良いところなので、そっち先に対応しますー。
で、不正なマスタデータが入らないようにする為には、どういう事を制限を掛けておけば良いかなってのは……、

・通常ガチャ指定のガチャマスタは、ボックスガチャ内容マスタに子データを持っていてはならない
・ボックスガチャ指定のガチャマスタは、ガチャ内容マスタに子データを持っていてはならない
・ボックスガチャ指定のガチャマスタは、リセット制限回数が1以上を指定していなくてはいけない
・ボックスガチャ内容マスタにガチャコード単位で排出キャラクターに重複があってはならない
・ボックスガチャ内容マスタの排出キャラクター量は1以上でなければいけない
・ボックスガチャ内容マスタの内容のステージ数は、ボックスガチャ指定のガチャマスタのリセット制限回数と一致していなければならない

 ……えーっと、ざっと洗いだすとこの位かな……。他にプランナー目線とかからで抜けている事無いかな」
ぷらんな「あ、単純な事抜けてるね」
さーばーえんじにあ「えっ」
ぷらんな「ボックスガチャの排出キャラクターがマスタに実存するかの確認してないじゃん」
さーばーえんじにあ「あっ」

1時間後

さーばーえんじにあ「条件満たした上で仮マスタ入りましたー」
ぷらんな「やったぜ」


小ネタ:

・通常ガチャ指定のガチャマスタは、ボックスガチャ内容マスタに子データを持っていてはならない
・ボックスガチャ指定のガチャマスタは、ガチャ内容マスタに子データを持っていてはならない

こういう二つの条件は整理してみたりすると一つの条件に纏められます。

ガチャマスタ |内容が存在しているマスタ|正常か異常
通常ガチャ  |通常ガチャ       |正常
通常ガチャ  |ボックスガチャ     |異常
ボックスガチャ|通常ガチャ       |異常
ボックスガチャ|ボックスガチャ     |正常

即ち、

・ガチャマスタと対応する、内容が存在しているマスタが通常とボックスにどちらか片方のみにあり、そして一致している

と同等になります。
後、排他的論理和とかを使ったりしても簡潔に纏められる場合があります。
上記で使うならば、

・(ガチャマスタが通常である xor 内容が存在しているマスタが通常である)ならば異常である

となります。
まあ、簡潔に纏められても分かりづらい場合は、分かりやすさを優先して多少冗長になってもそちらの方が良いです(そもそも排他的論理和自体が分かりづらいかもしれない)。

記事を共有

最近人気な記事