100-line maze by RoePipi
Для категории "ПУР-80"
Название: "100-строчный лабиринт"
Платформа: Commodore 16 / Plus/4
Язык: Commodore BASIC V3.5
ВВЕДЕНИЕ
============
Прогуляйтесь по бинарному лабиринту (редактируется в строке программы 0), при желании измерьте свое время.
ФУНКЦИИ
========
– Быстрое действие
- Управление джойстиком (только порт 2)
– Движения по диагонали
- 100(+4) рядов экрана лабиринта (редактируется через строку программы 0)
- Измеряйте свое время
ИНСТРУКЦИЯ ПО ИГРЕ
=================
После запуска программы выполняется 33-секундный этап рендеринга с циклическим изменением цвета границ. Затем появляется верхняя часть лабиринта с вашим персонажем в центре экрана.
Используя джойстик в порту 2, перемещайте своего персонажа в 8 возможных направлениях, избегая стен. (Хотя они не смертельны.) Вы можете наступать только на точки. Если вы дойдете до края лабиринта, вы не сможете двигаться дальше по этому пути. Ваша цель — добраться до самого низа лабиринта, до 104-й строки экрана. В случае успеха игра отображает ваше игровое время (с точностью до 1/60 секунды), которое вы можете сравнить с результатами других игроков.
ОБЗОР ПРОГРАММНЫХ ЛИНИЙ
======================
Используйте команду LIST для просмотра строк программы. Вы можете использовать синтаксис LIST from-to для перечисления определенных интервалов, например. СПИСОК 1–5.
0 установить строку карты
1-5 инициализация и расчеты
6 отобразить начальный экран, данные основных бинарных шаблонов стен, джойстик dданные маршрутов, сброс таймера
7 цикл: определить ход игрока
8 прокрутка экрана вверх или вниз
9 нарисовать линию карты; конец цикла, завершение проверки
ПЕРЕМЕННЫЕ
=========
Переменные цикла A, B, C, D, I
const A$(0-3) базовые бинарные шаблоны стен (2-битные)
const B$(0-255) двоичные шаблоны стен (8 бит)
константа E$ ESC char
const H$ HOME char
const K ROM read switch poke address (1177)
M линия карты для рисования (0-115)
const M$ map, 5*13=65 символов
const M$(0-103) строк карты gfx
постоянный базовый адрес ПЗУ (53248)
постоянный P-код игрока (88)
const R player poke начало строки адреса (3552)
const S пробел код (46)
X-адрес игрока (R – R+39)
Координата Y игрока Y (строка карты, 0-103)
const W экранное окно показывает базовый адрес (2022)
const X,Y(0-8) джойстик направления X,Y (-1/0/1)
ДЕТАЛЬНЫЕ ОБЪЯСНЕНИЯ КОДА
==========================
Примечание. Взаимосвязанные коды занимают несколько строк. Я отметил начальную строку взаимосвязанных утверждений. Сложные циклы расширены.
Также обратите внимание, что я везде использую десятичные точки ("".") вместо "0", чтобы увеличить скорость! (BASIC 3.5 обрабатывает их быстрее)
СТРОКА 0
------
// устанавливаем данные карты лабиринта, каждая строка состоит из 5 символов, свободно редактируемых
M$="(5*13=65 символов данных карты)"
// читаем базовые бинарные шаблоны стен (2-битные: "..", ".W", "W.", "WW")
ДЛЯ A=. К 3: ПРОЧИТАЙТЕ A$(A):NВНЕШНИЙ
СТРОКА 1
------
// считываем данные о движении для 8 возможных направлений джойстика (комбинации -1;0;1)
ДЛЯ A=1 ДО 8:ПРОЧИТАЙТЕ X(A), Y(A):ДАЛЕЕ
// устанавливаем пробел (экранный код)
// ПОЛЕЗНЫЙ СОВЕТ: если установить значение 32 (пробел) и соответственно установить основные бинарные шаблоны стен в строке 6 (" ", " W", "W ", "WW"), вы можете двигаться вверх бесконечно :)
S=46
// устанавливаем HOME char для строки 9, чтобы оставить там 2 символа
H$="{дом}"
// устанавливаем начало строки адреса экрана игрока (столбец 0 в строке 12)
R=3552
// игрок начнет с центра экрана
Х=R+20
// бинарные данные шаблона стены потребуют 256 различных значений; карта будет отображаться в 104 строки
DIM B$(255), M$(103)
СТРОКА 2
------
// изначально игрок будет начинать с 11 строки карты
Д=11
// устанавливаем код нажатия на экран игрока
P=88
// устанавливаем адрес переключателя чтения ПЗУ, используемый для выборки символьных данных
К=1177
// устанавливаем адрес базы данных символов в ПЗУ, также используется для обозначения выполнения отрисовки строки в строке 9 (var M)
O=53248
// начальный флаг "не рисовать"; вместо этого при запуске мы будем отображать полный экран строк
М=О
// Сокращение Esc-кода, чтобы сэкономить несколько символов позже
E$=CHR$(27)
// отключаем ОСНОВНУЮ прокрутку, чтобы иметь возможность заполнять последние столбцы экрана, очищать экран, отображать сообщение пользователю и устанавливать положение курсора для правильного отображения исходной карты позже
ПЕЧАТЬ E$"M{clear}{down} RENDERINГ...{вверх}"
// заполняем данные бинарного шаблона стены на основе базовых шаблонов и переменной цикла I
ДЛЯ A=. ДО 3
::::ДЛЯ B=. ДО 3
::::::::ДЛЯ C=. ДО 3
:::::::::::::ДЛЯ D=. ДО 3
::::::::::::B$(I)=A$(A)+A$(B)+A$(C)+A$(D)
:::::::::::::I=I+1
ДАЛЕЕ, C, B, A
СТРОКА 3
------
// вставляем адрес для установки верхней строки окна экрана; также используется для установки нижнего ряда (2021) позже
W=2022
// цикл по столбцам карты
ДЛЯ B=. ДО 4
::::// прокручивать строки карты
::::ДЛЯ A=. ДО 12
::::::::// получить код CHR$ одного символа из M$ (строка сопоставления) на основе A и B
::::::::C=ASC(MID$(M$, A*5+B+1, 1))
::::::::// конвертировать код CHR$ в код экрана (выражения в скобках оцениваются как -1, если правда, и 0, если ложь)
::::::::C=C+(C>63)*64+(C>191)*64
::::::::// прокручивать линии символов
::::::::ДЛЯ D=. ДО 7
::::::::::::// установить чтение из ПЗУ (ПРИМЕЧАНИЕ: работая на Plus/4, вы НЕ ДОЛЖНЫ использовать строковые переменные или что-либо, что использует старшие (> $ 8000) адреса памяти, в то время как это активен)
:::::::::::::POKE K, 62
:::::::::::::// получить строку формы символа
:::::::::::::I=PEEK(O+C*8+D)
:::::::::::::// вернуть чтение из оперативной памяти
:::::::::::::POKE K, 63
:::::::::::::// добавить новые строки символов в соответствующие строки массива строк карты
:::::::::::::M$(A*8+D)=M$(A*8+D)+B$(I)
::::::::ДАЛЕЕ
::::::::// дисплейy некоторые циклы цвета границы, которые затем останавливаются на красивом сине-зеленом цвете
::::::::ЦВЕТ 4, A+1, B+1
::::ДАЛЕЕ
ДАЛЕЕ
СТРОКА 5
------
// отображаем первые 24 строки карты (начинается со второй строки экрана, заполняет остальные)
ДЛЯ I=. TO 23:ВЫПЕЧАТАТЬ M$(I);:ДАЛЕЕ
СТРОКА 6
------
// основные бинарные шаблоны стен и данные о направлениях джойстика
ДАННЫЕ "..", ".W", "W.", "WW", , -1, 1, -1, 1, , 1, 1, , 1, -1, 1, -1, , -1, -1
// сброс таймера, используемый для отображения времени воспроизведения в конце
TI$="000000"
СТРОКА 7
------
// начало цикла
СДЕЛАТЬ
::::// читать состояние джойстика на порту 2, игнорируя кнопку Fire (значение 128)
::::I=РАДОСТЬ(2) И 15
::::// A удерживает джойстик в направлении X, за исключением случаев, когда он находится по обе стороны от экрана и направлен наружу
::::A=X(I)-(X=R И I>5)+(X=R+39 И I>1 И I<5)
::::// B удерживает джойстик в направлении Y
::::B=Y(I)
// продолжаем, только если адрес целевого экрана содержит пробельный код
ПОВЕРНУТЬ ДО ПРОВЕРКИ(X+A+B*40)=S
СТРОКА 8
------
// помещаем пробел на позицию игрока
POKE X, S
// добавляем горизонтальное перемещение к позиции X игрока (даже если она равна нулю)
Х=Х+А
// если есть вертикальное движение
ЕСЛИ Б ТО
::::// добавить вертикальное движение к позиции Y игрока
::::Y=Y+B
::::// напечатать код Esc для прокрутки содержимого экрана вверх или вниз в зависимости от направления Y
::::ПЕЧАТЬ E$CHR$(86-(B<.))
::::// разместить персонажа игрока
::::POKE X, P
::::// установить окно экрана в верхнюю или нижнюю строку в зависимости от направления Y
::::POKE W+(B<.), (B>.)*-24
::::// отобразит 12 строк выше или ниже игрока в зависимости от направления Y
::::M=Y+B*12
::::// очистить окно (обязательно, иначе интерпретатор вылетит)
::::SCNCLR
СТРОКА 9
------
// недостаточно места для выполнения IF, поэтому все равно отображать персонажа игрока
ПОКЭ Х, П
// "встроенный" при использовании DO-LOOP: отображать строку карты, только если мы находимся внутри измерений 0-103
ДЕЛАЙТЕ, ПОКА M>=. И М<104
::::PRINT M$(M);
::::// флаг "не рисовать" (пока M не будет установлено допустимое значение в следующий раз)
::::M=O
ЦИКЛ
// сбросить окно (клавиша 2x HOME)
ПЕЧАТЬ Ч$Ч$
// если игрок внутри карты, возвращаемся к строке 7
ЕСЛИ Y<103, ТО 7
// иначе расположите чуть ниже видимой карты и отобразите прошедшее время
ДАЛЕЕ
::::CHAR , ., 14, "ВРЕМЯ:"
::::ПЕЧАТЬ TI
// конец
НАПРАВЛЕНИЯ ДЖОЙСТИКА
===================
8 1 2
\|/
7-0-3
/|\
6 5 4
ПРЕОБРАЗОВАНИЕ CHR$ В ЭКРАННЫЕ КОДЫ
==============================
CHR$ -> экран
32–63 -> 32–63 (то же самое)
64–95 -> 0–31 (-64)
96–127 -> 64–95 (-32)
160–191 -> 96–127 (-64)
192- -> 64- (-128)
Как скачать 100-line maze by RoePipi через торрент
Всего несколько простых шагов:
- Устанавливаем программу μTorrent, через которую мы будем скачивать торренты
- Выбираем и скачиваем подходящий торрент-файл репака 100-line maze by RoePipi
- Двойным кликом открываем скаченный файл, программа μTorrent запустится автоматически и предложит выбрать место для сохранения дистрибутива.
- После того как репак скачается, запускайте его. Начнется установка и... это все, приятной игры!