Читаем без скачивания Математическое руководство по созданию компьютерных игр. Справочник - Алексей Патрашов
Шрифт:
Интервал:
Закладка:
Если что-то не получилось в игре с первого раза, то часто можно попробовать со второго и так далее до бесконечности. Расположенные на сервере игры такого счастья не предоставляют, но почти все локальные игры даже с ограничением сохранения хранят файлы настолько доступно, что их ничего не стоит скопировать и повторять любое действие со случайным исходом до получения успешного результата. Естественно, что возникает вопрос об эффективности такой стратегии прохождения, а также об эффективной встречной стратегии противостояния ей.
Некоторые приёмы использования случайности могут оцениваться двояко. Так хорошо известные вероятности вскрытия замков и успешных уговоров бывают полезны, когда надо придать неопределённость игровому процессу, но чаще всего при наличии возможности сохранения и загрузки игры в любой момент они становятся бесполезными потому, что рано или поздно желаемое событие наступает. С одной стороны это расширяет возможности прохождения, а с другой наоборот делает препятствия бессмысленными в виду лёгкости их преодоления. Если событие с вероятностью p проверяется n раз, то вероятность того, что оно произойдёт хоть раз, определяется простой формулой с экспоненциальной зависимостью.
Если последовательности действий для вскрытия замков иногда меняются, если разработчики удосужились это сделать, то каждый разговор можно повторять до бесконечности, загружаясь каждый раз после провала. Последовательности действий для вскрытия замков с одной стороны могут быть постоянными, что логично, учитывая повторяемость игрового мира или меняться с каждой попыткой, что выглядит странно, учитывая, что замок остался прежним. В любом случае толку от закладывания в игру элемента случайности в таком виде будет мало.
В играх Fallout 1 и 2 существовало такое явление, как случайная встреча в пустыне. Всё было прекрасно за исключением хорошо построенного на основе этих встреч мошенничества через перезагрузки: после нехорошей встречи можно было загрузиться и попробовать пройти ещё немного, а потом сохраниться и так до точки назначения. Точно так же легко можно было невероятно быстро обогатиться при посещении мест столкновения караванов с кем угодно или нейтральных группировок с враждебными: прошел, встретил, подобрал и сохранился, а потом снова прошел и если не повезло никого встретить, то загрузился и прошел по новому кругу. Таким образом затрачивая очень мало времени внутри игры можно было очень хорошо разжиться всем, чем только богата пустыня и весь игровой баланс немедленно разрушается.
Борьба с повторами может вестись разными способами. Если сохранение игры сделать возможным только в определённых местах, то это значительно усложнит процесс повторения. У этого способа есть существенный недостаток, когда при сбое в игре или случайной гибели приходится проходить большой кусок заново да и выглядит такой подход часто противоестественно за редким исключением. И это мы ещё не учли необходимость вдруг внезапно сохранить и прервать игру, которая возникает иногда достаточно часто. Существует ещё и оценка затрат времени на поднятие нужного навыка для достижения приемлемой вероятности успеха и простого использования этого же времени для нужного числа перезагрузок для нужного числа повторов.
Простейшим способом борьбы с многократными перезагрузками является увеличение времени загрузки сохранённой игры, но это весьма порочный приём. Бывают необходимости частой перезагрузки, а также работает долгая загрузка только при большом количестве попыток. Гораздо более эффективным приёмом будет приравнять затраты времени на выполнение задачи через повторы к затратам времени на развитие нужного навыка. Таким образом ускорить прохождение игры путём перезагрузок уже не получится и возникает необходимость повышения навыков потому, что потратить время и получить повышение навыка и выполнение задачи выгоднее, чем просто потратить время на одну единственную задачу.
От возможности продавливать продвижение через повторы пострадали такие известные игры как Gothic 1 и 2, Fallout 1—3 и Oblivion. Для примера мы рассмотрим два способа борьбы с повторами перезагрузок для диалогов. Обычно пишется вероятность успешного уговаривания, но действие выполняется всего одно и сразу же видно успех уговора. Уже при тестировании можно определить, сколько времени уходит на развитие каждого навыка до каждого уровня. Можно было бы применить ограничения по уровню умения, но это выглядело бы не так естественно, как попытка выполнения задачи без ограничений. Если мы введём перебор множества вариантов диалога через простой выбор хотя бы одного из двух вариантов ответа достаточное количество раз, то вероятность угадывания правильного ответа при низком уровне навыка уговора будет крайне мала и процесс перебора наугад станет неэффективным.
Этот приём может использоваться как подбор синонимов одного или нескольких слов одного предложения или просто выбор из нескольких предложений. Лучше всего суть этого приёма отражает подбор меняющегося кода на замке. Можно потратить очень много времени на перебор всех вариантов или за то же время найти код, выполняя другие задачи. Таким образом, если в игре требуется произвести десять успешных убеждений с уровнем убеждения для достижения которого потребуется десять часов, то каждое убеждение должно занимать не меньше часа при полном отсутствии навыков убеждения.
С повторением из второго примера бороться уже сложнее: у нас не происходит какое-то событие сколько-то раз, а просто проходит какое-то непрерывное время в игре. Для решения задачи попробуем представить её следующим образом. Пусть у нас некоторое событие происходит со средней частотой λ и за время t происходят в среднем λ⋅t событий. Тогда у нас за период T произойдут в среднем λ⋅T событий, а вероятность попадания в интервал t, вложенный в интервал T, при равномерном распределении событий по длине интервала T будет t/T. Вероятность принадлежности k событий интервалу t будет тогда определяться выражением.
и
Мы получили распределение Пуассона, чего и следовало ожидать. Теперь нас интересует вероятность того, что за время t событие не произойдёт ни разу, то есть произойдёт ноль раз. Вычитая эту вероятность из единицы мы получим вероятность того, что событие произойдёт за указанное время хотя бы один раз и более. Получаем следующее выражение.
Полученная вероятность имеет асимптотическую зависимость с отрицательной экспоненциальной степенью, на основании которой теперь можно сделать соответствующие выводы. Первый вывод заключается в том. что вероятность хотя бы одной встречи на протяжении заданного периода времени очень быстро стремится к единице. Второй вывод следует непосредственно из первого и заключается в том, что вероятность встречи в игре должна быть привязана ко времени, прошедшему с момента предыдущей встречи в соответствии с полученным выражением. Это не единственно возможный способ решения, но зато самый простой и быстрый. После того, как событие один раз произошло, отсчёт времени начинается заново с нуля. Такой подход вполне обоснован потому, что в данном случае используется схема испытаний Бернулли при которой вероятность успеха каждого следующего испытания не зависит от исхода предыдущего испытания.
Теперь если вероятность встречи задаётся полученным нами способом, то спустя некоторое время игры избежать нежелательной встречи или несколько раз повторить полезную встречу будет уже невозможно потому, что вероятность встречи уже будет зависеть от времени в игре. Если игрок попытается повторять загрузки чтобы пройти по карте дальше в несколько приёмов, то через некоторое время нежелательная встреча будет происходить практически мгновенно и продвижение прекратится. Точно так же нельзя будет непрерывно повторять одну за другой и полезные встречи, когда вероятность повтора будет иметь приемлемое значение только по прошествии определённого времени. Осталось только привязать время к местности, а также к реальному времени.
Первое, что мы сделаем, это привяжем счётчики времени каждого события к нахождению в определённой местности. Таким образом у нас будут происходить в каждой местности только соответствующие именно ей события, а таймеры остальных будут без изменений. Вторым действием будет ещё учёт просто времени нахождения в каждой местности. Теперь после длительного пребывания, например лечения или отдыха, в какой-то точке пустыни таймеры соответствующих местности встреч изменятся и придётся выбирать между полным излечением и неизбежным следующим столкновением или попыткой пройти как есть в расчёте на везение.