Основы игрового баланса: вероятность и случайность в полнейшем беспорядке

Геймдизайнер Nival Анатолий Шестов опубликовал в своем блоге перевод очередной лекции курса «Принципы игрового баланса» игрового дизайнера Яна Шрайбера, который работал над такими проектами, как Marvel Trading Card Game и Playboy: the Mansion.

Редакция vc.ru публикует перевод с разрешения Шестова.

Основы игрового баланса: вероятность и случайность в полнейшем беспорядке

Ответы на вопросы прошлой недели

Если вы хотели сверить ответы на задачи прошлой недели:

Драконьи кости

Во-первых, обратите внимание, что так называемая драконья кость — всего лишь замаскированная 1d6+1. Если вы представите, что Дракон — это 7, раз он всегда побеждает, то грани, соответственно, будут выглядеть как 2-3-4-5-6-7, так что, по сути, вопрос сводится к тому, насколько бонус +1 может повлиять на ваш шанс выбросить больше на кости 1d6. Как оказалось, гораздо сильнее, чем кажется большинству людей.

Если вы выпишете все 36 вероятностей выпадения для 2-7 и 1-6, вы обнаружите, что можете проиграть казино 21 способом (7-1, 7-2, 7-3, 7-4, 7-5, 7-6, 6-1, 6-2, 6-3, 6-4, 6-5, 5-1, 5-2, 5-3, 5-4, 4-1, 4-2, 4-3, 3-1, 3-2, 2-1), сыграть вничью 5 способами (6-6, 5-5, 4-4, 3-3, 2-2) и победить 10 способами (5-6, 4-5, 4-6, 3-4, 3-5, 3-6, 2-3, 2-4, 2-5, 2-6). Мы не обращаем внимания на ничью, раз она означает переброс, пока кто-нибудь не одержит верх, так что лишь 31 случай завершается победой или поражением. Из них 21 раз вы проигрываете и 10 раз побеждаете, так что эта игра даёт 10 из 31 шансов на победу. Другими словами, вы выигрываете чуть реже, чем 1 раз из 3.

Чак-э-лак

Раз на трёх костях d6 результат может выпасть 216 разными способами, проще будет всё проверить в Excel, а не от руки. Если вы всё рассчитали, то обнаружили вот что: если поставить на 1, существует 75 вариантов, при которых выпадает одна победная кость (1-Х-Х, где Х — любой из оставшихся проигрышных результатов, и таких вариантов может выпасть 25, и ещё Х-1-Х и Х-Х-1 с победой на двух других костях — вместе 75). Аналогично существует 15 вариантов выбросить две победные кости (1-1-Х, 1-Х-1, Х-1-1, по пять вариантов каждая из трёх = 15), и лишь один вариант тройной победы (1-1-1). Так как все цифры от 1 до 6 имеют равный шанс выпадения, ваши шансы на победу всегда будут такими же, независимо от того, на какую цифру вы поставили.

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

(75 выигрышных вариантов * $1 выигрыша) + (15 двойных выигрышей * $2) + (1 тройной выигрыш * $3) = $108 выигрыша. Раз мы сыграли 216 раз, а 108 — это как раз половина, то шансы, на первый взгляд, равные, то есть 50 на 50.

Но не торопитесь. Нам всё ещё остаётся подсчитать убытки в случае проигрыша, а проигрываем мы чаще, чем 108 раз. Из 216 вариантов, которые могут выпасть на костях, выигрышными являются только 91, а 125 раз мы проигрываем (разница возникает вот почему: хотя двойной и тройной выигрыш гораздо ценнее, когда он выпадает на вашу цифру, вариантов выбросить двойную и тройную цифру, на которую вы не поставили, гораздо больше). И каждый из этих 125 проигрышей стоит вам $1.

Сложив всё это, вы получаете $17 предполагаемого проигрыша на 216 бросков. Или предположительный убыток в 7,9 цента каждый раз, когда вы делаете ставку в $1. Пусть это и немного (7,9 — в буквальном смысле гроши), не забывайте, что это за каждый доллар. Так что у казино 7,9 % гарантированной прибыли с этой игры — один из худших раскладов для игрока из всех игр, которые предлагает казино.

Роял-флэш

В этой игре вы тянете 5 карт из 52-карточной колоды, одну за другой. Эти карты должны быть обязательно 10-В-Д-К-Т, но в любой последовательности. Первая карта может быть любой из этих пяти, любой масти, так что, когда вы тянете первый раз, есть 20 карт, благодаря которым вы можете в итоге собрать роял-флэш (20 из 52). Второй карте уже необходимо совпасть с первой по масти, так что среди оставшейся в колоде 51 карты вам подходят уже только 4 (4 из 51). Для третьего захода остаются лишь 3 подходящие для роял-флэша карты из 50 оставшихся в колоде (3 из 50). На четвёртый раз остаётся 2 карты из 49, а последняя карта должна выпасть в 1 из 48 случаев.

Перемножив всё это, мы получаем 480 из 311875200 или 1 из 649740. Если вам нужна десятичная дробь, то это 0,0000010 (или, если умножить на 100, чтобы получить проценты, 0,00015% — чуть больше одной десятитысячной процента). Для большинства из нас это значит, что шанс увидеть «неподдельный» роял-флэш из пяти карт есть один на всю жизнь — если вообще увидеть.

Лотерея IMF

Ответ — 45 единиц ресурса, то есть карта будет оставаться в игре в среднем 10 кругов. Так как у неё 10% шанс покинуть игру на каждом ходу, кажется, что ответ находится интуитивно — но, как мы видим из вероятностей, в большинстве случаев интуиция нас подводит. Поэтому факт, что эта игра решается интуитивно, сам по себе противоречит интуиции.

Тема этой недели

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

Человеческая психология

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

