Опасная погрузка

Простая игровая программа на внимательность. Подходит и детям.

Задача

Вы владелец корабля, который должен забрать очередной груз с причала в порту. К сожалению, в тот момент, когда вы прибыли в порт, оказалось, что в водах около причала поселилось какое-то чудовище, похожее на спрута, которое атакует все плавающие средства. Вашему кораблю он не сможет повредить, т. к. недостаточно большой, но вот лодке (возле причала мелко, и корабль подойти вплотную не может), которая будет перевозить грузы – вполне. Вам необходимо с помощью лодки перевезти 9 ящиков груза на корабль. За один раз в лодку входит только один ящик. Всего на корабле три лодки – на случай, если чудовище уничтожит лодку.

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

Экран ПМК представляет водное пространство между кораблём и причалом. Корабль справа (в области порядка чисел), причал слева, до разделительной точки. Вы управляете лодкой. Каждым ходом вы задаёте движение лодки (влево, вправо или стоять), а результат, как и положение чудовища отображается на экране. По счастью, прежде, чем вынырнуть, чудовище показывает часть щупальца. Это позволяет определить место, где оно всплывёт, что позволит избежать опасности.

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

Начало

Перед первым запуском внесём константы в регистры (если используете эмулятор, то уже вбито):

Регистр Значение
R7 73
R8 87
Любое случайное число в диапазоне 0…1. Можно оставить ноль.
Rd -Г0000009. . Вводится с помощью следующей последовательности команд: 15000001. B↑ 88. КV К{x} 8 x→П0 КП→x0 П→x0 /-/ x→Пd.
Re 80

Некоторые константы зашиты в программу. В частности начальное количество лодок по адресу 05 (=3, должно быть не нулевым). А по адресу 07 начальное число ящиков на причале (=9, тоже не ноль).

Начало игры: В/О С/П.

Игра

Экран состояние отображается в виде дробного числа. Целая часть – количество ящиков груза, оставшиеся на причале. А остальные 7 знаков мантиссы отображают состояние вод от причала до корабля. Обозначения:

Символ Значение
Водная поверхность
- Лодка
L Появляющееся щупальце чудовища
C Само чудовище
8 Чудовище вместе со щупальцем
E Щупальце появляется возле лодки

Вначале лодка находится на корабле. В этом случае кроме неё отображается (справа) и общий счётчик лодок корабля. В оcтальных случаях этот счётчик скрыт.

Пример стартового экрана при нулевом начальном случайном числе: -9.С L -03. Девятка – осталось 9 ящиков на причале. C – в этом месте появилось чудовище. Если лодка будет в этой точке сразу при своём ходе, или попытается туда попасть следующим ходом, то она будет уничтожена. Потом идут спокойный воды до места, где чудовище планирует появиться (L). Наша лодка (-)в позиции 8 (на корабле) и справа отображается счётчик лодок (03). Начальный знак минус у числа означает, что лодке необходимо двигаться влево, к причалу.

Для движения выбираем число. Любое отрицательное – движение влево. Любое положительное – движение вправо. Ноль – оставаться на месте. Затем С/П. С учётом того, что на экране уже отрицательное число, можно просто нажать С/П. Посмотрим, что будет далее.

-9. СL- . Как видно счётчик лодок пропал, значит лодка в воде. Чудовище появилось в месте, где планировало, а вот новое щупальце показывает, что всплывёт оно как раз по ходу движения лодки. Если мы не хотим её потерять, нужно выбрать ноль или даже положительное число – в этом случае лодка просто вернётся на корабль, где можно просто переждать опасность.

Продолжим нашу серию. Приведу только нажатие клавиш и результат.

