Неразрешимость игры Braid — различия между версиями
(Полное описание счетчиковой машины) |
Heatwave (обсуждение | вклад) (Сдвиг картинок) |
||
Строка 21: | Строка 21: | ||
Проблема останова игры «Жизнь» неразрешима. | Проблема останова игры «Жизнь» неразрешима. | ||
|proof = | |proof = | ||
− | |||
− | |||
− | |||
− | |||
− | |||
[[Файл:Platform.png|200px|thumb|right| Платформа с рычагом]] | [[Файл:Platform.png|200px|thumb|right| Платформа с рычагом]] | ||
[[Файл:Cannon.png|200px|thumb|right| Пушка]] | [[Файл:Cannon.png|200px|thumb|right| Пушка]] | ||
Строка 33: | Строка 28: | ||
[[Файл:Counter.png|200px|thumb|right| Устройство-счетчик]] | [[Файл:Counter.png|200px|thumb|right| Устройство-счетчик]] | ||
[[Файл:Branch.png|200px|thumb|right| Устройство ветвления]] | [[Файл:Branch.png|200px|thumb|right| Устройство ветвления]] | ||
+ | |||
+ | Заметим, что если существует МТ, которая по начальной конфигурации уровня в Braid может определить, завершается ли она, то та же МТ может определить, останавливается ли любая МТ, что противоречит неразрешимости проблемы останова для МТ. Следовательно, необходимо описать процесс построения МТ в игре Braid. Построим [[Счетчиковые машины, эквивалентность двухсчетчиковой машины МТ|счетчиковую машину]], эквивалентную МТ. Подаваемая на вход программа будет содержать следующие операции: | ||
+ | * прибавить: увеличивает на 1 значение выбранного счетчика. | ||
+ | * вычесть и перейти: сравнивает с нулем значение выбранного счетчика. Если оно больше нуля, из него вычитается единица; если равно нулю, происходит переход на указанную строку в программе. | ||
+ | * остановиться. | ||
В нашей машине счетчиками будут являться группы монстров. "Программа" будет выполняться Тимом: чтобы пройти уровень, ему нужно нажать на каждый рычаг на своем пути. Каждый рычаг выполняет либо операцию "добавить", либо "вычесть и перейти". Чтобы допустить переходы (''goto''), некоторые участки пути могут вести к более ранним местам на этом пути. | В нашей машине счетчиками будут являться группы монстров. "Программа" будет выполняться Тимом: чтобы пройти уровень, ему нужно нажать на каждый рычаг на своем пути. Каждый рычаг выполняет либо операцию "добавить", либо "вычесть и перейти". Чтобы допустить переходы (''goto''), некоторые участки пути могут вести к более ранним местам на этом пути. |
Версия 22:35, 15 января 2016
Игра Braid — изданный в 2008 году платформер-головоломка, основным элементом которого является способность главного героя поворачивать время вспять.
Игровые объекты
- Тим (англ. Tim) — главный герой игры. Возвышение перед ним иллюстрирует максимальную высоту его прыжка. На возвышении находится часть паззла. Цель игры — заполучить ее.
- Монстр (англ. monstar). Ходит по прямой линии, падает с возвышений, разворачивается, когда сталкивается с препятствием. Тим может оттолкнуться от него, чтобы прыгнуть выше.
- Рычаг (англ. lever) и платформа (англ. platform). Подъем платформы контролируется нажатием рычага. Платформу можно установить таким образом, чтобы она поднималась при нажатии рычага и падала, столкнувшись с другим объектом.
- Односторонние поверхности (англ. one-way surfaces) позволяют проходить сквозь них в одну сторону, но не пускают обратно. На иллюстрации Тим может запрыгнуть на поверхность (2), но не сможет спуститься вниз. Монстр пройдет из области (1) в область (2), но не пройдет назад.
- Пушка (англ. cannon). С некоторой периодичностью пушка стреляет определенными игровыми объектами (монстрами, кроликами, огненными шарами или облаками).
- Кролик (англ. bunny). Монстр убивает кролика, сталкиваясь с ним. Это может быть использовано, чтобы отделить одного монстра от группы монстров.
Перемотка времени
Игрок может зажимать клавишу Shift, чтобы отматывать время назад, чтобы исправить соверешенную ошибку или даже отменить смерть персонажа. Обычно эта механика упрощает прохождение игроку, но никак не влияет на вычислимость игры. Однако, в Braid некоторые объекты существуют вне времени и на них не действует перемотка. Например, вневременной кролик продолжит прыгать вперед, даже когда весь мир возвращается назад во времени. На таких объектах основывается большинство уникальных головоломок в Braid. После отмотки времени назад Тим может промотать его снова вперед, аналогично командам undo и redo в различных редакторах. Как и с командами undo и redo, совершение каких-либо действий после отмотки времени назад не позволит промотать его вперед.
Неразрешимость
Теорема: |
Проблема останова игры «Жизнь» неразрешима. |
Доказательство: |
Заметим, что если существует МТ, которая по начальной конфигурации уровня в Braid может определить, завершается ли она, то та же МТ может определить, останавливается ли любая МТ, что противоречит неразрешимости проблемы останова для МТ. Следовательно, необходимо описать процесс построения МТ в игре Braid. Построим счетчиковую машину, эквивалентную МТ. Подаваемая на вход программа будет содержать следующие операции:
В нашей машине счетчиками будут являться группы монстров. "Программа" будет выполняться Тимом: чтобы пройти уровень, ему нужно нажать на каждый рычаг на своем пути. Каждый рычаг выполняет либо операцию "добавить", либо "вычесть и перейти". Чтобы допустить переходы (goto), некоторые участки пути могут вести к более ранним местам на этом пути. Для это нам понадобится соорудить из простых игровых объектов следующие устройства:
Разместим три устройства-счетчика далеко друг от друга. Состоящий из устройств нажатия рычага и ветвления маршрут, который мы построим для Тима, и будет подаваемой на вход "программой". Например, если мы хотим добавить 1 к счетчику №2 в начале программы, то первая комната на пути будет устройством нажатия рычага, связанным с устройством прибавления единицы во втором устройстве-счетчике. Аналогично, рычаг может быть связан с устройством вычитания единицы в каком-либо счетчике. Тогда при активации, если значение счетчика не равно нулю, один монстр покинет счетчик. Чтобы выполнить переход при равенстве нулю, нам нужно отправить монстра в соответствующее устройство ветвления. Для этого все монстры, покидающие счетчик, будут попадать в соответствующую ему комнату, по которой они будут ходить. В полу этой комнаты будет множество платформ, работающих в качестве люков. Отправим Тима во второе устройство нажатия рычага, которое и откроет один из люков. Построенный нами путь под этим люком будет вести в устройство ветвления. Теперь Тим отправится в это устройство, но его маршрут сделаем значительно длиннее, чтобы он не мог опередить монстра, направляющегося туда же. В зависимости от того, был ли счетчик нулевым, Тим встретит или не встретит монстра в устройстве ветвления и пойдет по определенному пути. Операции "прибавить" и "вычесть и перейти" описаны. Операция "остановиться" проста: построим комнату с частью паззла и выходом с уровня. |