Поэтому мы как геймдизайнеры должны не только вникать в истинные вероятности, но и предполагать, как игроки будут воспринимать эти вероятности в наших играх и насколько это восприятие будет отличаться от истины — чтобы мы могли это учитывать при конструировании нужного нам игрового опыта.

Компьютеры

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

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

Везение против мастерства

Прежде чем углубляться в психологию и информатику, нужно сказать, что существует некое подразумеваемое допущение. В прошлый раз мы его по большей части игнорировали, но оно заслуживает того, чтобы его обсудили и подвергли сомнению. Это допущение о том, что, добавив немного случайности, мы сделаем игру лучше, но слишком много случайности — это всегда плохо. И, возможно, у нас есть представление, что все игры располагаются на отрезке между двух крайностей: «100% мастерства» (к примеру, шахматы и го) и «100% везения» (Chutes & Ladders или Candyland).

Если мы будем рассматривать только эти игры, мы можем даже задуматься о поисках «водораздела» между казуальными играми и хардкором: чем больше в игре везения, тем более казуальна аудитория; чем больше исход игры зависит от мастерства, тем скорее мы назовём игру хардкорной.

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

Есть ещё и физический контекст, как в профессиональном спорте. С одной стороны, мы рассматриваем эти игры как состязание в мастерстве. И всё же фанаты отслеживают самую разнообразную статистику игр и игроков, мы говорим о шансах игрока забить гол или пропустить бросок, а спортивные болельщики делают денежные ставки на исходы игр, будто это не состязание в мастерстве, а игра случая. Так в чём же дело? Есть несколько объяснений.

Покер и блэкджек

Откуда эта разница в восприятии покера и блэкджека? Разница заключается в том, когда игрок делает ставку и какое влияние оказывает выбор игрока на исход игры.

В покере успешный игрок просчитывает свои шансы, вычисляя вероятность того, что на руках у него выигрышная комбинация. Он учитывает это при совершении ставки, равно как и наблюдает реакцию своих оппонентов. По мере открытия карт игрок подстраивает свою стратегию под ситуацию. Понимание игроком своих шансов и умение реагировать на изменения имеет прямое отношение к его успеху в игре.

В блэкджеке вы, напротив, делаете ставку в самом начале раздачи — прежде, чем узнаете, что за карты вам достались, — и, как правило, у вас нет возможности поднимать ставку или пасовать по мере раскрытия карт. Здесь всё же требуется некоторый навык, но он сильно отличается от мастерства игры в покер. Понимание, когда попросить ещё карту или остановиться, когда «разбиться» на две руки, когда удвоить ставку (это понимание основывается на сумме ваших карт, на картах дилера, на проценте оставшихся в колоде «высоких» карт), — всё это мастерство, в том же смысле, что и в игре Pacman.

Вы запоминаете детерминированную последовательность и следуете ей, но вы не делаете никаких особенно занимательных решений. Вы просто делаете ставку, следуя алгоритму, и ожидаете, что со временем вам повезёт, — насколько это возможно, учитывая перетасовку колоды. По этой же самой причине мы не думаем, что казино «умеет» играть в крэпс или рулетку только потому, что оно выигрывает чаще, чем проигрывает.

Профессиональный спорт

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

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

Игры в жанре экшн

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

В системе и так достаточно хаоса, безо всяких игральных костей: я стреляю по движущейся цели, я могу попасть или промахнуться в зависимости от целого ряда факторов, за которыми очень трудно уследить. А теперь давайте представим, что дизайнер решил схитрить и добавил к пуле, выпущенной из дешёвого пистолета, небольшое смещение, чтобы сделать его не таким точным. Вы наводите прицел на кого-то, спускаете курок — и промахиваетесь, просто потому, что пуля случайным образом решила забрать правее или левее. Как бы игроку такое понравилось?

Допустим, игрок мог и не заметить, ведь игра динамична: вы бежите, цель бежит, вы палите несколько раз, промахиваетесь, думаете, что прицелились не так хорошо, как вам казалось, или цель хорошо увернулась. Если вы стоите спокойно, подкрадываетесь к жертве со спины и точно знаете, что прицелились безупречно, но всё равно не попадаете — вы чувствуете, что игра вас обманула. Это вам вряд ли понравится и точно не сделает игру интереснее — вы просто решите, что вас наказывают за меткую стрельбу.

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

Тут вы можете подумать: погодите, это разве не мастерство? Вас же вознаграждают за меткость, за то, что вы попали по маленькой цели, вы получаете бонус к урону за то, что хорошо стреляете, разве нет? В некоторых играх всё так и есть, но во множестве других (особенно тех, что постарше) такая точность в большинстве ситуаций просто невозможна: вы движетесь, цель движется, в голове есть малюсенькая зона поражения, ружье не даёт вам достаточного приближения, чтобы понять, что вы не промажете на пару пикселей. Потому попадание в голову, по крайней мере с расстояния, — это не то, что большинство игроков могут запланировать.

Иногда это происходит случайно, почти без участия со стороны игрока — просто потому, что вы стреляли в нужную сторону. Бонус при выстреле в голову немного выравнивает шансы в игре: без него, если на уничтожение врага требуется много выстрелов, опытные игроки всегда будут выигрывать. Они лучше уклоняются, кружат вокруг жертвы и используют другие приёмы, которые позволяют им обойти более слабого игрока. Если же в игре есть механика попадания в голову, слабый игрок иногда будет случайно убивать врагов на месте, что повышает вероятность какого-никакого успеха даже у новичка — а вы как геймдизайнер обычно к этому и стремитесь.

Подстройка везения и мастерства

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

С менее динамичными и более стратегическими играми добавить везение (или навык) можно более прямо и непосредственно. Вот что можно сделать, чтобы увеличить значимость везения в игре:

  • Замените некоторые из решений игрока случайными событиями.
  • Сократите число случайных событий в игре (таким образом вы ослабите действие закона больших чисел, и случайности не будут распределять всё равномерно).
  • Увеличьте диапазон случайных событий, например, замените один бросок шестигранной кости на один бросок двадцатигранной.

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

