Том и Джерри 3

Кот Том гоняется за мышонком Джерри. По мотивам серии мультфильмов

Задача

Вы играете за мышонка Джерри. Нужно убежать от кота и скрыться в любой из норок.

Общее описание

Зал, где Том гоняется за Джерри, представлен в виде квадрата 9 x 9, где часть клеток заняты – это колонны (чёрные клетки). Числа по краям – только для понимания координат, и не являются частью зала.

90
80
70
60
50 Т
40
30 Д
20
10
 0   1   2   3   4   5   6   7   8   9 

Координаты персонажей задаются двузначным числом. Первая цифра – номер горизонтали, вторая – номер вертикали. Для примера координаты Тома – 53 (буква Т на плане). Координаты Джерри – 37. Норки, куда Джерри стремится убежать, это затенённые числа. Для выхода нужно в клетках с зелёными стрелками пойти влево. Через колонны пройти нельзя, за границу зала тоже не выйти (кроме норок).

Игровой процесс

Начало

Перед первым запуском несколько констант в регистры:

Регистр Значение
R7 61
R9 91
Ra 25
Случайное число из диапазона (0..1). Можно оставить нулевым.

Начало игры: В/О С/П. ПМК сгенерирует случайное положение Тома в третьей вертикали и случайное положение Джерри в седьмой вертикали.

Игра

При остановке ПМК отображает координаты Тома и Джерри в виде числа ТТ0000ДД, где ТТ и ДД двузначные координаты Тома и Джерри соответственно. Для примера из общего описания это будет 53000037. . В регистре Y находится номер хода (идёт подсчет ходов для интереса). В самом начале единица.

Для выбора направления движения Джерри наберите цифру-код и нажмите С/П. Цифра указывает направление движения относительно центра: 4 – влево, 6 – право, 2 – вниз, 8 – вверх. Специальный код 5 позволяет просто ещё раз показать текущие координаты персонажей, если по каким-то причинам вы их забыли, при этом никто не двигается.

После передвижения Джерри на выбранное поле, если конечно не помешает колонна, двигается Том. За него играет ПМК. Естественно он стремится как можно быстрее встретится с Джерри (поймать его).

Более того, вначале, пока Том не устал, он прыгает – делает по два хода за раз. Через некоторое время (после 5 прыжков) он устаёт и делает по одному ходу за раз – как Джерри.

Иногда Том может оставаться на месте, например, если не знает, с какой стороны лучше обойти мешающую колонну, чтобы поймать Джерри.

По окончании расчётов ПМК остановится и покажет новые координаты Тома и Джерри. После чего вы снова задаёте направление движения Джерри.

Если Джерри при своём ходе не может сдвинуться, потому что мешает колонна или граница зала, то ход всё равно переходит к Тому. Подсказка – это можно использовать, чтобы передать очередь хода Тому!

Окончание

В случае, если Том догнал Джерри, то будет отображено ЕГГ0Г . В этом случае для начала новой игры нужно нажать В/О С/П.

Если же Джерри успел убежать в одну из норок, то при остановке ПМК покажет число – сколько движений сделал Джерри. Это может быть меньше, чем число ходов, потому что когда Джерри упирается в колонну, то это ход, но не движение. В регистре Y, как обычно, будет общее число ходов, которые вы сделали за игру. Для начала новой игры можно нажать только С/П. Или ещё перед этим В/О.

Контроль со стороны ПМК

Код-цифра может быть любая. На самом деле ПМК любое число меньше 4 считает за двойку, а любое число, больше 6 – за восьмерку. Дробная часть числа, если вдруг такое введёте, игнорируется.

Предыстория

Это доработка версии Том и Джерри-2

Проведены следующие доработки:

Послесловие

Как и в предыдущей версии программы при правильной стратегии Джерри всегда убегает.


Далее только для тех, кто не только играет…

Текст программы

 # |  00 01 02 03 04 05 06 07 08 09
 00 |  Cx x→П4 x→П6 6 x→П2 П→xc 1 1 x→П3 ×
 10 |  Fπ + К{x} x→Пc КНОП ВП П→x2 + Кx→П2 FL2
 20 |  05 П→x3 В↑ КПП9 Кx≠07 П→x5 П→x1 F1/x КП→x4
 30 |  П→x4 П→x1 ВП 6 П→x5 + С/П К[x] 5
 40 |  Кx≠0a КЗН FВx К∣x∣ FLg КЗН F10x × В↑ П→x5
 50 |  КПП9 Кx<07 <-> П→x2 x→П2 ВП Fx≠0 99 П→x2 x→П5
 60 |  КП→x6 П→x1 П→x5 <-> КНОП ВП КЗН Fx≠0 76
 70 |  ВП 1 П→x1 КПП9 Fx=0 86 П→x1 КИНВ П→x5 КИНВ
 80 |  КЗН П→x1 КПП9 Fx≠0 88 П→x2 x→П1 FL3 21
 90 |  КБПa + x→П2 4 ÷ П→xa К{x} В/О F10x
 A0 |  + Кx=07 П→x4 П→x6 С/П

Распределение регистров

R1 Координаты Тома.
R2 Рабочий регистр.
R3 Счётчик прыжков Тома. При чётном значении Том делает ещё один ход.
R4 Счётчик общего числа ходов.
R5 Координаты Джерри.
R6 Счётчик числа движений Джерри.
R7 61. Адрес начала кода для расчёта движения Тома.
R9 91. Адрес процедуры приращения координат с проверкой колонн и выхода сверху.
Ra 25. Адрес начала основного цикла программы.
Rc Случайное число.

Объяснение работы программы

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

