9
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PHPでガチャ

Last updated at Posted at 2018-02-20

以前隔週でガチャを実装することを何年かやっていたときのことを思い出したので基本的な考え方をまとめておきます。

隔週リリースみたいなもので当時は毎回どきどきしながらリリースしていました。基本的に排出率設定等は別ファイルに持たせておいてエンジニアでなくても編集できるようにしておくのが良いと思います。(エンジニアの責任逃れ的な意味で?)

ガチャロジック

(当時を思い出しながら記載してみます。)

ランダムを取得する方法としてはshufflerandmt_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が当たったらそれを付与するといった感じです。

9
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?