Том и Джерри 3

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

Задача

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

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

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

9
8
7
6
5 Т
4
3 Д
2
1
 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 Адрес начала кода для расчёта движения Тома
R9 Адрес процедуры приращения координат с проверкой колонн и выхода сверху
Ra Адрес начала основного цикла программы
Rc Случайное число.

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

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

Адреса 00-20. Код начальной инициализации счётчиков и генерации положений Тома (R1) и Джерри (R5). Если с начальным занулением счётчиков понятно, то на цикле по R2 с начальным значением 6 нужно остановиться подробнее. Первое – это как пробегает цикл. В нём регистр R2 ещё и используется для косвенного сохранения. В результате его значение на первом этапе равно 6, после косвенного сохранения – 5 (сохраняет в R5, положение Джерри), после проверки конца цикла – 4. Во второй раз уже R2=4 и сохраняет в R3. Но это не важно, поскольку в цикле R3 всегда перезаписывается константой 11. В последний раз R2=2 и сохраняет в R1 (положение Тома). Второй факт – тело цикла. Кроме вычисления очередного значения случайного числа, по формуле Ni+1 = {Ni × 11 + π} оно также через ВП комбинированно восстанавливает X2 (в данном случае число 11), с сохранением первой цифры. В данном случае получается двузначное число N1, где N – первая значащая цифра случайного числа. К нему первый раз добавляется 6, получается N7. Как раз случайные координаты Джерри. А последний +2, получается N3, координаты Тома. Регистр R3 по окончании безусловно содержит число 11.

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

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

Адреса 21-24. Проверка прыжка Тома. Содержимое R3, которое вначале равно 11, в цикле уменьшается. При каждом чётном значении (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. Либо 1, 3, 5, 7, 9. Т. е. только одна цифра не нулевая. Для проверки этого выполняется нестандартное удаление первой цифры числа с помощью последовательности x→ПR ВП. И если результат нулевой, то проводится дополнительная проверка на выход в норку по адресу 99, а иначе новые координаты Джерри сохраняются с приращением счётчика движений Джерри.

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

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

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

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

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

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