Адреса 00-20. Код начальной инициализации счётчиков и генерации положений Тома (R1) и Джерри (R5). Если с начальным занулением счётчиков понятно, то на цикле по R2 с начальным значением 6 нужно остановиться подробнее.

Адреса 91-98. Процедура приращения координат с проверкой. На входе предполагается, что в регистрах X и Y содержатся координаты персонажа и приращение. Суммарное значение процедурой сохраняется в R2 и делается проверка, результат которой показывает знак числа в RX:

В этой процедуре константа 25 из Ra используется для проверки на более 100, поскольку 25 × 4 = 100. Именно более, поскольку если ровно 100, то делится на 4.

Адреса 21-24. Проверка прыжка Тома. Содержимое R3, которое вначале равно 11, в цикле по прыжкам (адреса 88-89) уменьшается. При каждом чётном значении (10, 8, 6, 4, 2) Том делает ещё один ход. Чётность проверяется с помощью процедуры приращения. Для этого R3 складывается сам с собой. Если сумма делится на 4, значит нужно перейти на повторный ход Тома (адрес в R7). При начальном R3=11 это проверка не проходит и идёт выполнение далее.

Адреса 25-36. Начало основного цикла. Проверка совпадения координат Тома и Джерри. Приращение счётчика ходов и отображения координат на экране ПМК. Тут всё просто, только поясню, что после X2-влияющей команды П→x1 использование ВП работает штатно.

Адреса 37-47. Преобразование кода команды в число приращение. Нужно получить ±1 или ±10. Специальная проверка на 5 не только позволяет перейти на начало, но неявно делает проверку, чтобы команда FLg не столкнулась с нулём. Для вычисления приращения используется два числа. Первое – это знак. Тут просто, меньше 5 – значит минус, больше – плюс. Знак задвигаем в стек. А вот второе, абсолютное значение, вычисляется хитрее. Для чисел, которые возле 5 (4 и 6), логарифм от разницы (от 1) будет нулевым, знак тоже и F10x даст 1. А вот для чисел подальше логарифм уже будет не нулевым, соответственно знак равен 1 и F10x даст 10. Абсолютное значение затем просто умножается на задвинутый ранее Знак.

Адреса 48-52. Приращение координат Джерри. Перед приращением само значение для приращения сохраняется в стеке (позднее нам пригодится). В случае, если есть проблемы с движением, сразу уходим на ход Тома (адрес в R7). Иначе подгоняем обратно в RX сохранённое приращение.

Адреса 53-60. Проверка новых координат Джерри на выход на границу зала. Крайние положения (кроме верха, который уже проверили) характерны тем, что их координаты содержат ноль. Либо 10, 30, 50, 70, 90 (остальные десятки делятся на 4). Либо 01…09. Т. е. только одна цифра не нулевая. Для проверки этого выполняется нестандартное удаление первой цифры числа с помощью последовательности x→ПR ВП. И если результат нулевой, то проводится дополнительная проверка на выход в норку по адресу 99, а иначе новые координаты Джерри сохраняются с приращением счётчика движений Джерри.

Адреса 61-69. Начало вычисления хода Тома. Попытка сблизить горизонталь с Джерри. Для этого нужно найти разницу только десяток от координат и её прибавлять. Тут опять используется нестандартное восстановление X2. Для пояснения, пусть координаты Тома = 34, а координаты Джерри = 58. Тогда восстановив 58 с первой цифрой от 34 мы получим 38. А разница между 58 и 38 и будет нужной нам разницей десятков. Естественно нас интересует только знак этой разницы. При неудаче (ноль – нет разницы), мы перейдём на другую проверку (адрес 76).

Адреса 70-75. Сближение по горизонтали. На основе предыдущей разницы знак числа умножаем на 10 через ВП. Тут следует пояснить, почему это корректно. Потому что команда проверки на (не)ноль синхронизирует X и X2. И также становится понятно, зачем знак числа вычислялся до проверки, хотя он используется только после проверки. Далее, вызываем процедуру приращения. И если не упираемся в колонну, то сразу идёт переход на адрес 86 – сохранения новых координат Тома.

Адреса 76-81. Попытка сблизить вертикаль. Для этого нужно найти разницу между вторыми цифрами чисел. Используем тот факт, что команда КИНВ первую цифру всегда меняет на 8, нивелируя разницу координат в десятках, а дробная часть будет отличаться. Так как это инверсия, то отнимать нужно в обратном порядке. Опять же нас интересует только знак числа.

Адреса 82-91. Движение Тома. Делаем приращение полученной ±1 с помощью соответствующей процедуры. Если неудачно, то пропускаем сохранение новых координат Тома по адресам 86, 87 и сразу идём на цикл по прыжкам (адреса 88-89). Механизм этого цикла был описан вначале. Если же цикл прыжков уже исчерпался, то безусловный переход на начало основного цикла программы. Кстати, для Тома проверять после процедуры приращения на больше нуля не нужно, потому что Том всегда бежит за Джерри, который не может быть вне зала.

Адреса 99-A5. Проверка на выход в норку. Вот тут и пригодится значение приращения, которое мы сохраняли, и которое в этот момент в RY. При нормальном движении влево оно равно −1. При движении вниз, ниже границы зала, оно равно −10. А при движении вправо за границу равно +1. Поэтому мы складываем приращение с единицей, получаемой из нуля в RX с помощью F10x. И только нулевая сумма говорит, что Джерри удачно ускользнул. Иначе это попытка выхода за границы зала и нужно перейти на ход Тома.

Поясню, почему безопасно начать новую игру, сразу нажав С/П. Конечно программа перейдёт на побочную адресную ветвь, но конец цикла по адресу 20 вернёт её в нормальное русло, а то, что команды по адресам 00-06 выполнятся дважды не страшно.