Pull to refresh

Comments 21

Люди всех возрастов любят азарт, будь то Kinder Surprise, блэкджек или компьютерные игры. Представьте, у вас в игре есть две коробки: на одной написано «Вы получите 100 монет», а на второй — “Вы получите 50-1000 монет”. Сразу понятно, вокруг какой из коробок будет больше ажиотажа.

Э-э. Я один играю в игры ради сюжета и лора? То же самое и с азартом — предпочту гарантированный результат лотерее.
Значит, Вам хватает азарта и помимо игр. К счастью, Кармак был неправ и игры с сюжетом у нас так же есть.
Скорее я хочу видеть интригу в сюжете, интересный поворот событий, некая тайная локация, или просто подземелье с несколькими выходами на поверхность, необычное поведение NPC, атмосфера хоррора. Но точно останусь равнодушен к луту выпавшему из очередного босса или ящика. Так же не вызовет восторга система достижений. Единственное что мне понравилось из подобного, процедура автоматической генерации оружия в borderlands, которая влияет на реиграбельность.
Справедливости ради, говоря про необычное поведение NPC — это тоже часто достигается через манипуляции с рандомом, в зависимости от контекста игрока.
Например — шансы различных «проков» в Darkest Dungeon, или шансы попадания по цели в Xcom.
Т.е. лут сам по себе — это лишь дополнительный инструмент удержания интереса, который будет главным разве что в каких-либо слот-машинах, но это скучно, ИМХО.
Нет, я имел ввиду все же неожиданный квест, от NPC которого ты уже списал в статисты. К примеру заходишь ты в локацию и всякий раз отовариваешься у торговца, а на 20 заходе он предлагает тебе квест. Как правило там больше не random роль играет, а то что ты просто не достиг нужного уровня или не подобрал предмет.
То же самое и с азартом — предпочту гарантированный результат лотерее.

Некоторое время играл в мобильную игру, которую очень активно рекламируют на ютубе (та, где персонажей всяких надо собирать).

Знаю много людей, которые выложили по 300-500т.р (при том, что люди это были не очень богатые, зарабатывающие по 50-80т.р). Есть люди потратившие по моим прикидкам 2-4млн. Уровень аддикции у игры очень высокий, при том что сама игра по механикам довольно таки скудная. И это аддикция азартных игр!

Игра по сути мало чем отличается от казино, только по потенциальной прибыли казино нервно курит в сторонке. Ведь в казино можно выиграть реальные деньги, а в игре выигрываешь фантики.

Что касается мухлежа с лутбоксами: совсем ведь не обязательно делать шансы ниже заявленных, на получение каких-то крутых предметов. Общее правило всех нечестных игр с лутбоксами — давать шанс игрокам вытащить имбу (предмет заведомо крутой и имбалансный), но через некоторое время (когда уже собраны все сливки) — нерфить (балансировать) имбу и проводить новый цикл уже с новым предметом. Извините за слэнг.

Но да, насколько я помню на занижении шансов насколько я помню игроделов тоже ловили — были такие скандалы. Что характерно, рано или поздно такие игры начинают называть помойками и это очень точное и ёмкое определение.
Мой комментарий был скорее к этому.
Люди всех возрастов любят азарт, будь то Kinder Surprise, блэкджек или компьютерные игры.

Слишком уж обобщили. Азарт любят не все. Заядных игроманов очень не много, но да, они могут принести немалую прибыль организаторам.
Справедливости ради — в тексте не сказано «все любят азарт», там сказано «люди всех возрастов любят азарт». Кажется, с этим сложно спорить — в любой возрастной группе можно найти сколько-то азартных людей. Точно так же, как и сколько-то совершенно не азартных ))

Люди всех возрастов всего лишь сабсет всех людей.

Если лутбокс был куплен за реальные деньги, а не получен внутриигровым способом — в нем будет лежать более ценный/желанный дроп, даже если это один и тот же лутбокс.
А игроки-то знают, что в лутбоксах за реал дроп ценнее?
Потому что если знают, то это уже официально не тот же самый лутбокс, даже если отображается и называется одинаково.
А если не знают, то со стороны разработчиков это просто феерически бессмысленная попытка смухлевать — если игроки думают, что дроп одинаковый, то их ничего не будет стимулировать покупать боксы именно за реал, а значит, мухлёж с ценностью дропа ни на что не влияет.
Визуально и по описанию они могут никак не отличаться, а обосновывается обычно психологией позитивного подкрепления. Мол, заплатил, стало «круто». И в следующий раз игрок вместо фарма такого лутбокса может выбрать покупку.
Т.е. фактически это работает только на тех, кто уже совершил первую покупку.
Почему не будет? Возможность быстрее получить награду. Для внутриигрового лутбокса надо потратить время и заработать его, при покупке он достается моментально.
Имелось в виду, что более высокая ценность содержимого никак на это не повлияет.
То есть те, кто были готовы покупать за реал, так и будут покупать за реал.
А те, кто пользовались только внутриигровыми лутбоксами, не начнут покупать лутбоксы за реал ради более ценного содержимого, если они уверены, что содержимое там точно такое же.
Сколько видел игр с лутбоксами — почти везде это выглядит как развод на деньги, когда тебе продают предмет, но не говорят сколько он стоит пока не внесешь всю сумму. Типа «Мало, плати еще чтобы получить, но что заплатил уже не отдадим, так что лучше бы тебе все-таки доплатить, но сколько не скажем». Старые GM-шопы с конкретным ценником за конкретную вещь выглядят честнее и прозрачнее — заплатил $10000 и ты папка-нагибатор, а тут не понятно то-ли ты заплатишь $100, толи $100500 за то, чтобы получить какой-то предмет.

Правильно сделали голландцы с фифой.
Так вроде предметы уже нигде и не продают.
Продают жетончики, чтобы крутить слот-машину, а что из неё выпадет, никто не знает.
Все-таки иногда продают. Из того что с ходу приходит в голову «премиумные» танки/самолеты/корабли. Плюс в некоторых говноиграх все-таки некоторые предметы иногда предлагается купить напрямую, мимо лутбоксов.
Про «Гарантированное выпадение» — очень плохой совет даёте. Постройте график за сколько попыток игрок получает конкретный предмет — например для 1/1000 это обычно выглядит вот так:

Возможно вы очень удивитесь, ведь для шанса выпадения 1/50 при стандартном распределении с помощью обычного псевдо-рандома (System.Random в .NET) получается кривая с сильным перевесом в самом начале и длинным хвостом — хотя в среднем и получится 50 попыток, это далеко не то, что многие игроки ожидают и это особенно неприятно для вещей, у которых очень редкий шанс выпадения вроде 1/1000, ведь в некоторых случаях игроку потребуется более 10 тысяч попыток сделать чтобы получить предмет — такова природа распределения у такой функции рандома.
Так вот, по этой причине, если просто вручную хакать этот метод как вы предложили (поставить if), у вас в среднем получится вовсе не 1/50 шанс выпадения, а гораздо более высокий! Думаю, ближе к 1/25 если не ещё выше. Просто посмотрите на графике выше и поставьте линию отсечения, и оцените сколько попаданий до неё, и сколько после. Всё очевидно!
Я нашёл другой способ. Шанс выпадения должен быть 1/(2*N — M) где N это желаемое число попыток, а M это уже сделанное число попыток. Таким образом при использовании псевдо-рандома получается абсолютно ровное распределение числа попыток с сохранением гарантии выпадения предмета за указанное число попыток N в среднем, но игроку потребуется сделать не более 2*N попыток.
Можете прочитать мою заметку на этот счёт с полезными графиками (на английском) forums.atomictorch.com/index.php?topic=1734 всё объяснено подробно и есть ссылки на Github и онлайн-сэмпл на JS.
У нас в игре была проблема с выпадением редких предметов, и часть игроков жаловалась на это, а другая часть игроков наоборот, говорили, что слишком хорошо выпадают предметы («мне быстро выпало!»). И обе группы в итоге правы, что показывает график опубликованный выше — на одну группу крайних неудачников есть точно такая же по размеру группа крайних счастливчиков. В заметке по ссылке я объяснил, как мы решили эту проблему. Минусов у моего решения найдено не было, а плюсов полно — в виде полностью ровного распределения и гарантии получения предмета за разумное и известное число попыток (не более чем вдвое хуже чем указанная вероятность, т. е. для предмета с шансом 1/50 будет не более 100 попыток, но в среднем 50; но самое прекрасное это то, что вероятность получения предмета за 1 попытку, за 50 попыток, и за 100 попыток — одинаковая, график распределения числа попыток — прямая. Нет сумасшедших счастливчиков и бесконечных неудачников, всё ровно!).
Возможно я неправильно Вас понимаю, но у меня распределение System.Random() никакой параболы не рисует, на большом числе попыток видно практически линейное распределение: dotnetfiddle.net/MLOanI

Далее, в моем варианте «гарантированного выпадения» предполагалось, что можно решить проблему «в лоб», а именно: игроки получают дроп в рамках обычного рандома, но если вдруг число попыток превышено — мы игнорируем рандом полностью и выдаем желаемую вещь.

Попробую показать на примере. Допустим у нас есть шанс выпадения в 15% и лимит в 10 попыток.

  1. Ось «мат.ожидание 1» — это сценарий, когда мы в рандом не вмешиваемся вообще, и да, на 10й попытке далеко не все получат желанный лут
  2. Ось «мат.ожидание 2» — это сценарий из статьи, когда на последней попытке даем вещь «в лоб»
  3. Ось «мат.ожидание 3» — это Ваш сценарий, здесь видно, что на 10й попытке мат.ожидание не достигает единицы.
  4. Навскидку, альтарнативный вариант модифицировать шанс выпадения, при котором у нас более плавный рост мат.ожидания и гарантированный результат в конце. Формула шанса следующая: Базовый_шанс + (1-Базовый шанс) * (A-1) / (B-1), где «A» — это последовательная сумма номеров осуществленных попыток дропа (включая текущую), а «B» — это сумма номеров попыток с первую по максимальную. Сумму считаем по формуле n * (a+b)/2,

Чаще всего с шансом просто не заморачиваются и используют вариант 2, что, лично на мой взгляд, топорно, хотя и работает
Спасибо за быстрый ответ! Интересный будет диалог, т. к. я давно хотел поговорить об этом с коллегами по индустрии.
Распределение значений System.Random равномерное и с этим никто не спорит (вероятность возврата любого числа одинаковая). Ваш скрипт на JSFiddle показывает это замечательно.
Речь же идёт о другом — сколько игроку нужно сделать попыток, чтобы получить предмет с определённым шансом выпадения. И вот тут как раз получается «парабола» на моём графике. Кому-то везёт очень быстро получить предмет, кому-то не везёт вовсе и они страдают делая невероятное число попыток. Конечно, среднее число попыток, матожидание, достигается, но не тем способом, который бы устраивал разработчиков и игроков (посмотрите на моём графике сколько случаев слева от красной вертикальной линии, и сколько справа, в среднем как раз 1000 выходит, НО, медианное значение около 700!).

Псевдокод простой и соответствует тому как это происходит в игре — возьмите 10 тысяч игроков и прогоните для каждого из них вызов функции ролла предмета с заданной вероятностью в цикле, пока предмет не будет получен. Количество итераций этого цикла как раз показывает число попыток необходимых для получения предмета. Если вы возьмёте и построите на графике для этих 10 тысяч игроков распределение числа сделанных ими попыток для успешного получения предмета, оно будет как раз такой «параболой» — когда половина игроков в среднем действительно уложилась до матожидания, но остальная половина плетётся длиннющим хвостом. Вот JSFiddle (без графика, не забудьте открыть консоль; результат просто в виде разбития по корзинам размером в 200 игроков для выборки в 10000). Как видно в среднем игроку нужно 1000 попыток, а в медиане 700 попыток.

И, соответственно, если вы просто поставите топорный if как предложено в статье, получится вообще странный вариант, когда игроки получат предмет не за ожидаемые 1000 шансов в среднем, а за меньшее число шансов. Вот JSFiddle. Как видно, игроку в среднем нужно 630 попыток, а медиана — 700 попыток (ни то ни другое число не является 1000 как ожидает геймдизайнер!). Как видно по разбивки на bucket'ы, из 10000 игроков порядка 3700 достигают 1000 попыток, когда срабатывает жёсткий лимит и предмет выдаётся насильно. Это мне было очевидно сразу, поэтому я назвал ваш совет из статьи очень плохим.

И теперь посмотрите предложенный мной в корневом комментарии рецепт JSFiddle. Что мы видим? Полностью равномерное распределение числа **попыток** необходимых для получения предмета с нужной вероятностью. В примере для заданной вероятности выпадения предмета в 1/1000 в среднем игроку нужно потратить 1000 попыток, и медиана тоже — 1000 попыток. При этом игроку не придётся осуществлять более 2000 попыток.
Игроки уже успели оценить данное ноу-хау (в других источниках я на такой подход не натыкался и шёл по наитию) и похвалили систему лута за соответствие их ожиданиям. Раньше в игре получить предмет с шансом в 1/1000 хоть и в среднем удавалось за 1000 попыток если рассматривать ВСЕХ игроков, для каждого индивидуального игрока это работало самым непредсказуемым образом — кому-то везло сразу (5% игроков получало предмет за 50 попыток, тогда как другие 5% игроков получало его за более чем 3000 попыток!), кому-то невезло хронически. Теперь же игра гарантированно даст этот предмет за не более чем 2000 попыток, но в среднем и по медиане — 1000 попыток.
Для некоторых игр (тем более одиночных) такой подход даст наилучший результат с точки зрения игрока, да и геймдизайнер тоже доволен предсказуемостью такого псевдослучайного подхода. А вы как думаете?

