?

Log in

No account? Create an account

Стой под стрелой

Поступки и мысли, о которых могу вспомнить не краснея

Категория: игры

Тактика
tonsky

Добрый день, с вами Тонский и рубрика «внезапные озарения по гейм-дизайну, о которых никто не просил».

Да, я все продолжаю залипать на стримы по Героям и делать далекоидущие выводы. Вот что меня какое-то время удивляло: герои 3 и 5 вышли давно, сообщество с тех пор их оценило, погоняло в хвост и в гриву и понаписало патчей и «турнирных» правил, которые делают игру в целом более честной и терпимой. Причем меняется многое — и баланс, и интерфейс, и сетевой код, юниты и герои вводятся и запрещаются. Но что никогда не трогают так это ИИ. И это меня удивляло — почему?

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

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

Ну и получается что да. Я еще один пример приведу, игра Into the Breach. Такая игра необычная, в которой ты не то что не пытаешься предсказать, как поступил бы «достаточно рациональный противник», в ней следующий ход противника прямо явно вываливается на тебя как часть ситуации. То есть на каждом ходу тебе просто показывают, что будет делать враг. А в чем тогда игра? Игра в том, чтобы обладая этой информацией, сыграть так, что бы у него ничего не вышло. Предотвратить этот самый предсказанный ход, по возможности, на 100%. То есть это такой пазл, в котором, во-первых, ситуация очень несимметричная и к противнику совсем нечестная, а во-вторых, вероятности отсутствуют как класс. Будущее просчитывается, RNG не мешает. И это вполне играбельно и очень даже интересно, зазасывает.

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

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

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


без темы
tonsky
А теперь к интересному. На собеседовании к нам часть кандидатов решает задачи на C, часть (малая) — на чем-то высокоуровневом (C#, Python). Так вот, на этом контрасте видно — я сейчас говорю о самых лучших кандидатах, вопросов к профессионализму которых нет вообще — как на C вы час решаете с человеком задачу, учли кучу случаев, исписали две страницы кода, а на выходе малозначительная не утилитка даже, а функция, но зато уже (!) с кучей допущений насчет входных данных, неврозом по поводу утекающей памяти1, с допущениями по порядку вызова и прилагающимся сюда неврозом по поводу надежности вызывающей стороны; и неистребимым ощущением неудовлетворенности в целом. А на Python-е за пятнадцать минут у тебя уже готово и чтение файла, и парсинг какой угодно, и все это надежно, и общее ощущение хорошо и правильно выполненной работы. Я первый раз даже не готов оказался — через пятнадцать минут и вот, всё, пожалуйста, что дальше делать? Хотя работы было раза в три больше.

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

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

1 Это мое личное, может, в универе меня напугали, но на меня любая строчка кода на C смотрит как партизан, который нет-нет да и выкинет кунштюк, а мне потом неосвобожденная память две ночи снится. В банальной программе
    int* arr = malloc(10);
    arr[0] += 1;
    free(arr);

я не могу избавиться от ощущения, что память тут рано или поздно найдет способ утечь. Это еще и к вопросу о чтении puzzlers на ночь.