Нажатия Результат
Ждём 0 С/П -9. L С-
Ещё ждём 0 С/П -9. 8 -
Чудовище ушло с нашего пути. Двигаемся С/П -9. С -L
Это мы удачно проскочили. Двигаемся далее С/П -9. - 8
С/П -9.L - С
С/П -9.С - L
С/П -9.L- С
Какое коварство?! Оно решило поймать нас прямо возле причала. Ждём. 0 С/П -9.С- L
0 С/П -9. - LС
Теперь снова можно двигаться С/П -9.Е С
Похоже, оно собирается нас дождаться на обратном пути. С/П 8.С L

На месте! Вот так мы попали на причал. Лодка не видна. Но количество ящиков уменьшилось, т. к. один мы загрузили в лодку. К тому же, у числа исчез минус – значит пора двигаться вправо к кораблю. В данном случае придётся переждать на берегу, т. к. чудовище прямо перед нами. И теперь двигаться нужно осторожнее, т. к. лодка везёт груз. И если мы потеряем лодку, то вместе с ящиком.

Кстати, если находясь на берегу снова выбрать движение влево, это будет воспринято как оставаться на месте. То же самое при движении вправо на корабле. Продолжим наше плавание:

Нажатия Результат
0 С/П 8.L С
Упорное, решило нас поймать. Но мы терпеливые 0 С/П 8.С L
0 С/П 8. СL
Теперь можно С/П 8.- С L
С/П 8. - L С
С/П 8. L- С
С/П 8. С - L
С/П 8. ЕС
Бывает и так, что оно пытается окружить нас. Придётся отойти влево /-/ С/П 8. -С
0 С/П 8. -L
0 С/П 8. L-С
0 С/П 8. СЕ
Ага! Не вышло. Уходим из ловушки С/П 8. LС-
С/П 8. С Е
Не поймаешь! С/П 8. L С-
С/П -8. СL -03

И вот лодка вернулась на корабль. Ранее возможно вы не обращали внимание на значение в регистре Y, где всегда оставался ноль. Но сейчас там единица – тот самый ящик, который мы привезли. Теперь так и будет, пока не привезём новый. Продолжим.

Нажатия Результат
С/П -8. С L-
Что произойдёт, если мы беззаботно (по ошибке) двинемся влево С/П ЕГГ0Г

Вот так, нет нашей лодки! И под знаком ошибки прячется число. Если нажать КНОП, то будет отображено 31. . Это…количество ходов, которые вы сделали с начала игры. Да, ПМК считает и это. В регистре Y по-прежнему единица. Что дальше?

Нажатия Результат
С/П -8. L С -02

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

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

Окончание

В конце так же появится знак ЕГГ0Г , но теперь при нажатии С/П он не будет уходить с экрана. Так же отображается общее число ходов за игру (надеюсь в регистре Y у вас будет девятка). Хотя 9 ящиков умножить на 16 (8 ходов туда, 8 обратно) всего 144, но с учётом коварства чудовища, вы вряд ли сможете закончить игру быстрее, чем за 200 ходов, разве только отправив все лодки чудовищу в пасть.

Кстати, когда вы заберёте с причала последний ящик, то вместо нуля на первой позиции (что не позволяет отобразить ПМК при наличии других цифр), будет отображена буква Г, как похожее на П – пусто. Возможный пример отображения перед последним ходом игры: Г. LС - . Отступление: такое нестандартное для ПМК число, где все восемь цифр мантиссы шестнадцатеричные, можно получить только программным образом!

И ещё. Иногда вы не увидите щупальца и чудовища на следующем ходу – это значит, что в этот раз оно пробует ваш корабль. Но корабль не лодка, его чудовищу не одолеть.

Для новой игры: В/О С/П. Все параметры автоматически инициализируются по новой, кроме датчика случайных числе, так что в новой игре чудовище будет вести себя по другому. Приятной игры!


Разбор программы

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

 # |  00 01 02 03 04 05 06 07 08 09
 00 |  Cx x→П4 x→П5 x→Пa КПП8 3 x→П3 9 x→П1 1
 10 |  x→П0 x→П2 8 x→П9 КП→x4 П→xa П→xb x→Пa К П→x9
 20 |  F10x 5 + x→П6 К К{x} Кx=0e П→xa 1
 30 |  КИНВ КПП8 К П→x6 <-> К FL2 46 П→x3 x→П2
 40 |  FВx ВП 1 /-/ FL2 41 П→x5 П→x1 FВx
 50 |  <-> F ВП FL0 56 /-/ С/П КЗН П→x9 +
 60 |  Кx≥07 x→П9 8 ÷ x→П2 Кx=07 FL0 14 x→П0 FL1
 70 |  14 П→xd x→П1 FL2 14 П→x0 Кx<0d КП→x5 П→x1 Кx<0d
 80 |  П→x5 П→x4 ВП . FL3 78 КБПe П→xc 1 1
 90 |  × Fπ + К{x} x→Пc 8 × К[x] F10x 4
 A0 |  + x→Пb В/О

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

R0 Флаг движения лодки влево к причалу.
R1 Количество оставшихся ящиков на причале.
R2 Флаг того, что лодка на корабле.
R3 Количество оставшихся лодок.
R4 Количество сделанных ходов.
R5 Количество перевезенных на корабль ящиков.
R6 Рабочий.
R7 Константа 73. Адрес фрагмента проверки и переход на начало нового хода.
R8 Константа 87. Адрес процедуры генерации нового места для чудовища.
R9 Местоположение лодки 0…8. Ноль – на причале, 8 – на корабле.
Ra Местоположение, где чудовище было. В виде числа для битовых операций, заканчивающееся на 4.
Rb Местоположение, где чудовище будет. В виде числа для битовых операций, заканчивающееся на 4.
Rc Случайное число.
Rd Константа -Г0000009. . Способ получения указан в начале документа.
Re Константа 80. Адрес процедуры генерации ошибки или конца игры.

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

Некоторые фрагменты программы используют особенности косвенной адресации или выполнения команды ВП в программном режиме. Данные особенности описаны в документе Недокументированные возможности в соответствующих разделах.

Сначала поясню про битовые маски. Т. к. для отображения лодки удобнее (с учётом лодки на корабле) использовать минус (шестнадцатеричное A), то для её получения (инверсии) используется цифра 5. Это биты 2 (=4) и 0 (=1). Для битовой проверки совмещения с чудовищем подходит только 4 (числа 14, 104, …, 10000004 в зависимости от положения). Это связано с тем, что при вычислении маски положения лодки на корабле 108 + 5 происходит округление и получается число с единицей в конце – 1.0000001 08. Что при выборе бита 0 приведёт к ложному срабатыванию при проверке (как будто лодка в позиции 7). Отсюда и символ появления чудовища (щупальца) L, как инверсия четвёртки. Для получения C из маски чудовища отнимается 1. Результат – инверсия тройки. Остальные символы получаются автоматом.

Теперь про флаги в регистрах R0 и R2. Они равны единице, если выполнено условие, и не единице, если нет. Это позволяет проводить проверки простыми операторами FLx, причём без нарушения стека и, возможно, несколько раз. Для R0 используются только целые числа, поэтому когда он не единица (не влево), то всегда отрицательный (движение лодки вправо), что иногда используется для обратной проверки. Для R2 используются дробные числа, но в этом случае знак числа нам не интересен – обратная проверка не используется.

По поводу константы в Rd. Хотя 8-значное число с начальным шестнадцатеричным символом очень необычно, как видите, оно получается вполне штатным образом. У константы тройное назначение. Первая цифра используется как признак того, что на причале больше нет ящиков. Знак минус используется для того же, но для программы, а не пользователя. Последние цифры 09 – как адрес фрагмента установки лодки на корабле (в том числе принудительно, после того, как предыдущая попалась чудовищу).

Теперь пройдёмся последовательно по всему коду, поясняя, что выполняют фрагменты.