Каково же лучшее сочетание везения и мастерства в отдельно взятой игре? Это зависит по большей части от целевой аудитории. Маленькие дети могут не справиться с большим количеством ситуаций выбора между риском и вознаграждением или краткосрочным и долгосрочным компромиссом, но они могут бросать кубик, вращать вертушку и двигать пешку в нужном направлении.

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

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

Нет единственно правильного ответа, который подходит всем играм. Просто поймите, что некое сочетание везения и мастерства подходит именно вашей конкретной игре и вы как геймдизайнер должны прислушиваться к своей игре и распределять их там, где они требуются. Иногда это значит, что надо добавить случайности, иногда — что её надо убрать, а иногда — что надо оставить случайность, но поменять её сущность. Инструменты, которые мы освоили на прошлой неделе, должны были дать вам достаточно умений, чтобы выявить природу случайности в своей игре, хотя бы в какой-то её части, и внести необходимые изменения.

Человеческая психология

Как мы убедились на прошлой неделе, когда дело касается расчёта шансов, интуиция обычно подводит. Вы могли это заметить по «Драконьим костям» и «Чак-э-лаку»: на интуитивном уровне кажется, что игры дают больше шансов на победу, чем на самом деле.

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

Погрешность выборки

Когда нас просят интуитивно оценить шансы, как мы принимаем решение? Большинство людей первым делом попытаются вспомнить подобные события. Чем проще найти примеры, как происходило конкретное событие, тем вероятнее мы его сочтём. Обычно это даёт неплохие результаты: если вы несколько сотен раз бросите кость со смещённым центром тяжести и припомните, что число 4 выпадало чаще остальных, — у вас наверняка будет довольно точное представление о том, какова вероятность выпадения четвёрки. Как вы можете догадаться, такая интуиция подводит в случаях, когда редкое событие вспомнить легче, чем обычное.

Почему бывает проще вспомнить редкое событие, а не часто повторяющееся? Во-первых, достаточно сильные редкие события обычно производят больше впечатления (уверен, вы можете точно сказать, где находились 11 сентября 2001 года, когда в Нью-Йорке самолёты врезались в небоскрёбы).

Иногда виной тому, что мы чаще видим редкие события, чем обычные, оказываются СМИ. Например, многие больше боятся погибнуть в крушении самолёта, чем в автомобильной аварии, хотя автокатастрофа гораздо более вероятна. Одна из причин — в том, что каждый раз, когда где-то падает самолёт, об этом говорят в новостях по всему миру, автомобильные аварии же так обычны, что о них никто не сообщает. Другой пример — лотерея. Победители лотерей всегда на виду, а миллионы проигравших остаются в тени, поэтому нам кажется, что шанс выиграть в лотерею гораздо выше, чем он есть на самом деле.

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

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

Погрешность эгоизма

Есть определённые обстоятельства, когда событие маловероятно, но всё же возможно, — тогда игрок полагает, что оно гораздо более вероятно, чем на самом деле. Игровой разработчик Сид Мейер на конференции по геймдизайну по опыту определил, что эта точка находится где-то между 3:1 и 4:1. Если игрок знает, что вероятность возможного выигрыша составляет 75–80% и его соотношение побед и поражений будет именно таким — ему будет казаться, что он проигрывает чаще, чем надо. Тестировщики рассчитывали побеждать практически всегда, я бы сказал, в 95% случаев, если экран предсказывал им 75–80% вероятность.

В рассуждениях игроков очень часто встречается эта эгоистическая погрешность, которая, вероятно, связана с тем, о чем я говорил выше, — со склонностью игроков думать, что они лучше других. Игрокам кажется неправильным, когда они четверть времени проигрывают при предсказанном 75% преимуществе, но в то же время они совершенно нормально воспринимают ситуацию, когда четверть времени выигрывают при предсказанной вероятности проигрыша 3:1.

Погрешность отнесения

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

Когда дело касается случайно полученной награды, игроки склонны относить её на счёт своих заслуг. Им кажется, что награда — это плод их удачных решений и выбранной стратегии игры. Может быть, это был просто удачный бросок костей, но ведь кто-то же решил сделать тот или иной выбор, который привёл к этому броску, и рассчитанный риск окупился, так что совершенно ясно: это было правильным решением.

Что же до случайного наказания, игрокам всегда кажется, что причина внешняя: они винят кости, винят карты, говорят, что им просто не повезло. Если такое происходит слишком часто, игроки могут даже дойти до заявлений, что им не нравится игра, потому что она нечестная. Если они достаточно сильно вовлечены в процесс на эмоциональном уровне — например, делают высокие ставки в азартной игре — они могут даже обвинить других игроков в шулерстве.

В видеоиграх логика генерации случайных чисел скрыта, поэтому мы можем наблюдать ещё более странную реакцию игроков. Некоторые на самом деле верят, что искусственный интеллект подглядывает в игровые данные, тайком от них меняет цифры и специально жульничает, ведь это же компьютер: теоретически он может всё это делать. Люди вообще относятся к поражениям совсем иначе, чем к победам, — как в игре, так и в жизни.

Фиксация

Ещё один феномен, связанный с искажённым восприятием шансов, называется фиксацией. Какое бы число человек ни увидел первым, он на нём зацикливается и переоценивает его значение. К примеру, когда вы заходите в казино и смотрите на первый попавшийся игровой автомат, то наверняка прежде всего вам бросится в глаза число монет, которое вы можете выиграть, если сорвёте джек-пот. Оттого что люди смотрят на него и концентрируются на нём, шансы на победу кажутся им выше, чем есть на самом деле.

