Среда, 18 Декабря 2024, 17:45

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Определение лута с сундука
lentinantДата: Понедельник, 16 Декабря 2013, 07:02 | Сообщение # 1
ленивый программист
Сейчас нет на сайте
Задумался о том, как организовать алгоритм, определяющий, какой же предмет выпадет из сундука. Предполагается, что есть список предметов, которые могут выпасть из сундука, но выпасть может только один предмет.

Конечно же, можно сделать, чтобы выпадал рандомный предмет из списка, однако, это в принципе убивает возможность делать редкие предметы. А реализация нескольких чисел на один предмет будет довольно проблемной (ведь тогда надо будет суммировать шанс выпадения всех предметов, каждому предмету записать диапазон чисел, которые ему отвечают, а после результата рандома еще и искать этот предмет в массиве тупым перебором).

Еще была идея - "принцип пирамиды" (название сам придумал). Имеется список предметов, отсортированных за шансом выпадения, от минимального до максимального. Более того, последний предмет обязан иметь шанс 100 процентов (на самом деле, это скорей показатель приоритета выпадения). Сначала проходит рандом самого редкого предмета. Если рандом не сработал, то берем следующий предмет, и рандомим для него. И так далее. Если же ни один предмет не выпал вплоть до последнего, то тот имеет шанс 100 процентов (самый высокий приоритет), поэтому точно выпадет. Таким образом, он служит гарантией, что игрок точно что-то получит.

Ну, не знаю, будет ли этот принцип хорошо работать, так как, среди предметов с одинаковым шансом приоритет будет у того, который стоит первым (ведь если он выиграет, то следующего мы не увидим; например, три предмета с шансами по 90 процентов - чаще всего нам будет попадаться именно первый). Разве что можно сделать надстройку в виде дополнительного массива, в который заносить все предметы с одинаковым приоритетом, и рандомить с них.

Хотелось бы выслушать идеи других.


Когда-то тут будут ссылки на крутые проекты. Или нет.
TheAceДата: Понедельник, 16 Декабря 2013, 08:58 | Сообщение # 2
Pain is Pleasure
Сейчас нет на сайте
lentinant, можно сделать рандомный предмет из списка, но с "оттягиванием" в начало.

Но "принцип пирамиды" (где пирамида только?) вполне нормальный.
Можно сделать предметы по категориям и после выбора категории выбирать из нее уже полным рандомом предмет.


The End [3D][TPS]
LetsOffBrainsДата: Понедельник, 16 Декабря 2013, 09:23 | Сообщение # 3
Project SoRDeLKa
Сейчас нет на сайте
Тупой перебор - гарантия успеха, лол.




pixeyeДата: Понедельник, 16 Декабря 2013, 10:32 | Сообщение # 4
Red Winter Software
Сейчас нет на сайте
Цитата lentinant ()
Еще была идея - "принцип пирамиды" (название сам придумал). Имеется список предметов, отсортированных за шансом выпадения, от минимального до максимального. Более того, последний предмет обязан иметь шанс 100 процентов (на самом деле, это скорей показатель приоритета выпадения). Сначала проходит рандом самого редкого предмета. Если рандом не сработал, то берем следующий предмет, и рандомим для него. И так далее. Если же ни один предмет не выпал вплоть до последнего, то тот имеет шанс 100 процентов (самый высокий приоритет), поэтому точно выпадет. Таким образом, он служит гарантией, что игрок точно что-то получит.


Стандартная, правильная реализация.


ACTORS - мой фреймворк на Unity
Until We Die - игра над которой работаю

lentinantДата: Понедельник, 16 Декабря 2013, 16:37 | Сообщение # 5
ленивый программист
Сейчас нет на сайте
Цитата LetsOffBrains ()
Тупой перебор - гарантия успеха, лол.

Цитата lentinant ()
реализация нескольких чисел на один предмет будет довольно проблемной (ведь тогда надо будет суммировать шанс выпадения всех предметов, каждому предмету записать диапазон чисел, которые ему отвечают, а после результата рандома еще и искать этот предмет в массиве тупым перебором)

Цитата TheAce ()
где пирамида только?

Шанс самого верхнего предмета самый маленький, шанс следующего - немного больше, и т.д. Шанс последнего предмета - самый большой. Если визуализировать это все в виде отрезков с длиной, соответствующей шансу, получится пирамида.


Когда-то тут будут ссылки на крутые проекты. Или нет.
Serg1971Дата: Понедельник, 16 Декабря 2013, 16:56 | Сообщение # 6
Весёлый программист
Сейчас нет на сайте
А я бы сделал вот так:
Имеется к примеру три категории предметов - редкие, улучшенные, простые.
Сначала рандомно определяется категория, причём у всех категорий разный "вес". Предположим генерится число от 1 до 100 (ну как проценты)...
1...10 - редкие предметы
11...40 - улучшенные предметы
41...100 - простые предметы
Предположим выпало - улучшенные предметы, берём общее количество улучшенных предметов (к примеру 70 шт) и генерим число из диапазона 1...70 чтоб выбрать предмет. smile И так для любого предмета.
Вот и всё, чо париться-то? biggrin
Можно и уникальные предметы ввести - подвинув редкие на единичку, т.е:
1 - уникальный предмет
2...10 - редкие предметы
И далее по списку...




