Теория вероятностей – одна из важных частей не только игрового дизайна, строго заскриптованые события без вариантов быстро вызовут скуку у игроков. У меня за спиной был всего один год этой дисциплины в универе, и не сказать, чтобы нужно было применять это каждый день, но когда надо объяснить базовые знания дизайнерам, то приходится сталкиваться с тем, что каждый дизайнер понимает теорию вероятности по-своему. Эти мои размышления появились после обсуждения с одним из коллег замечательной статьи Яна Шрайбера о неслучайных случайностях и сломанных ГСЧ в играх. Игры - это огромные недетерминированные системы, независимо от того, закладывали это в проект или нет. И понимание природы случайности для контролирование таких систем, которые влияют на опыт игрока, помогает создавать их так, чтобы они не казались прибитыми сбоку гвоздями. Если в системе есть случайность, нужно понимать как её изменить, приблизив её к бытовому пониманию игроков. И даже если все механики игры строго детерминированные - их взаимодействие дает случайный результат, в чём вы можете убедиться, посмотрев многочисленные видео по различным взломам игровых систем.
Бросаем монетку
На самом простом уровне теория вероятностей оперирует "шансами" или "вероятными исходами" того, что что-то случится. Это выражается некоторым числом от 0 до 100, если вам так будет удобнее, пусть будут проценты. Если что-то имеет 100% шансов произойти, то это событие обязательно случится, 50% означает что с одинаковой вероятностью произойдет или не произойдет при однократном наблюдении.
Пример с монеткой работает лучше всего. Вы бросаете монетку, наблюдая за тем, какая из сторон выпадет. Что происходит на первом броске? Выпадет орел или решка, условный случай в воздухе зависнет и на ребро встанет, не рассматриваем. Допустим орел не выпал, событие что орел выпал не случилось с вероятностью 50%. Продолжим подбрасывать монетку.
Орел на первом броске и орел на втором броске (ОО)
Орел на первом броске и решка на втором броске (ОР)
Решка на первом броске и орел на втором броске (РО)
Решка на первом броске и решка на втором броске (РР)
В двух бросках будет четыре возможных результата, могут выпасть две решки, два орла или орел и решка, но из-за того что мы воспринимаем ОР и РО как одинаковое, видимость его получения выше. Таким образом, вероятность каждого из этих четырех исходов равна 0,25 или 25%. Если вы сложите вероятности всех четырех исходов, вы получите:
0,25 (ОО) + 0,25 (ОР) + 0,25 (РО) + 0,25 (РР) = 1 или 100%
Если вы продолжите подбрасывать эту же монетку в течении достаточно долго времени, то на каком-то броске выпадет орел. Так говорит теория вероятностей. Если сложить все шансы исходов это эксперимента, результат всегда будет 100%. Аналог монеток с механиками игры прямой и явный, если у вас есть две механики которые, которые влияют на игрока, и эти две механики имеют всего по два состояния, то на выходе у вас будет уже 4 возможных состояния.
Немного посложнее
Например, в нашей гипотетической игре, в ящике могут быть патроны, еда и аптечка. Игрок может получить каждый предмет с одинаковой вероятностью. Какой шанс, что игрок получит патроны? Правильно, ~33% или 1/3 и из первого ящика игрок достает патроны. Какой шанс что из второго ящика игрок получит аптечку? Правильно, 1/3 и из второго ящика игрок достает опять патроны... Стоп-стоп говорит дизайнер, патроны мы ему уже дали, теперь надо дать аптечку или еду. И пишет таску на программиста, что "твой генератор случайных чисел работает неправильно", ведь задан шанс получить аптечку 1/3, а ящики чаще выдают патроны.
Возвращаясь к монетке - если мы продолжим подбрасывать монетку, то будем наблюдать последовательные вероятности. Вероятность того, что события произойдут друг за другом, можно определить, перемножив шансы возникновения этих событий. Например, вероятность выпадения двух орлов подряд составляет 25%. Это 50% для первого броска, умноженное на 50% для второго.
Вероятность выпадения двух орлов подряд = 0,5 х 0,5 = 0,25 или 25%.
Вероятность выпадения трех орлов подряд = 0,5 х 0,5 х 0,5 = 0,125 или 12,5%.
Так и с аптечкой, при открытии некоторого ящика игрок все-же получит её, но не обязательно это будет второй. Понимание последовательных вероятностей является важным аспектом теории вероятностей и помогает оценить шансы на возникновение конкретных событий в будущем на основе вероятностей отдельных составляющих событий. Отвечая на вопрос дизайнера о сломанном ГСЧ для аптечки и патронов, ему было предложено написать нужную ему таблицу вероятностей выпадения определенных предметов, которые потом и положили в правильный генератор выдачи предметов.
Совместные и несовместные события
Это события которые могут или не могут произойти одновременно. Например, вы не можете получить одновременно и орла и решку в при броске монеты. Но можете получить в ящике и патроны и аптечку, если же дизайнер по какой-то причине, решил что в ящике не может одновременно лежать и патроны и еда, то это событие несовместное. Или другой пример, выпадение двух одинаковых карт одновременно (например, два туза пик или два короля червей) в одной раздаче. Применительно к видеоиграм это будет одновременное выполнение двух разных заданий, которые могут быть выполнены только последовательно. Очень часто про это забывают, не ставят проверки, что приводит к зависаниям квестов, логическим ошибкам и т.д.
В маленьком примере с ящиком легко просто подсчитать успехи и неудачи. Но в большом наборе данных, которым является игра и квесты в ней не всегда удается просчитать все возможные результаты, обычно этим занимается Technical System Designer, основной задачей которого и будет настройка и балансировка различных игровых параметров и механик для обеспечения интересного и "честного" игрового опыта.
Зависимые и независимые события
Если вы посмотрите на систему из двух кубиков, бросок каждого кубика не зависит от результата другого, также как и не влияет на него. Также как и шанс выкинуть решку не зависит от результата предыдущих бросков монетки, и фаза луны тоже не влияет, но это не точно. И в целом состояние системы, что кубиков, что монеток не зависит от состояния отдельных её частей. Но есть системы, где состояние системы меняется после эксперимента и влияет на вероятность последующих случайных событий. Всем известной такой системой будет обычная колода карт, извлечение одной карты меняет состояние системы перераспределяя шансы. Например, мы хотим первой картой получить десятку треф, вероятность этого события в случайно собранной колоде будет 1/36, но шанс получить этой же карты на втором эксперименте будет уже 1/35.
Шанс получить десятку треф на втором ходе будет (1/36 + 1/35).
Но допустим, что мы хотим получить десятку любой масти на первых двух ходах, тогда формула примет вид 4/36 + 4/35. Сложение здесь получается из того, что мы хотим получить результат на двух попытках. Если же поставить условие, чтобы получить две любых десятки на первых ходах, то шанс такого события будет 4/36 * 3/35, умножение здесь получается из-за того, что у мы считаем шанс выпадения двух десяток друг за другом.
Мат ожидание
Наш опытный(он точно опытный, хотя бы потому, что ведет такие таблицы) технический дизайнер сделал таблицу вероятностей событий для урона от нового монстра, который считается на основе броска шестигранника. Тогда можно получить среднюю величину этого события при многократных экспериментах, и посчитать её.
n∑i=1 xi⋅pi
1 * 1/ 6 + 2 * 1/6 + … + 6 * 1/6 = 1/6 * ( 1+2+3+4+5+6) = 3,5
Это значит, что за шесть атак нового монстра, сложив все результаты мы получим в сумм 3,5 или близкое к нему значение. Это важное знание, потому что все современные игры строят баланс, основанный на этих расчетах.
Теперь представим, что монстр проходит ревью, и такой подход не нравится отделу тестирования, "слишком слабо бьет товарищ, неинтересно играть" - говорят они. Монстру поднимают атаку от 10 до 20 единиц, но оставляют случайный урон в этом диапазоне, и немного подтюнивают, чтобы каждая единица атаки выпадала только один раз. Математическое ожидание урона в таком случае будет равно: мат.ожидание урона = (10 + ... + 20)/10 = 16. И дизайнеры выстраивают параметры условного щита, хелсы и перков монстра от этого числа.
Другой пример:
Если у вас есть шанс попадания в противника, равный 70%, то математическое ожидание количества попаданий при 10 выстрелах будет:
Математическое ожидание попаданий = 10 х 0,7 = 7
Среднее ожидаемое количество попаданий будет 7 из 10 выстрелов. Опираясь на эти данные, дизайнер строит таблицу броника, жизни и других параметров так, чтобы враги прожили пару минут в бою. Играли в контру и раздаете хедшоты? Отлично, но ваш друг нет, вместе вы стреляете на семерку :)
Псевдослучайные события
В компьютерных шутерах (это верно и для других игр, но сейчас у меня просто больше данных именно для шутеров) псевдослучайное распределение (ПСР) используется для определения вероятности различных игровых механик, начиная от величины урона, критического попадания и заканчивая перками. В отличие от честного рандома, где каждый "выстрел" является полностью независимым, в ПСР вероятность срабатывания увеличивается с каждым неудачным "выстрелом". Это означает, что чем больше вы промахиваетесь (например, перк или критический урон), тем выше вероятность, что следующий "выстрел" приведет к срабатыванию. Таким образом, в ПСР срабатывание игровых перков становится более последовательным и предсказуемым по сравнению с рандомом. Обычно вероятность срабатывания определенного эффекта после N-ого выстрела определяется по формуле P(N)=CхN. Для каждого отдельного выстрела, который может вызвать перк, псевдослучайное распределение увеличивает вероятность его срабатывания на константу С, если предыдущие выстрелы этот перк не активировали. Как только перк активируется, счетчик сбрасывается.
Эффекты, основанные на псевдослучайном распределении, не будут срабатывать слишком редко или часто. Это придает игре большую предсказуемость по сравнению с полностью случайным распределением. Однако, в самой игре предсказать срабатывание эффекта на основе псевдослучайного распределения все также будет сложно, и оно будет определяться игроком как "истинно случайное" или "честный рандом". Теоретически, можно увеличить шанс, например, критического попадания, стреляя во врагов без активации псевдослучайного распределения, но на практике это трудно выполнимо. Если вы стреляете в цели, где данный эффект не может сработать (например, в здания или защищенные объекты), вероятность его срабатывания не увеличивается. Так, игрок с оружием, имеющим критический эффект, стреляя по зданиям, не увеличит вероятность критического попадания следующим выстрелом, так как этот эффект не применяется к этим объектам.
Мифы о подкрутке шансов в играх
Казино в расчет не берем, там все давно посчитано и случайностям места не осталось. Но дизайнерам игр хорошо известно заблуждение людей относительно случайных событий, игроки считают что вероятность некоторого события растет со временем. Например при броске кубика вы ждете, что выпадет шестерка, кидаете раз за разом, если вы не будете отмечать количество бросков, ваш мозг успешно "отсеет" пару-тройку неудачных бросков, потом выпадает долгожданная шестерка и мы принимаем это за "рост вероятности". Если события статистически независимы, например, броски кубика, то наши ожидание никак не влияют на исход броска, и никакого роста вероятности нет.
Просто это наш мозг так играет с нами, чтобы не сильно расстраиваться. Разработчики игр, зная такую особенность человеческого восприятия случайных событий, тоже могут подкручивать шанс выпадения 6 с количеством бросков, чтобы не расстраивать игроков. Потому что честный рандом, нечестный по мнению большинства игроков. Но есть еще одна особенность, этот эффект практически незаметен на коротких игровых сессиях (от 1 минуты до 3), и чем короче сессия, тем более лояльно игроки относятся к истинно случайным событиям.
Если вы слышите от знакомого, что ему нужен честный рандом в игре, скорее всего игра ему просто не нравится. Люди хотят получать от игры удовольствие, в этом случае честность, если мы говорим про рандом, заботит их в последнюю очередь. Когда вы спросите своего знакомого, почему ему нужен "честный рандом" ты услышите, что условный меч, патроны и аптечка, так нужные для прохождения, он получает за 15 и даже больше попыток, или получает ненужные предметы каждые 5-6 сундуков. Можно возразить, что «честный рандом» всех уравняет рано или поздно, но вот будет ли это в вашей игре - большой вопрос. И все эти разговоры про "честный нечестный рандом" — сводятся к одному решению - «выдай нужный предмет с десятой попытки» для каждого конкретного игрока. Настроенная таким образом удача, будет совпадать с ожиданиями и бытовыми представлениями игроков, делая их счастливыми.
Игры - сложные недетерминированные системы
Большинство игр слишком сложные, чтобы составить полные таблицы вероятностей хоть для какой-то их части, я уже не говорю о том, чтобы написать вменяемый анализ по этим таблицам. Для примера: таблица стратегии игры в подкидного имеет 20 точек принятия решений и расширяется в 3 раза для каждого игрока. Таблица принятия решений для простого текстового квеста из трех частей и одной концовки, составляет больше 30 пунктов. Играл оооочень давно, что-то мог и подзабыть.
Амнезия (КР 1):
Вам нужно справиться с потерей памяти и другими проблемами, которые повисли на вас...
Решение единственно, три части космопорт, бар, бункер.Идти в космопорт, обыскать собственный корабль (найдется станнер), идти к продуктовому магазину, купить бутылку водки, пойти в охотничий магазин, купить все, что можно.
Теперь — к дому санитара, зайти к санитару, прислушаться к голосам из разных квартир, оглушить станнером, потребовать оружие, спросить, кто ограбил квартиру, прикончить пеленга, дать пеленгу-полицейскому бутылку водки.
Далее — в бар «Золотая лилия», поговорить с гаальцем, идти в охотничий магазин, сказать продавцу пароль, пойти в бар, подойти к пеленгу, пропустить вперед гаальца, осторожно обойти дом сзади, приказать гаальцу атаковать левого противника, а самому стрелять в правого, идти в дом, спуститься в бункер, вместе с гаальцем расстрелять пеленгов.
Вычислить код замка по формуле: Х=(10*(2^n))-10 n — число дней, открыть дверь и выйти из комнаты, зайти в ближнюю дверь, парализовать малока из станнера, спуститься на этаж ниже, бросить оружие и сдаться.
Но даже если о полном анализе квестов и событий в игре не может быть и речи, то мы все равно можем использовать элементы теории вероятностей для настройки различных механик, какие события вероятны, маловероятны и невозможны.
Также зная склонность игроков переоценивать свои навыки в играх, можно "подкручивать" вероятность случайных событий в зависимости от стиля игры. Бытовое понимание сути вероятности событий игроками позволяет разработчикам по разному подходить к системе случайных событий в играх.
Выводы
На первый план выходит умение дизайнера объяснить случайность игровыми событиями и правилами, чтобы опыт соответствовал ожиданиям. Если испытание/квест/бой кажется слишком легким, или слишком сложным, игра будет разочаровывать. Верно и обратное: выстрелы на снайперской дистанции, которые всегда получаются, разочаровывают также, как и постоянные промахи.
Если в игре случайные события скрыты, честно рандомны или плохо объяснены, то удовольствия от игры не будет. Я не беру сейчас отдельную категорию игроков, которым это нравится. Слишком много случайных событий вызывают непонимание, слишком много понимания, становится предсказуемо и скучно.
Удовольствие получается от сбалансированного количества сюрпризов и понятных моментов. Все это означает, что случайностью в играх надо управлять, показывая игрокам не просто случайные события, но понятные и объяснимые решения. Но это тема для другой статьи.