Что касается вашего графика — конечно, результат будет не тем, т. к. строите вы что-то другое (можно исходник?). Как я это вижу, для шанса в 15% (вероятность 1/6.666(6)) ожидается, что в среднем игрокам за 6.67 попыток достанется предмет. Если округлим до 7, то по моему алгоритму получится, что в среднем игроку придётся затратить 7 попыток, медиана тоже 7, но общее число попыток не более чем 14. Если же вы оставите обычный рандом, с ним получается, что для заданной вероятности (15%, N=6.667) для выборки в 10 тысяч игроков в среднем игроку потребуется 6.6 попыток, медиана 5.0. При этом число игроков, которым потребуется 14+ попыток (вдвое больше ожидаемого среднего!), составляет 12-14%. Просто подставьте значения в мой первый JSFiddle и всё будет очевидно (измените N на 6.667, а размер bucket'а следует сделать равным N для случая с таким малым N).
Подставьте те же цифры в мой последний JSFiddle где используется мой алгоритм, и вы увидите среднее число попыток 6.667, медиану 7, и ровное (прямая линия вместо «параболы») распределение числа попыток во всём диапазоне от 1 до 13 (среднее число попыток не совпадает с медианой только потому что вероятность 15%, что не делится на точное число попыток; можно попробовать N=7 для примера).
(Извиняюсь, немного отредактировал из-за неточного комментария про различии наших графиков)
Посмотрел подробнее ваш график. У меня просто одна ось другая, но смысл очень близкий. По оси Y я отображаю число игроков получивших предмет в данное число попыток (и оно падает с увеличением X, стремясь к 0), а у вас это кумулятивное значение (сколько % игроков получило предмет для заданного числа попыток, соответственно оно растёт с увеличением X, стремясь к 100%).

«Горбик» или «парабола» для стандартного распределения (№1) у вас наблюдается на графике тоже — в виде горизонтальной асимптоты. Просто нужно поставить больше попыток для наглядности — например, 50 — и будет видно, что она и дальше стремится к бесконечности. А для большей наглядности стоит тестировать модель на более низкой вероятности, например, 1/1000.

Но даже на вашем график видно, что на 7-й попытке для стандартного распределения (№1) порядка 67% игроков уже смогли получить предмет. Ещё +12-14% будет достигнуто примерно на 14-й попытке, а 99% будет достигнуто о-о-очень далеко от этого. И это есть главная проблема в геймплее: часть игроков-счастливчиков попадает в самое начало распределения, другая же группа игроков такого же размера практически бесконечно долго гриндит в надежде получить предмет.
Мой алгоритм исправляет данную проблему и мы видим на вашем графике прямую, проходящую до 14 попыток к 100%. 50% должно быть достигнуто на 7-й попытке (и это является как средним, так и медианным значением), и 100% на 14-й попытке. Не уверен, в связи с чем связана некоторая неточность на вашем графике, но тренд очевиден — линия идёт прямо и направляется к 14. Никаких «горбиков». Всё понятно и удобно в использовании. И не нужно объяснить геймдизайнеру и тем более игрокам, почему, затратив более 2000 попыток, они до сих пор не нашли какой-нибудь драгоценный камушек у которого вероятность выпадения 1/1000 — потерпеть максимум вдвое дольше нужного вполне допустимо.

Вклинивая решение с if'ом «в лоб» (подход №2), вы однозначно ставите крест на необходимом среднем числе попыток и на медианном значении. Ваше решение №4 тем более оказывается неудачным, т. к. оно только усиливает «горб» — посчитайте, какое среднее и какая медиана получаются, мне очевидно, что они сильно сдвинуты влево, в сторону меньшего числа попыток. Там уже нет речи про 15% шанс (т. е. «6.667 попыток в среднем», а желательно и по медиане тоже!) — ведь уже с третьей попытки игроки получают предмет в практически 50% случаев. С задачей уложиться в заданное число попыток вы безусловно справились (и если поставлена такая задача, «китайский рынок», это видится мне более уместным решением, чем вариант «в лоб»), но в итоге игроки будут получать гораздо больше предметов, чем задано геймдизайнером.
В моём алгоритме, в сочетании с обычным стандартным распределением функции System.Random, мы получаем идеально ровную прямую (в случае вашего графика однородно/линейно восходящую вверх, т. к. вы строите именно какой % игроков к данному числу попыток получит предмет, это кумулятивное значение включающее игроков получивших предметы за предыдущие попытки). Вот пример моего графика для 50 тысяч игроков:

— все «ведёрки» заполнены одинаково, т. е. игроки равномерно распределены по числу потребовавшихся им попыток для получения предмета. И общее количество попыток не может превысить 1999 для предмета с вероятностью 1/2000. В среднем — 1000, медиана — тоже идеальные 1000. Мы получили равномерное распределение итоговой вероятности получения предмета вместо bell curve или «параболы».

Отличная статья, особенно порадовали картинки кубиков в абзацах.

Sign up to leave a comment.