Сообщение отредактировал Serg1971 - Понедельник, 16 Декабря 2013, 17:01
lentinantДата: Понедельник, 16 Декабря 2013, 17:04 | Сообщение # 7
ленивый программист
Сейчас нет на сайте
Serg1971, слишком "однородная" вероятность.

Когда-то тут будут ссылки на крутые проекты. Или нет.
Serg1971Дата: Понедельник, 16 Декабря 2013, 17:08 | Сообщение # 8
Весёлый программист
Сейчас нет на сайте
Цитата lentinant ()
Serg1971, слишком "однородная" вероятность.

Почему однородная? Уникальный предмет будет выпадать один из ста примерно, 10% - выпадений будут редкие предметы, 30% - улучшенные, ну и в основном простые будут выпадать... Ты проверь рандомно как будет идти. А по твоему алгоритму - будут всегда выпадать одни и те же предметы, первые в списке из тех, у которых одинаковый шанс выпадения...




Сообщение отредактировал Serg1971 - Понедельник, 16 Декабря 2013, 17:13
lentinantДата: Понедельник, 16 Декабря 2013, 17:11 | Сообщение # 9
ленивый программист
Сейчас нет на сайте
Serg1971, если я захочу, чтобы одна редкая вещь выпадала реже, чем другая редкая вещь, то мне нужно будет заносить их в разные категории?

Когда-то тут будут ссылки на крутые проекты. Или нет.
Serg1971Дата: Понедельник, 16 Декабря 2013, 17:15 | Сообщение # 10
Весёлый программист
Сейчас нет на сайте
Цитата lentinant ()
Serg1971, если я захочу, чтобы одна редкая вещь выпадала реже, чем другая редкая вещь, то мне нужно будет заносить их в разные категории?

Нет, в категориях - ты можешь сделать такие-же подкатегории по вероятности. Предположим в редких вещах тоже поделить диапазон, то есть генерить не номер вещи, а снова процент, а уж потом номер вещи в каждой подкатегории уже редких вещей.




Сообщение отредактировал Serg1971 - Понедельник, 16 Декабря 2013, 17:17
tomkallenДата: Понедельник, 16 Декабря 2013, 17:17 | Сообщение # 11
частый гость
Сейчас нет на сайте
я где-то писал функцию двойного ролла, не помню уж где, сейчас на пиджене что-то похожее сымпровизирую
Код

//редкость типа предметов в процентах, чтобы проще настраивать и изменять по ходу игры.
//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

if (roll+epic>=0)
{
chooseEpicItem(bossId, 3)
}
elsif (roll+rare>=0)
{
chooseRareItem(bossId, 2)
}
else chooseMagicItem(bossId,1);

//chooseXXXXItem - функция выбора предмета из лут листа для конкретного босса/сундука/моба, отсылающая id лутлиста и качество предмета


Можно было сделать намного проще, но такой вариант позволяет настраивать и менять все на лету и также в самой уже игре изменять шанс и проч(эликсир удачи и т д)


Если можешь не делать игру - не делай.
FantargДата: Понедельник, 16 Декабря 2013, 18:07 | Сообщение # 12
участник
Сейчас нет на сайте
Японско-корейский рандом это и есть пирамида вложенная по категориям:)
То есть, синтез озвученного от 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
TheAceДата: Понедельник, 16 Декабря 2013, 18:09 | Сообщение # 13
Pain is Pleasure
Сейчас нет на сайте
Serg1971, я то же самое вторым постом в теме написал.

The End [3D][TPS]

Сообщение отредактировал TheAce - Понедельник, 16 Декабря 2013, 18:24
FantargДата: Понедельник, 16 Декабря 2013, 18:38 | Сообщение # 14
участник
Сейчас нет на сайте
Цитата TheAce ()
я то же самое вторым постом в теме написал

Ты же написал полным рандомом из категории.
А суть такая, что в пирамиде вложений нужна неравноценность изъятие из отдельных категорий.
То есть, даже уникальные предметы будут иметь свой "раритет"...

Хотя с другой стороны, зачем идти в такой анальный рандом? Если только доить в играх f2p:)
pixeyeДата: Понедельник, 16 Декабря 2013, 19:06 | Сообщение # 15
Red Winter Software
Сейчас нет на сайте
зачем изобретать велосипед

Код
public static  int Choose (List<float> probs)
  {  
   float total = 0;
    
   foreach (float elem in probs)
    total += elem;
    
    
   float randomPoint = UnityEngine.Random.value * total;
    
   for (int i=0; i<probs.Count; i++) {  
    
    if (randomPoint < probs [i])
     return i;
    else
     randomPoint -= probs [i];
     
    
   }
   return (int)(probs.Count - 1);
  }


ACTORS - мой фреймворк на Unity
Until We Die - игра над которой работаю

TheAceДата: Понедельник, 16 Декабря 2013, 19:11 | Сообщение # 16
Pain is Pleasure
Сейчас нет на сайте
Fantarg, я написал, что категория выбирается описанным ТС методом, а уже из нее рандомом лут.
Предполагал я, правда, что категории будет совсем не три, а по одной на каждую группу предметов с одинаковой ценностью.


The End [3D][TPS]
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг