Кладоискатель-2

Игровая программа по поиску кладов в лабиринте, который формирует ПМК.

Задача

Собрать как можно больше кладов и успешно выйти из лабиринта.

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

В лабиринте 9 этажей по 7 ячеек на этаже. Вход на 9-м этаже (слева из стены) делается за игрока автоматически. Выход на 1-м – налево в стену, на остальных этажах прохода нет. На каждом этаже возможны обычные ячейки (пол), или пол с кладом (клад), или дыра в полу (для прыжков вниз) или лестницы для подъёма наверх. Кроме того, игрок может самостоятельно проделать дыру, там где её нет. Лестница при этом разрушается, и теряется возможность подняться выше. План этажа становится известным, только когда игрок на него попадает.

Число, обозначающее этаж и игрока на нём отображается в виде: цифра номера этажа (то же в регистре Y), . как обозначение левой стены, план текущего этажа и положение игрока символами слева направо:

Значение Символ С игроком
Пол - 8
Лестница E C
Дыра Г
Клад L 9

Вначале лабиринт неизвестен и есть риск провалиться в биомассу (нулевой этаж или подвал), или пропустить единственную возможность взять труднодоступный клад. Собственно это и есть игровой момент.

Вот пример лабиринта, генерируемый ПМК при нулевом начальном значении датчика случайных чисел в регистр c (справа более понятное отображение того же):
9.EEL LE   9→≡≡o o≡
8.LLEL- E   8|oo≡o
7.E-E L-   7|≡ ≡ o
6. EL-E-L   6| ≡o ≡ o
5.L E -   5|o
4. EELL   4| ≡≡oo
3.EE-E E-   3|≡≡ ≡
2. EL-EEE   2| ≡o ≡≡≡
1.--L -   1← o

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

Начало

После ввода программы можно ввести случайно число в регистр c или оставить там ноль и ввести -55555555. x→Пd В/О С/П. После этого отобразится положение игрока после входа в лабиринт. Возможно это будет и не 9-й этаж в случае дыры в начале и падении.

Движение

Движение влево/вверх/вправо определяется переключателем Р/ГРД/Г при ненулевом значении регистра Х, далее С/П. А если нужно пробить пол или лестницу, то тогда необходимо Cx или 0, С/П. Падение в дыру идёт автоматически.

Окончание

По окончании (выход на 1-м этаже влево) показывает количество кладов. Для указанного выше примера, если собрать все возможные (кроме одного на 9-ом), будет -12. Количество специально отражается отрицательным, чтобы не спутать с планом этажа. Например, 7. – полностью дырявый седьмой этаж (редкость, но возможно), а -7. – окончание игры, где удалось вынести семь кладов. Кому хочется положительным – поменяйте местами команды по адресам 13 и 14.

Затем С/П и будет сформирован новый лабиринт.

Если прохождение завершилось падением в биомассу, то после ЕГГ0Г нужно нажать С/П, чтобы увидеть количество кладов, которое игрок успел взять. А после С/П будет сформирован тот же лабиринт, который игрок не смог пройти, для повторной попытки.

Дополнительное управление


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

Почему версия 2

Оригинал взят с https://www.lordbss.pp.ru/pmk190. Текущая программа – это доработанный вариант. Отличия от оригинала:

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

 # |  00 01 02 03 04 05 06 07 08 09
 00 |  KБПd Fx=0 82 П→xb 1 x→Пb Kx=0d П→xe x→Пc
 10 |  П→xb Flg Kx=0d П→xd П→x0 С/П П→xc x→Пe 9
 20 |  x→Пb x→П0 П→x0 x→Пa П→xc Fπ + Fex K{x} x→Пc
 30 |  FBx П→xd K Kx→Пa FL0 22 4 4 K x→П1
 40 |  П→xd x→П0 KЗН F10x П→xa × K{x} Fx=0 58 БП
 50 |  10 + Kx→Пb FL0 89 Fx≥0 17 П→xa x→Пa KП→xb
 60 |  П→xa 1 + 5 × K K{x} П→xa ÷ В/О
 70 |  2 F10x Fcos Fx=0 42 KППd Kx≠0d F1/x П→xb +
 80 |  x→Пb KППd 4 Fx≠0 50 + Kx≥0b + +
 90 |  KИНВ <-> П→xb FBx <-> <-> ВП С/П Fx=0 70
 A0 |  KППd П→xa × Kx→Пb

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

R0Количество кладов в виде разницы с Rd
R1…R9План 1…9 этажей
RaПоложение на этаже. В начале у левой стенки 0.1, правее 0.01, 0.001 и т. д.
RbНомер текущего этажа
RcПоследнее значение случайного числа
Rd−55555555
ReНачальное значение случайного числа

Каждый этаж представлен в виде числа 8.xxxxxxx, где x: 0 – пусто, 1 – лестница, 4 – клад, 5 – пол (используются биты 0 и 2). Результат отображается в инвертированном виде. Взято так, из-за того, что ноль при инвертировании превращается в пусто , 5 в пол -, а E (not 1) больше всего похоже на лестницу. Для отображения положения игрока перед инвертированием устанавливается бит 1 у цифры в нужной позиции (всё как в оригинале).

Регистр d выполняет сразу несколько функций. Как адрес перехода (последние две цифры) на подпрограмму получения цифры текущего положения игрока. Как битовая маска для исключения из случайного числа ненужных бит в каждом разряде. Как просто большое число, для сокращения процедуры подсчёта кладов. Как отрицательное для сокращения размера программы (бесшовный переход по адресу 42 на обычную проверку движения влево/вправо, с автоматической инициализацией начального положения в RA=0.1).

Некоторые особенности программы