Оценка сложности :(

Эпик фейл.

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

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

150728_test(131-old110)

График основан на результатах логов 131 битв (точнее, 130, т.к. одна “техническая” – битва против нуля противников с очевидным результатом 100%).

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

Причём, интересно то, что зависимость гораздо более регулярна для случая, если у единичных ботов хитпоинтов намного меньше, чем у юнитов игрока (50 хп у бота против 200-300 хп у юнита игрока – т.е. когда игрок легко выносит бота за один ход). Или равно или больше (т.е. когда у игрока обычно не получается вынести бота за один ход). В случае же если у единичных ботов хитпоинтов “в два раза меньше, чем у игрока” получается полная случайная каша. С другой стороны, именно для этого варианта и было больше всего прохождений, так что это может быть просто особенность статистики.

Причём самое обидное, что таки оценочное количество ходов является неплохим приближением для “мниимального необходимого количества ходов” для прохождения карты:

150728_test-turns

Вот и как теперь с этим жить? Куда уже можно точнее оценить сложность?

Ну… конечно понятно, что точнее оценить сложность можно в случае, если моделировать не “количество ботов, принимающих одновременное участие в стычке”, а моделировать поведение ботов в зависимости… вплоть до их стартового положения на карте, экипировку… моделировать оптимальное поведение игрока… моделировать возможные проблемы с боеприпасами. Т.е. иными словами, просто создать алгоритм прохождения карты “компьютер-игрок против компьютера-бота”. Однако, уже на данный момент расчёт 1 миллиона комбинаций (для получения вариации порядка 0.1%) занимает 1-2 секунды. Учитывая, что в игре перерасчёт сложности сейчас проводится после каждого добавленного бота на карту (а их может быть и больше сотни) это приведёт к неоправданным потерям времени (тратить 10 секунд на генерацию карты и 100 секунд на обеспечение её наперёд заданной сложности?!)…

Итого, где же могут быть проблемы?

1. Особенности карты играют ключевую роль, вплоть до “плюс минус 100%” благодаря наличию “bottle neck”. Смоделировать как будет вести себя игрок в условиях неизвестной наперед, случайной карты – нереально. Это даже не шахматы. Сводить всё это к “средняя открытая область на карте разделить на площадь карты”, как я делаю сейчас – верх упрощения.

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

3. Даже в данной имплементации алгоритм подвержен огромному размаху возможных исходов боя “от” и “до”… Возможно, просто невозможно без прямого моделирования боевой ситуации с учётом конкретного положения ботов добиться такого результата? А, возможно, её невозможно добиться вообще?

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

Попробовать написать программу, которая сразу бы обрабатывала все результаты битв и выводила результат на экран в реальном времени в зависимости от настроек? Кажется, тупиковый вариант в свете п.1..п.3.

Так что ж, вообще невозможно хотя бы более-менее точно прикинуть сложность?

В “других” играх (X-Com, Jagged Alliance, Xenonauts…) делается проще – каждая миссия делается заведомо *лёгкой* для прохождения (противник никогда не появляется даже с двухкратным перевесом по численности и вполне реально пройти целую миссию так и не получив ни одного попадания по своим юнитам благодаря туповатому ИИ)…

Но ведь хочется пройти “по краю”. Самые острые ощущения – когда победил невозможное. У врага 4-5 кратный перевес… но повезло, половину из них удалось перестрелять из укрытия… удачно прятаться, правильно планировать бой… и везение… везение… И вот, последний и единственный выживший юнит игрока с хитпоинтами на один-два выстрела стоит посреди побеждённых врагов. Это жизнь. Когда на тебя прёт тяжёлый бот, которому за два-три хода удалось снять только половину хитпоинтов… и вдруг за ним появляется ещё один…

Но проблема оценки сложности ведёт к ещё более серьёзным последствиям.

Если в Project Helena кампания будет состоять из неограниченной возможности переигрывать каждую миссию сколько угодно раз, добиваясь лучшего результата при необходимости, то для Decoherence такое недопустимо. Сгенерировал одну слишком сильную группу монстров, зажавшую команду игрока в тупике и “ты кто такой, давай, до свиданья”. Особенно, учитывая permadeath. Помню, не один раз бросал прохождение Wizardry 8 на эксперте из-за этого и стирал игру, думая, что больше вообще в неё играть не буду :)…

А ведь расчёт сложности генерируемой группы врагов в Decoherence планировался именно таким же методом, как в Project Helena… Конечно же, битва будет моделироваться на “стандартной местности для карты” (коридор для подземелья или открытая местность для overworld), чем позволит существенно упростить проблему оценку максимальной сложности – а, главное, чтобы конкретная группа врагов не превышала её. Плюс, поведение мобов будет более “прямолинейным” (по крайней мере в первой и второй частях), как в Wizardry 8, без каких-либо сложных стратегических манёвров.

Но всё же, теперь у меня начинают возникать сомнения на тему… 😦 Как же сделать так, чтобы уровень “супер сложный” был действительно “супер сложным” а не “непроходимым”? Чтобы вёл игрока по грани между победой и поражением… но не переступал её…

Есть над чем поразмыслить.

Advertisements
Оценка сложности :(

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s