diff --git a/ItemRoulette/ItemRoulette.php b/ItemRoulette/ItemRoulette.php new file mode 100644 index 0000000..ac77bb4 --- /dev/null +++ b/ItemRoulette/ItemRoulette.php @@ -0,0 +1,107 @@ +items as $itemsPercent) { + $sumOfPercents += $itemsPercent; + } + $cd = $this->countDecimals($sumOfPercents); + for ($i = 0; $i < $cd; $i++) { + $multiplier *= 10; + } + $sumOfPercents *= $multiplier; + $rand = mt_rand(1, (int)$sumOfPercents); + $rangeStart = 1; + foreach ($this->items as $itemKey => $itemsPercent) { + $rangeFinish = $rangeStart + ($itemsPercent * $multiplier); + if ($rand >= $rangeStart && $rand <= $rangeFinish) { + break; + } + $rangeStart = $rangeFinish + 1; + } + return $itemKey; + } + + /** + * Функция, запускающая расчёт определённое количество раз и возвращающая массив выпавших предметов. + * + * @param $rolls + * @return array + */ + private function getMany($rolls): array + { + $result = []; + for ($i = 0; $i < $rolls; $i++) { + $result[] = $this->roll(); + } + return $result; + } + + /** + * Функция, запускающая расчёт один раз и возвращающая один предмет. + * + * @return string + */ + private function getOne(): string + { + return $this->roll(); + } + + /** + * Передача массива шанса выпадения предметов в класс. + * + * @param array $items + * @return void + */ + public function setItems(array $items) + { + $this->items = $items; + } + + /** + * Функция, запускающая расчёт определённое количество раз и, в зависимости от количества запусков + * возвращающая либо массив выпавших предметов либо одно строчное значение. + * + * @param int $rolls сколько предметов надо получить на выходе. + * @return array|string + */ + public function loot(int $rolls = 1) + { + return $rolls > 1 ? $this->getMany($rolls) : $this->getOne(); + } +} \ No newline at end of file