Сид Мейер в своём докладе упомянул забавный аспект этого феномена. Те самые тестировщики, которые были довольны, когда проигрывали в одном случае из трёх при предсказанном преимуществе 2:1 — как им и было положено, — считали, что игра несправедлива, когда им предсказывали преимущество 20:10. Почему? Первым числом, которое они видели, было 20, довольно большое, поэтому им казалось, что у них больше преимуществ, и потом, оно кажется значительно больше 10, поэтому им казалось, что превосходство подавляющее. Само собой, если им показать вероятность 10:20 что они проиграют, то они будут довольны одним выигрышем из трёх.

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

Ложный вывод Монте-Карло

Вот мы и вернулись к ложному выводу Монте-Карло, состоящему в том, что люди ожидают от случайных чисел, чтобы они непременно выглядели случайными. Череда одинаковых результатов заставляет игроков переживать и сомневаться: действительно ли номера случайны?

В одной книге мне попалась любопытная статистика: если человека попросить представить себе в уме череду «случайных» результатов орлянки, они окажутся не такими уж и случайными. А именно, если человек перед этим представил себе решку, то с 60% вероятностью он выберет орла для следующего броска. И наоборот (это если вы просто попросите испытуемого говорить «орёл» или «решка» наобум каждый раз, когда просите его выдать вам «случайный» результат, а не когда он подбрасывает настоящую монетку).

Если вы подбросите монетку всего 10 раз — довольно высока вероятность того, что орёл или решка выпадут вам 4 раза подряд (так как вероятность четырёх совпадений подряд — 1 из 8). Но если вы попросите кого-то «случайным» образом выдать вам 0 или 1, вам вряд ли назовут хотя бы три одинаковых результата подряд.

Это заблуждение может обмануть игроков и более неявным образом. Вот пример всё из того же доклада Мейера. Как вы помните, игрокам кажется, что при преимуществе 3:1 они должны почти всегда выигрывать, но при этом считают, что всё в порядке, когда проигрывают в трети случаев при раскладе 2:1. Оказывается, если при прогнозе 2:1 они проиграют дважды подряд, многим покажется, что что-то не так. Люди просто не ожидают, что маловероятные события могут происходить несколько раз подряд, даже если это происходит согласно всем законами вероятности.

Вот ещё один пример, объясняющий, почему мы как геймдизайнеры непременно должны за этим следить. Например, вы разрабатываете видеоигру, которая в качестве одной из базовых механик требует честно подбрасывать монетку — чтобы определить, кто ходит первым на каждом кругу, или ещё что-то в этом роде. Вероятность говорит нам, что в 1 случае из каждых 32 розыгрышей первые шесть бросков дадут совершенно одинаковый результат.

Если игрок увидит это во время своего знакомства с игрой, результат покажется ему настолько невероятным, что он будет уверен: генератор случайных чисел в игре кто-то взломал. Если монетки будут падать так, как выгодно игроку, жаловаться он не станет. Но когда вдруг начнётся полоса невезения, и половину времени, как и положено, он будет проигрывать, то ему начнёт казаться, что игра его обманывает. Пройдёт время, прежде чем развеется ложное представление игрока, что он должен почти всегда выигрывать.

Хуже, когда игрок видит шесть проигрышей подряд с самого начала. Бьюсь об заклад, игрок будет уверен, что игра к нему несправедлива. Чтобы увидеть масштабы проблемы, которую это может породить, представьте себе: ваша игра — скромный хит с продажами 3,2 миллиона копий. В этом случае 100 тысяч игроков увидят последовательность из шести одинаковых результатов во время первой же игры. Целые толпы игроков будут считать, что ваша игра нечестная.

Игроки могут также использовать ложный вывод Монте-Карло себе на пользу. Люди полагают, что долгие последовательности одинаковых результатов не могут быть случайными, поэтому, стараясь играть наобум, они будут чаще менять значения, чем оставлять одни и те же.

Если вы играете против «непрофессионала» в «Камень-ножницы-бумагу», с этой хитростью вы можете выигрывать чаще, чем в половине случаев. Скажите, что играете до трёх побед из пяти или до четырёх из семи. Ваш оппонент вряд ли повторит свой последний бросок, поэтому в следующем раунде просто выбрасывайте тот вариант, который проиграл бы вашему оппоненту на прошлом ходе. Он вряд ли повторит свой бросок дважды, следовательно, вы не проиграете — в худшем случае получите ничью.

Ложный вывод «горячей руки»

Это вариант ложного вывода Монте-Карло, который относится в первую очередь к спорту. Вот почему он так назван: среди баскетбольных болельщиков распространилось поверье, что, если игрок забрасывает мяч в корзину два или три раза подряд, он «разогревается» и наверняка забросит и следующий мяч. Это даже отражено в спортивных играх вроде NBA Jam: там существует механика вхождения в раж (когда игрок «жжёт»), которая даёт игроку преимущества в скорости и меткости, а также имеет зрелищные эффекты, например превращение мяча в огненный шар.

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

Погодите-ка, скажут баскетбольные болельщики. Кто сказал, что это абсолютно независимые события? Психология играет роль в спортивных показателях. Может быть, после нескольких удачных бросков у игрока появляется больше уверенности в себе, и он играет действительно лучше? Может быть, дополнительный стимул спортсмену даёт восторженная поддержка болельщиков? Может быть, предыдущие удачные броски — признак того, что игрок направил на игру все свои силы и вошёл в состояние потока, а значит, велика вероятность, что он продолжит в том же духе, как знать?

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

Почему так происходит? Не думаю, что мы можем сказать с полной уверенностью, но, предположительно, здесь имеет место некий отрицательный психологический эффект. Может быть, игрок устаёт. Может быть, команда соперников начинает видеть в нём угрозу и защищается агрессивнее, если мячом завладевает именно этот игрок. Может быть, ликование толпы отвлекает игрока от состояния потока, а может быть, игрок становится слишком самоуверен и начинает неоправданно рисковать.

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

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

Хьюстон, у нас проблемы

Итак, вот итоговый список проблем, с которыми мы как геймдизайнеры имеем дело, когда игрок сталкивается с нашими вероятностными системами:

  • Погрешность выборки: маловероятные, но запоминающиеся события воспринимаются как более вероятные, чем есть на самом деле.
  • Погрешность эгоизма: «маловероятное» поражение воспринимается как «почти невозможное», когда шансы в пользу игрока. Между тем, когда шансы не в пользу игрока, то «маловероятная» победа воспринимается корректно — как «маловероятная, но всё же возможная» победа.
  • Погрешность отнесения: случайный положительный результат относится на счёт мастерства игрока, тогда как случайный отрицательный результат — на счёт невезения (или, что ещё хуже, нечестной игры).
  • Фиксация: игроки переоценивают значение первого (или бо́льшего) числа из тех, что видят.
  • Ложный вывод Монте-Карло — предположение, что череда одинаковых результатов сокращает вероятность продолжения этой последовательности.
  • Ложный вывод «горячей руки» — предположение, что череда одинаковых результатов увеличивает вероятность продолжения этой последовательности.

Из всего этого можно извлечь следующий урок: если вы показываете своим игрокам их настоящие шансы, а игра честно генерирует случайные числа — игроки будут жаловаться, потому что из-за их искажённого восприятия вероятности им кажется, что в игре «что-то не так». Что мы как дизайнеры можем с этим сделать? Можно жаловаться друг другу на глупых игроков, которые ничего не понимают в математике. Но можем ли мы каким-то образом обратить это знание себе на пользу, чтобы сделать наши игры лучше?

Когда дизайнеры становятся коварны

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

Азартные игры

Лотереи и казино регулярно пользуются погрешностью выборки, широко рекламируя своих победителей, чтобы заставить людей поверить, будто выиграть проще, чем кажется. Ещё они могут поступить и вовсе нечестно — подкрутить свои автоматы, чтобы они выдавали «почти такой, как надо» результат чаще, чем это предсказывает теория вероятностей: например, два совпадения и несовпадающее окошко в слот-машине или четыре из пяти карт роял-флэша в видеопокере.

Это даёт игрокам ложное чувство, что они близки к победе, чаще, чем на самом деле, подхлёстывает их азарт и предвкушение джекпота и заставляет снова и снова продолжать игру.

Маркетинг и реклама

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

Другой пример использования фиксации — автосалоны, которые ставят рядом две почти идентичные модели, на одной указана очень большая цена, на другой — поменьше, но всё равно большая. Покупатели видят первую цену, фиксируются на ней, затем видят меньшую, и им кажется, что они сейчас сделают выгодную покупку, — даже если их обдирают как липку.

Политика

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

Аферисты

Самые коварные геймдизайнеры используют своё знание психологии, чтобы творить дела поистине великие и беззаконные. Одна афера, о которой я слышал, работает так: вы пишете большому количеству людей, предлагая им «консультации по инвестированию» и просите их проследить за курсом каких-нибудь дешёвых акций сегодня и завтра.

В половине писем вы говорите, что акции вырастут, в другой половине — что они упадут в цене. Затем, в зависимости от того, что происходит, вы берёте ту половину, которым сделали правильное «предсказание», и делаете следующий прогноз. После четырех-пяти повторений у вас останется горстка людей, которым вы всякий раз давали верные прогнозы. Им кажется, что таких совпадений не бывает и у вас, наверное, есть какая-то система — они дают вам кучу денег, а вы уезжаете на Фиджи или ещё куда-нибудь.

Как насчёт хороших геймдизайнеров

Всё это было полезно и информативно для тех, кто хочет стать аферистом (или не хочет попасться на такую удочку). Но что же делать тем, кто всё-таки хочет делать игры и приносить людям радость?

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

Подгонка шансов

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

Случайные события

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

Нейтрализация «горячей руки»

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

Если мы всё-таки включаем в игру механизм «череды удач», мы можем сделать его частью петли обратной связи, дав игроку преимущество, чтобы оно противодействовало растущим шансам проиграть после череды побед. Например, в Modern Warfare 2 игроки получают определённые бонусы, если убивают несколько врагов подряд, не будучи при этом убиты сами. Бонусами могут быть лучшее оружие, поддержка с воздуха или даже ядерный удар. С каждым таким бонусом повышается вероятность того, что полоса удач продолжится, ведь игрок становится сильнее.

Итоги

Если вкратце: мы знаем, что у игроков искажённое понимание вероятностей. Понимая сущность этого искажения, мы можем изменить поведение своей игры, чтобы оно соответствовало ожиданиям игроков. Это самое важное из того, что можно было вынести из доклада Сида Мейера на конференции по геймдизайну, о которой я уже упоминал.

Вопрос профессиональной этики

Многим это может показаться неправильным. После конференции по крайней мере несколько человек сказали: погодите, разве это честно? Мы, геймдизайнеры, через разработанные нами же системы игр учим своих игроков. Если мы будем подгонять законы вероятности, чтобы они потакали искажённым представлениям игроков, не оказываем ли мы им медвежью услугу? Не учим ли мы игроков тому, что заведомо неправильное правильно?

Можно на это возразить. Если игроку не интересно (неважно, что причиной тому наш плохой дизайн или его плохое знание математики), то дизайнер должен действовать ему в угоду — особенно если он подотчётен разработчику или издателю, который ожидает больших продаж. Но существенный ли это аргумент? Вот, к примеру, покер — невероятно популярная и выгодная игра, хотя она беспощадно наказывает игрока за малейшие отклонения от ясного представления о вероятностях.

