Игровая программа по поиску кладов в лабиринте, который формирует ПМК.
Собрать как можно больше кладов и успешно выйти из лабиринта.
В лабиринте 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Г нужно нажать С/П, чтобы увидеть количество кладов, которое игрок успел взять. А после С/П будет сформирован тот же лабиринт, который игрок не смог пройти, для повторной попытки.
Оригинал взят с 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).
по умолчаниюбудет выполнять короткую побочную ветку (с адреса 00), поэтому стоит KБПd, а не KППd, иначе будет выполнена команда по адресу 06 (L1), а затем снова 00 (L2), без проверки по адресу 07.