From 69c3c380bbfebc2834de88eda606f0d09889290c Mon Sep 17 00:00:00 2001 From: Ivor Barhansky Date: Tue, 1 Feb 2022 10:31:22 +0000 Subject: [PATCH 1/2] =?UTF-8?q?=D0=A1=D0=BE=D0=B7=D0=B4=D0=B0=D0=BB(=D0=B0?= =?UTF-8?q?)=20'ItemRoulette/ItemRoulette.php'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ItemRoulette/ItemRoulette.php | 107 ++++++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 ItemRoulette/ItemRoulette.php 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 From 900f37312aee01b1b6c847049ec45ea6eac1d057 Mon Sep 17 00:00:00 2001 From: Ivor Barhansky Date: Tue, 1 Feb 2022 10:33:15 +0000 Subject: [PATCH 2/2] =?UTF-8?q?=D0=A1=D0=BE=D0=B7=D0=B4=D0=B0=D0=BB(=D0=B0?= =?UTF-8?q?)=20'ItemRoulette/index.php'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ItemRoulette/index.php | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 ItemRoulette/index.php diff --git a/ItemRoulette/index.php b/ItemRoulette/index.php new file mode 100644 index 0000000..82455e2 --- /dev/null +++ b/ItemRoulette/index.php @@ -0,0 +1,21 @@ + 0.25, 'item-2' => 0.5, 'item-3' => 5, 'item-4' => 4.25333]; +$prize->setItems($items); +var_dump($prize->loot()); +var_dump($prize->loot(5)); + +/*string(6) "item-4" +array(5) { + [0]=> + string(6) "item-3" + [1]=> + string(6) "item-4" + [2]=> + string(6) "item-3" + [3]=> + string(6) "item-2" + [4]=> + string(6) "item-3" +}*/ \ No newline at end of file