Для меня этот вопрос остаётся открытым. Каждый дизайнер должен решить его для себя сам, основываясь на личных ценностях и особенностях создаваемой игры. Подумайте сами вот над чем:
  • Входит ли вопрос вероятности в игре в круг вопросов профессиональной этики?
  • Как сбалансировать необходимость доставить игроку удовольствие от игры (особенно если он за нее платит) и необходимость дать ему правильное представление о реальном положении вещей?
  • Что важнее: как игра работает на самом деле или как игроки воспринимают её работу?

Ещё одно решение

Могу предложить ещё одно решение, которое работает для некоторых особенных ситуаций: показывать игроку не только вероятность выигрыша, но и статистику реальных результатов. Например, попросите игрока дать свой приблизительный процент выигрышей — если он не отслеживается игрой, он наверняка даст завышенный результат. Если же каждый раз при включении игры он будет видеть свои победы, поражения и вообще всю статистику — у него будет гораздо более точное представление о действительном уровне своего мастерства.

Что если у вас в игре генератор случайных чисел? Посмотрим, знакома ли вам такая ситуация: вы играете в «Тетрис» и в какой-то момент понимаете, что игра решила вас добить во что бы то ни стало. Вам никак не попадается «палочка», а когда она наконец появляется — она уже не нужна.

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

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

Если вы работаете над видеоверсией настольной игры «Риск», в которой симулируются броски костей — ведите статистику выпавших комбинаций, и пусть игрок имеет к ней доступ в любое время. Такие вещи убеждают и успокаивают игрока, который никогда не знает наверняка, насколько честны случайные числа внутри компьютера.

Когда случайность неслучайна

Мы приходим к разнице между числами случайными и псевдослучайными. Псевдослучайное число — это то, что только выглядит как случайное.

Даже в физическом мире те вещи, которые вы привыкли считать случайными, на самом деле не совсем случайны. У шариков с номерами, выпрыгивающих из автомата в лото, неодинаковые шансы попасть наружу: разное количество краски для разных цифр придаёт им несколько различный вес. У шестигранной кости с утопленными точками может быть незначительный перевес на одну сторону, ведь с разных сторон отсутствует разное количество материи, следовательно, центр тяжести несколько смещён.

Кроме того, у многих шестигранных костей округлённые рёбра. Если они чуть-чуть отличаются, то есть небольшая вероятность, что кость, упав на определённую грань, продолжит катиться — то есть у разных цифр разные шансы на выпадение. Двадцатигранные кости, в зависимости от того, как их изготовили, могут быть продолговатыми вместо того, чтобы стремиться к идеальной окружности, — у номеров, расположенных «по краям», вероятность выпасть чуть меньше. И всё это не учитывая случаев, когда в костях специально подстроенный перевес или человек, который бросает их, практиковался, чтобы получать нужные ему результаты.

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

Даже если тасовать совершенно честно, результат не всегда случаен. Подумайте: в зависимости от того, как вы тасуете, верхняя или нижняя карта может оставаться на своём месте после одного переброса, так что вам приходится тасовать ещё несколько раз, прежде чем порядок карт в колоде станет достаточно случайным. Даже без преднамеренного расположения карт нужным образом не все расклады одинаково вероятны.

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

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

Казино в основном перешли к автоматизированному тасованию, чтобы исключить все эти проблемы, но и у этого подхода есть недостатки: автомат может тасовать не так случайно, как человек, ведь он предсказуем. Внимательный игрок может использовать скрытую камеру, чтобы проанализировать машину и выяснить, какие карты вероятнее всего будут в колоде рядом друг с другом. Нынешние автоматы не перетасовывают карты физически — они складывают их, следуя случайному компьютерному алгоритму, но, как мы скоро убедимся, даже с этими алгоритмами могут возникнуть трудности, которые будут стоить недостаточно осторожным казино больших денег.

Всё это говорит об одном: даже в мире «физических» игр события, которые мы воспринимаем как случайные, не всегда так случайны, как кажется. Это вовсе не означает, что мы можем как-то повлиять на создавшийся порядок вещей, — если не считать огромных затрат на сверхкачественные компоненты. Платить втридорога за идеальную, проверенную электроникой игральную кость — это слишком для тех, кто просто хочет иногда поиграть в Settlers of Catan. Мы должны просто смириться с тем, что игры, в которые мы играем, не всегда абсолютно случайны и справедливы. Но они достаточно к этому близки и одинаково относятся ко всем игрокам, так что погрешностями можно пренебречь.

Псевдослучайные числа

С компьютерами похожая проблема: как я уже упоминал во вступлении, в устройстве компьютера вообще не бывает случайностей. Только нули и единицы, только высокое и низкое напряжение, бегущее по проводам и хранимое электромагнитным способом где-то на диске памяти. Всё это детерминировано. Если вы не собираетесь устанавливать прибор для измерения произвольно меняющегося параметра некоего физического явления — счётчик Гейгера или что-то подобное — у вас появляется неразрешимая проблема: как заставить детерминированную машину разыгрывать в игре недетерминированные шансы.

Выкрутиться можно при помощи несложной математики, которую я здесь приводить не буду (если вам интересно, достаточно загуглить «алгоритмы генерации псевдослучайных чисел»). Всё, что вам нужно знать: существуют некоторые математические функции, которые ведут себя достаточно беспорядочно, без какой-либо заметной закономерности, так что можно просто взять один из результатов этой функции и назвать его случайным числом.

Как узнать, какой результат функции взять? Да любой случайный. Шучу, конечно. Как я и сказал, этого сделать невозможно. Так что вместо этого вы говорите компьютеру, какой результат ему взять, а потом, когда начало будет положено, если вам ещё раз потребуется случайное число, он просто возьмёт следующее в последовательности, а потом следующее, и следующее, и так далее. Но поскольку мы сказали ему, с чего начать, — всё это уже неслучайно, даже если игроку так и кажется со стороны. Число, с которого вы велели компьютеру начать, называется зерном. Как только вы задали компьютеру одно инициирующее зерно, с него он начинает выбирать числа из последовательности. Достаточно сделать это лишь однажды. Но если вы зададите то же зерно ещё раз, результаты будут точно такими же.

