Задумался о том, как организовать алгоритм, определяющий, какой же предмет выпадет из сундука. Предполагается, что есть список предметов, которые могут выпасть из сундука, но выпасть может только один предмет.
Конечно же, можно сделать, чтобы выпадал рандомный предмет из списка, однако, это в принципе убивает возможность делать редкие предметы. А реализация нескольких чисел на один предмет будет довольно проблемной (ведь тогда надо будет суммировать шанс выпадения всех предметов, каждому предмету записать диапазон чисел, которые ему отвечают, а после результата рандома еще и искать этот предмет в массиве тупым перебором).
Еще была идея - "принцип пирамиды" (название сам придумал). Имеется список предметов, отсортированных за шансом выпадения, от минимального до максимального. Более того, последний предмет обязан иметь шанс 100 процентов (на самом деле, это скорей показатель приоритета выпадения). Сначала проходит рандом самого редкого предмета. Если рандом не сработал, то берем следующий предмет, и рандомим для него. И так далее. Если же ни один предмет не выпал вплоть до последнего, то тот имеет шанс 100 процентов (самый высокий приоритет), поэтому точно выпадет. Таким образом, он служит гарантией, что игрок точно что-то получит.
Ну, не знаю, будет ли этот принцип хорошо работать, так как, среди предметов с одинаковым шансом приоритет будет у того, который стоит первым (ведь если он выиграет, то следующего мы не увидим; например, три предмета с шансами по 90 процентов - чаще всего нам будет попадаться именно первый). Разве что можно сделать надстройку в виде дополнительного массива, в который заносить все предметы с одинаковым приоритетом, и рандомить с них.
Хотелось бы выслушать идеи других. Когда-то тут будут ссылки на крутые проекты. Или нет.
lentinant, можно сделать рандомный предмет из списка, но с "оттягиванием" в начало.
Но "принцип пирамиды" (где пирамида только?) вполне нормальный. Можно сделать предметы по категориям и после выбора категории выбирать из нее уже полным рандомом предмет. The End [3D][TPS]
У каждого предмета есть свой шанс выпадения в виде приватной переменной. У самого редкого единичка, остальные относительно него принимают значения. После инициализации всех предметов или во время инициализации или вручную вычисляем сумму всех этих "шансов". Рандомим с максимумом этой суммы. Пробегаясь по массиву выбираем предмет. Например, нарандомило 5-ку, а в массиве у первых элементов значения {1,1,2,3,...} соответственно, в первый, второй и третий элемент с 5-кой мы не попадаем, попадаем в 4-ый, выдаем этот предмет. Если нарандомит 1 - то выпадет первый предмет; 2-2; (3-4) - 3; (5-7) - 4...
Та же хрень с шансом, но в массив заносим ссылки на предметы соответственно чем больше шанс, тем больше ссылочек на этот предмет в массиве. Рандомим по тому же принципу, но исключается перебор.
Еще была идея - "принцип пирамиды" (название сам придумал). Имеется список предметов, отсортированных за шансом выпадения, от минимального до максимального. Более того, последний предмет обязан иметь шанс 100 процентов (на самом деле, это скорей показатель приоритета выпадения). Сначала проходит рандом самого редкого предмета. Если рандом не сработал, то берем следующий предмет, и рандомим для него. И так далее. Если же ни один предмет не выпал вплоть до последнего, то тот имеет шанс 100 процентов (самый высокий приоритет), поэтому точно выпадет. Таким образом, он служит гарантией, что игрок точно что-то получит.
Стандартная, правильная реализация. ACTORS - мой фреймворк на Unity Until We Die - игра над которой работаю
реализация нескольких чисел на один предмет будет довольно проблемной (ведь тогда надо будет суммировать шанс выпадения всех предметов, каждому предмету записать диапазон чисел, которые ему отвечают, а после результата рандома еще и искать этот предмет в массиве тупым перебором)
ЦитатаTheAce ()
где пирамида только?
Шанс самого верхнего предмета самый маленький, шанс следующего - немного больше, и т.д. Шанс последнего предмета - самый большой. Если визуализировать это все в виде отрезков с длиной, соответствующей шансу, получится пирамида. Когда-то тут будут ссылки на крутые проекты. Или нет.
А я бы сделал вот так: Имеется к примеру три категории предметов - редкие, улучшенные, простые. Сначала рандомно определяется категория, причём у всех категорий разный "вес". Предположим генерится число от 1 до 100 (ну как проценты)... 1...10 - редкие предметы 11...40 - улучшенные предметы 41...100 - простые предметы Предположим выпало - улучшенные предметы, берём общее количество улучшенных предметов (к примеру 70 шт) и генерим число из диапазона 1...70 чтоб выбрать предмет. И так для любого предмета. Вот и всё, чо париться-то? Можно и уникальные предметы ввести - подвинув редкие на единичку, т.е: 1 - уникальный предмет 2...10 - редкие предметы И далее по списку...
Сообщение отредактировал Serg1971 - Понедельник, 16 Декабря 2013, 17:01
Почему однородная? Уникальный предмет будет выпадать один из ста примерно, 10% - выпадений будут редкие предметы, 30% - улучшенные, ну и в основном простые будут выпадать... Ты проверь рандомно как будет идти. А по твоему алгоритму - будут всегда выпадать одни и те же предметы, первые в списке из тех, у которых одинаковый шанс выпадения...
Сообщение отредактировал Serg1971 - Понедельник, 16 Декабря 2013, 17:13
Serg1971, если я захочу, чтобы одна редкая вещь выпадала реже, чем другая редкая вещь, то мне нужно будет заносить их в разные категории? Когда-то тут будут ссылки на крутые проекты. Или нет.
Serg1971, если я захочу, чтобы одна редкая вещь выпадала реже, чем другая редкая вещь, то мне нужно будет заносить их в разные категории?
Нет, в категориях - ты можешь сделать такие-же подкатегории по вероятности. Предположим в редких вещах тоже поделить диапазон, то есть генерить не номер вещи, а снова процент, а уж потом номер вещи в каждой подкатегории уже редких вещей.
Сообщение отредактировал Serg1971 - Понедельник, 16 Декабря 2013, 17:17
я где-то писал функцию двойного ролла, не помню уж где, сейчас на пиджене что-то похожее сымпровизирую
Код
//редкость типа предметов в процентах, чтобы проще настраивать и изменять по ходу игры. //mob_modifier = "лутабельность" моба/босса – от 0.01 до 1.00 var epic = 5*mob_modifier; var rare = 25*mob_modifier; var magic = 50*mob_modifier;
Randomize(); //проверка качества: roll = floor(random(101))-100
//chooseXXXXItem - функция выбора предмета из лут листа для конкретного босса/сундука/моба, отсылающая id лутлиста и качество предмета
Можно было сделать намного проще, но такой вариант позволяет настраивать и менять все на лету и также в самой уже игре изменять шанс и проч(эликсир удачи и т д) Если можешь не делать игру - не делай.
Японско-корейский рандом это и есть пирамида вложенная по категориям:) То есть, синтез озвученного от Serg1971 и lentinant И еще, пирамидальный принцип, это когда вероятность шанса мы проверяем не за раз, а вложениями. RND(50)*RND(50)= проверка 25% шанса
== вариант мазохиста (для размышления, куда можно смотреть):
Каждый предмет имеет свой id номер Номера не назначают по задуманному заранее, чтобы всегда можно было добавлять БД, а не исправлять. Теперь смотрите: id143512 - такой предмет у игрока просто нет шансов вынуть:) А вот этот: id905885 - проще! И вот это: id999999 - тот самый предмет невезунчикам (если предусмотрено разные предметы невезенчикам, тогда достаточно разбавлять нулями в длинном порядке цифр по id, см. ниже)
Мы можем использовать систему лотерейных билетов и проверку вероятности, где каждая цифра - это шанс: 3-30% 9-90% 0 - 100% 1- 10% Сейчас поясню. Как указал выше, у нас есть 6 разрядов на каждый предмет (6-ти значное число по id) Это значит, что будет произведена проверка в 6 этапов. Пример. RND(100) дает первое число 65, это означает что у нас первый разряд 6 (начало id6*****) Это же означает, что все предметы от id1***** до id5***** не будут участвовать в дальнейшем "розыгрыше"
Сообщение отредактировал Fantarg - Понедельник, 16 Декабря 2013, 18:11
Ты же написал полным рандомом из категории. А суть такая, что в пирамиде вложений нужна неравноценность изъятие из отдельных категорий. То есть, даже уникальные предметы будут иметь свой "раритет"...
Хотя с другой стороны, зачем идти в такой анальный рандом? Если только доить в играх f2p:)
Fantarg, я написал, что категория выбирается описанным ТС методом, а уже из нее рандомом лут. Предполагал я, правда, что категории будет совсем не три, а по одной на каждую группу предметов с одинаковой ценностью. The End [3D][TPS]