以前隔週でガチャを実装することを何年かやっていたときのことを思い出したので基本的な考え方をまとめておきます。
隔週リリースみたいなもので当時は毎回どきどきしながらリリースしていました。基本的に排出率設定等は別ファイルに持たせておいてエンジニアでなくても編集できるようにしておくのが良いと思います。(エンジニアの責任逃れ的な意味で?)
ガチャロジック
(当時を思い出しながら記載してみます。)
ランダムを取得する方法としてはshuffle
、rand
、mt_rand
(古いrand
の代替品)等がありますがPHP7から精度の高いらしいrandom_int
が追加されたのでそれを使ってみます。
排出率はスクフェスを参考にしてみます。
UR: 1%
SSR: 4%
SR: 15%
R: 80%
$weight_list = [
'UR' => 1,
'SSR' => 4,
'SR' => 15,
'R' => 80,
];
$result_number = random_int(1, array_sum($weight_list));// 1~100
$total_weight = 0;
foreach ($weight_list as $name => $weight)
{
$total_weight += $weight;
if ($result_number <= $total_weight)
{
$result = $name;
break;
}
}
var_dump($result);
余談
Aパーセント中のBパーセントみたいになことですが、
レアリティの中でアイテムやカード毎に重みづけされている場合はさらにレアリティ毎のガチャを引けば良いと思います。
実運用となると誰でも編集可能なようにcsvやjson等でそれぞれのアイテムの排出率を記載しておき、実装の際にアイテムやカードのIDがキーになるように配列を作り、排出率を整数値になるようにロジック側で調整して実装する感じかと思います。
例)
アイテムID:1001の出現率が0.0003ならば
$weight_list = [
1001 => 3
]
random_int(1, 10000);
みたいなイメージで1001が当たったらそれを付与するといった感じです。