Обычно мы выкручиваемся, выбирая в качестве зерна число, которое игроку будет сложно повторить, например, число миллисекунд, которые истекли с момента наступления полночи, или что-то подобное. Но выбирать надо очень осторожно. Например, если вы выберете зерном дробное значение миллисекунды из часов системы (от 0 до 999), то в вашей игре будет лишь 1000 вариантов перетасовки, и этого достаточно, чтобы при многократной игре ваш пользователь ощутил дежавю от двух подозрительно похожих игровых сессий. Если игра соревновательная, достаточно мотивированный игрок может изучить ее настолько, что будет уметь предсказывать, какое число когда выпадет, и использовать это для получения нечестного преимущества. Так что при создании подобных систем нужно проявлять предусмотрительность.

Псевдослучайные числа в онлайн-играх: синхронизация клиентов

В онлайн-играх со случайными числами нужно быть ещё осторожнее, если компьютеры игроков генерируют собственные случайные числа. Я работал над играми двух компаний, которые были спроектированы таким образом. Могло произойти вот что: один игрок (или сервер) мог сгенерировать зерно, и то же самое зерно использовалось для обоих соперников в игре один на один. Тогда, если кому-либо из игроков требовалось случайное число, обе машины должны были его сгенерировать, чтобы их случайные числа были идентичны.

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

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

Псевдослучайность в однопользовательских играх: сохранение и загрузка

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

Сохранение в любом месте

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

Если вы будете заново генерировать инициирующее зерно, рано или поздно игрок своего добьётся, и уже нельзя будет сказать, что он играет в ту игру, которую вы задумали. С другой стороны, он использует системы, разработанные вами, так что нельзя сказать, что это жульничество. Ваши тщательно сбалансированные вероятности внезапно становятся несбалансированными просто потому, что игрок продолжает делать попытку за попыткой, пока не победит.

Сохранение в любом месте с сохранением зерна

Ладно, говорите вы, давайте все исправим: что если мы сохраним инициирующее зерно в игровом файле? Тогда, даже если вы сохранитесь и перезайдете, все равно будете получать один и тот же результат.

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

Во-вторых, вы только что создали ещё одну проблему: после того как игрок сохраняется, он точно знает, что́ вражеский искусственный интеллект будет делать на каждом своём ходу. Как только вы начинаете загружать одно и то же инициирующее зерно для генерации случайных чисел, игра становится полностью детерминированной. Порой, если игрок заранее знает точную последовательность действий врага, это даёт ему большее преимущество, чем возможность «перебросить кости».

Точки сохранения

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

Тут мы сталкиваемся с другой проблемой: хотя такой механизм и борется с жульничеством, честные игроки жалуются, что система сохранения не даёт им выйти из игры тогда, когда им хочется, и держит в заложниках до следующей точки сохранения.

Быстрое сохранение

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

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

Сохранение в любом месте ограниченное количество раз

Вы даёте игроку возможность сохраняться где угодно, но ограничиваете количество возможных сохранений. Так была устроена оригинальная «Расхитительница гробниц». Некоторые эксплойты всё же возможны, но не каждый раз, когда надо бросить кости. Чем не компромисс?

Кстати, надеюсь, вы дали игроку карту и предупредили его, как часто можно сохраняться в среднем, и огромными стрелками указали на карте места, где должны случиться ключевые битвы. Тогда игроку не придется перепроходить большие участки карты просто потому, что он не знал заранее, где лучше сохраниться. Но в этом случае ваши игроки будут жаловаться, что игра слишком простая, потому что выдаёт всю информацию о том, где именно будет сложно.

Выбирайте из множества зол

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

Когда псевдослучайные числа подводят

Даже когда вы тщательно выбираете инициирующее зерно для псевдослучайной последовательности, даже если вы закрываете глаза на баги и экспромты игрока — случайность может пойти насмарку из-за плохо подобранных алгоритмов. Допустим, у вас есть колода карт и вам надо их перетасовать. Вот наивный алгоритм, который приходил в голову большинству начинающих программистов:

  • Начать с нетасованной колоды.
  • Сгенерировать псевдослучайное число, которое соответствует какой-либо карте в колоде (если колода из 52 карт, нужно сгенерировать число от 1 до 52 или от 0 до 51, в зависимости от языка, который вы используете). Назовём это число А.
  • Таким же образом сгенерируйте второе псевдослучайное число. Назовём его числом Б.
  • Поменяйте карты под номерами А и Б местами.
  • Повторяйте шаги 2–4 много-много раз.

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

Представьте это так: если карта меняет своё место, она занимает случайную позицию, так что все позиции одинаково вероятны для каждой карты, если её вообще перемещали. Многократная перемена мест не меняет сути дела: карта перемещается с одного случайного места в другое, так что в конце концов любая позиция карты равновероятна. То есть каждая перемещённая карта с равной вероятностью может оказаться где угодно, с равной базовой частотой — и это хорошо. Однако есть некоторый ненулевой шанс, что карта не будет перемещена и останется на своём изначальном месте, таким образом, суммарный шанс того, что она останется, где была, гораздо выше.

Чем больше вы произвели замен, тем ниже шанс, что карта останется на своём месте, но, сколько ни менять карты местами, вы никогда не снизите эту вероятность до 0. Как ни странно, это значит, что самый вероятный расклад в этом алгоритме — увидеть все карты на тех же позициях, с которых они начинали.

Даже если псевдослучайные числа, сгенерированные для этого расклада, совершенно случайны или близки к этому, сам расклад всё равно не случаен.

Достаточно ли псевдослучайны ваши псевдослучайные числа

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

