Поиграем в отладку этой воскресной ночью?
Вы когда-нибудь думали, что бывают игры, которые сами по себе являются языком программирования? Не обязательно Тюринг-полным, но всё же языком. У меня есть отличный пример. Игровой процесс Нейрошимы-6 чудовищно похож на дебаг. Снаружи, конечно, смотрится как стратегия, но внутри — она, отладка, родная.Посмотрите вот на эту картинку из жизни бойцов Пустошей.
Фишки с 20/20 — это командные центры, оставшиеся две — это фишки бойцов с ближней атакой по направлению треугольников по краям. Пока всё просто — синий робот с ножами бьёт желтого ковбоя, а ковбой бьёт по синему комцентру. Давайте усложним стек и запустим компиляцию.
Предположим, ситуация такая:
Теперь нам важны приоритеты — эти вот числа на фишках. Это уровень инструкций в стеке. Если начать исполнение боя на картинке выше, то получится следующее:
== Слой 3Жёлтый панк с приоритетом 3 бьёт по мутанту и уничтожает его (если бы это не было сделано, мутант вломил бы на шаге 2 комцентру жёлтых). Больше никого с таким приоритетом нет. Идём ниже.
== Слой 2Жёлтый бегун и «ковбой» одновременно бьют по синему комцентру, а по «ковбою» бьёт робот с ножами. Комцентр теряет 2 единицы брони, «ковбой» уничтожен.
== Слой 1С приоритетом 1 никого нет. Эта часть стека просто пропускается.
== Слой 0Комцентры действуют с приоритетом 0 и бьют всех врагов рядом. Синий комцентр отстреливается и уничтожает бегуна и товарища с зазубренным ножиком. Он бы уничтожил и «ковбоя», да вот незадача — его уже два такта как нет.
Конец стека. Вводите новые данные.
Попробуете сами разобрать ситуацию вот с такими данными на входе?
Здесь модуль с плюсом забирает на себя атаку одного из бойцов, к которым подключен. То есть, грубо говоря, мутант около жёлтого комцентра получил вторую жизнь. Фишка взрыва — это жёлтые из текущего состояния запустили исполнение стека. Сетка у жёлтого парня с пушкой — это блокировка: вражеская фишка, на которую направлена сетка, не ложится в стек.
Проиграли ситуацию в голове? Сколько хитов у какого комцентра осталось? Какие фишки всё ещё на поле после полного разбора стека?
Вот что должно получиться: Суть игры в том, чтобы выкладывать 2 из 3 фишек каждый ход оптимальным образом. Каждый из игроков в голове проигрывает возможные варианты разбора стека и размещает свои войска-операторы так, как ему наиболее выгодно. Вот месиве настоящего боя даже простой ход становится настоящей отладкой:
Обратите внимание на красных стрелков — они бьют по ближайшей чужой фишке по направлению атаки, но не поражают свои войска.
Теперь вы сами
Вы играете за рыжих рейдеров — Гегемонию. У вашего командного центра 2 хита, у противника 6. Нужно взять и положить на поле 3 фишки из пяти доступных. После этого запустится компиляция, и в конце исполнения у противника должно быть меньше хитов, чем у вас. Фишки можно вращать.
Посмотрим, что есть: парень с ближним и дальним боем может вбить сразу два повреждения, и он быстрый. Прочный парень с двойной ближней атакой в три стороны, бронёй и защитой (у него 2 хита, в отличие от всех остальных однохитовых подразделений) тоже хорош, но чертовски медленный. Ещё один боец с двойной ближней атакой по верхнему сектору — компромисс между скоростью и мощью. И два рейдера — очень быстрые, не такие сильные.
Ответ прост: Ещё одна сущность — приказы Перемещение (кривая стрелка) позволяет сдвинуть любую свою фишку на соседнюю свободную и повернуть, если хочется. Можно только сдвинуть, можно только повернуть, можно и то, и то. С помощью толчка (стрелка вверх) до компиляции вы можете сдвинуть чужую фишку. Ваша выталкивает её в направлении от себя на клетку. Если есть свободная клетка около толкаемой фишки, и в этой клетке толкаемая фишка будет дальше от вашей толкающей, чем раньше, можно использовать этот приказ. Снайперский выстрел снимает один хит с любого вражеского подразделения, то есть уничтожает всё, что не бронировано.
У вас хит, у зелёного врага — два. Да, ещё одно. Комцентры могут давать бонусы соседним своим фишкам: треугольник означает усиление атаки (здесь мужик с кривым ножиком получает вторую ближнюю атаку), звёзды у зелёных — возможность уйти в стек дважды (в свою инициативу и ниже, то есть стрелок над зелёным комцентром будет атаковать дважды на 3 и на 2).
Вот решение: И последняя языковая конструкция — модули Это подразделения, которые меняют свойства соседей, к которым подключены палочками. Треугольник и плюс — это усиление соответствующей атаки. +1 — это увеличение скорости, то есть приоритета обработки в стеке. Плюс — это защита от одной атаки (вместо атакуемого войска модуль с плюсом принимает атаку на себя). Задача: У вас хит, а у жёлтых и синих врагов — по три хита. Можете использовать три любых модуля из пяти, у нас демократия. Вражеский комцентр даёт плюс к инициативе (стрелок за синим комцентром стерляет на фазе 4 в самом верху стека), ваш — усиливает на 1 дальний бой.
Вот решение, попробуйте разобраться. Медленно, но верно мы подходим к циклам и рекурсии, чувствуете?
У одной из армий есть возможность построить бесконечный цикл, нанося бесконечные же повреждения до конца разбора стека.
Посложнее Вот этюд, сможете быстро растолкать врагов? Вы играете за красных, у вас 1 хит. У жёлтых 6 хитов, у зелёных 3, у синих — 2.
Выбирайте любые три фишки из пяти.
Вот ответ: Видите, как здорово? Теперь представьте, что в настоящей игре такая отладка каждый ход. Вот почему я говорю про тактический симулятор дебага, да-да-да.
Вот настольная игра-оригинал, на странице которой есть детальные правила.
Призовой этюд Вы — Аванпост.
Если вы решите эту задачу Нужно приложить в комментарии картинку с ситуацией до «компиляции», которая приведёт к вашей победе — хоть зафотошопленную с фишками из вариантов выбора, хоть на салфетке, хоть словами, но однозначно. Первому решившему коробка Нейрошимы с доставкой по РФ. Если вам понравится эта воскресная игра, я продолжу с задачами.
Эта задача решена.
Скрытый текст В комментариях одно решение, вот классическое: Собственно, к чему я это. Если вы разработчик, то игра вам точно понравится. Мы же нашли ей ещё применение — советовали родителям как обучающую по логике-программированию.
P.S. Вторая призовая задача, этюд «блокировка на мьютексах»:
Здесь надо будет залезть в правила за точной формулировкой действия сетей и сетевым парадоксом. Первый решивший кроме winKING тоже получит коробку.