Конечно, вероятно, что вы увидите некоторые скопления: как мы выяснили, это характерно для случайных чисел. Но если вы повторяете эксперимент несколько раз, эти скопления должны появляться в разных местах. Это один из способов использования симуляции Монте-Карло, чтобы быстро и наглядно проверить, действительно ли случайны ваши псевдослучайные числа. Есть и «более математические» способы вычислить действительный уровень случайности вашего генератора, но тут требуется основательное знание математики. Этот же способ проще: дёшево и сердито, как раз годится для целей геймдизайна.

В большинстве случаев вам всё это даже не потребуется. В большинстве языков программирования и игровых библиотек есть встроенные функции генерации псевдослучайных чисел, дающие достаточно случайные числа. При этом они используют устоявшиеся, испытанные алгоритмы — именно такими, как правило, пользуется большинство программистов. Но если ваш программист по какой-то причине решил, что для генерации случайных чисел нужно внедрить собственный механизм, тестировать его нужно очень внимательно.

Домашняя работа

Раньше я давал вам материал, который вы могли сразу же использовать для улучшения баланса своей игры, а также задание для дальнейшей практики. В этот раз я всё сделаю в обратном порядке. Давайте сперва попрактикуемся, а уже потом приложим изученное к вашему проекту, когда вы освоитесь с идеей.

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

Я хочу, чтобы вы пустили в ход логическое мышление, подумали над обоими алгоритмами и выяснили, эффективны ли они на самом деле. Дам вам подсказку: один эффективен, а другой нет. Собственно, я дам вам их исходный код, но и объясню, как они работают, тем, кто не умеет программировать.

Обратите внимание: всё может выглядеть так, как будто это ошибка программирования, но на самом деле ошибка здесь в расчёте вероятностей: сколькими способами можно посчитать различные варианты тасования и как они распределяются по возможным положениям карт в колоде.

Алгоритм №1

  1. Начните с нетасованной колоды.
  2. Выберите случайную карту из тех, что у вас есть (если колода из 60 карт, выберите псевдослучайное число от 1 до 60). Возьмите карту под этим номером и поменяйте местами с картой № 60. По сути, это значит взять любую карту из колоды и положить её на дно тасуемой колоды, закрепив там.
  3. Теперь возьмите из оставшихся карт (от 1 до 59) случайную и поменяйте местами с картой №59, положив поверх предыдущей.
  4. Затем возьмите ещё одну случайную карту (от 1 до 58), поменяйте её местами с картой №58, и так далее.
  5. Продолжайте, пока не дойдёте до карты №1, которая меняется местами сама с собой (то есть не делает ничего).
  6. Этот способ, очевидно, отличается от всех нормальных способов, которыми люди тасуют карты, но помните про цель — не эмулировать тасование живым человеком, а получить случайный порядок карт.

Алгоритм №2

Второй алгоритм похож на первый, но есть два небольших изменения.

  1. Начните с нетасованной колоды.
  2. Выберите случайную карту из тех, что у вас есть (если колода из 60 карт, выберите псевдослучайное число от 1 до 60). Возьмите карту под этим номером и поменяйте местами с картой №60, положив её на дно колоды.
  3. Выберите случайную карту из всех карт, включая те, что уже были выбраны (то есть, ещё одну случайную карту от 1 до 60). Поменяйте местами с картой №59.
  4. Выберите ещё одну случайную карту от 1 до 60 и поменяйте местами с картой №58.
  5. Продолжайте повторять, пока в конце концов не выберете случайную карту от 1 до 60 для обмена с картой №1. Готово.
  6. Ах да, и вот ещё что. Повторите весь процесс (шаги 2–5) 50 раз. Так мы сделаем расклад ещё случайнее.

Подсказки

Как взяться за это, когда в колоде из 60 карт так много различных раскладов, что и не пересчитаешь? Всё можно сделать гораздо проще. Представьте колоду всего из трёх карт (все три карты разные, можно назвать их А, Б и В).

Во-первых, вычислите, сколько есть способов, чтобы расположить такую колоду. Теперь взгляните на оба алгоритма и вычислите, сколькими способами каждый из алгоритмов может сформировать расклад. В первом случае выбираете из трёх карт, потому из двух, потом из одной. Во втором случае выбираете из трёх, потом из трёх и снова из трёх. Сравните все действительно возможные варианты расклада колоды, то есть уникальные способы расположения карт, и способы, какими можно перетасовать колоду при помощи этих алгоритмов.

Вы обнаружите, что один из них даёт случайный порядок (по крайней мере настолько, насколько вообще может быть случайным генератор псевдослучайных чисел), а другой «предпочитает» одни расклады другим. И если это работает для колоды из 3 карт, предположите, что такими же случайными (или неслучайными) будут и бо́льшие колоды. Если хотите проверить математикой большие колоды — на здоровье, но делать это не обязательно.

Если вы сейчас работаете над игрой

Видеоигры

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

Если вы используете нестандартный способ генерации псевдослучайных чисел, постройте график из множества сгенерированных пар координат, чтобы проверить, нет ли нежелательных закономерностей. И наконец посмотрите, как инициирующее зерно хранится в состоянии игры. Если это многопользовательская игра, хранится ли оно в различных клиентах или на единственном сервере? Если игра однопользовательская — может ли игрок сохраниться, попытать счастья в ситуации с высоким риском, и продолжать свои попытки, начиная с сохранённого места, пока ему не повезёт?

Все игры, цифровые и нецифровые

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

  • Что преобладает: мастерство или удача? Или они смешаны в равных пропорциях?
  • Подходит ли соотношение мастерства и удачи целевой аудитории игры, или стоит немного отклониться немного в ту или иную сторону?
  • Какие погрешности восприятия вероятностей могут обнаружиться у ваших игроков в ходе игры? Можете ли вы устроить свою игру иначе, чтобы игроки считали ее более справедливой? Стоит ли это делать?
2 комментария

Я не помню, где я был 11.09.2001. Шах и мат!