Maze Adventure by David Payne
Приключение в лабиринте
Исследуйте лабиринт, соберите все ключи и доберитесь до выходного портала, чтобы перейти на следующий уровень.
Ключи:
Клавиши управления курсором
Обратите внимание, что в начале игры и перед каждым новым уровнем существует задержка в 15 секунд (примерно), поскольку лабиринт создается
Используемый алгоритм генерации лабиринта представляет собой рандомизированный поиск в глубину (https://en.wikipedia.org/wiki/Maze_generation_algorithm#Randomized_depth-first_search) переменные, используемые в основной программе (все переменные являются глобальными, за исключением x и y, которые локальный в PROCa):
n и m — эти значения определяют размер лабиринта. m должно быть установлено на n*2+2
для лабиринта 5 x 5: n = 10, m = 22
для лабиринта 4 x 4: n = 8, m = 18
для лабиринта 6 x 6: n = 12, m = 26
g — двумерный массив, представляющий лабиринт. четные строки/столбцы представляют ячейки (каждая комната содержит 2x2 ячейки). нечетные строки/столбцы представляют стены между ячейками
w - номер уровня (следовательно, также количество ключей на текущем уровне)
r — используется для заполнения генератора псевдослучайных чисел
a,b - счетчики циклов. Позже используется для перемещения влево/вправо и вверх/вниз нажатой клавиши курсора
i,j,c – счетчики циклов
x,y (глобальные переменные) - координаты x,y ячейки, в которую помещается объект
k,l - координаты x,y текущей комнаты в лабиринте (с шагом 4, начиная с 1)
s,t - x,y координаты игрока в текущей комнате
v - количество собранных ключей
у - клавишанажат
z - счетчик циклов. Позже то, что находится в направлении, в котором пытался двигаться игрок:
0 - пустое место
1 – ключ
2 — выход из портала
3 – стена
переменные, используемые в PROCa:
x,y (локальные переменные) - координаты x и y текущей ячейки
v - счетчик циклов для списка маршрутов
z - используется для выбора случайного направления. Позже 0, если соседняя ячейка была посещена, 1, если не посещена
r - выбрано случайное направление
a,b - a - смещение влево/вправо в этом направлении, b - смещение вверх/вниз
Объяснение программы (относится к расширенной версии)
инициализация (установка размера лабиринта)
100n=10
101м=22
размер массива (все элементы массива изначально равны 0)
102DIMg(м,м)
установить уровень 1
103w=1
основной цикл игры
104ПОВТОР
запустить генератор псевдослучайных чисел
105r=RND(-TIME)
установить все "внутренние" ячейки как непосещенные (оставив вокруг них границу посещенных ячеек)
106FORb=1TOm-1
107FORa=1TOm-1
108г(б,а)=1
109ДАЛЕЕ
создайте лабиринт (начиная с верхнего левого угла). PROCa также устанавливает v (количество собранных ключей) равным 0.
110PROCa(2,2)
111MODE4
отключить курсор
112ВДУ23,1,0;0;0;0;
поместите объекты в ячейки (w ключи и 1 выходной портал)
200FORi=0TOw
выберите случайную ячейку, убедитесь, что она пуста
201ПОВТОР
202x=СЧ(n)*2
203y=RNД(п)*2
204UNTILg(y,x)=0
поместить объект в эту ячейку
205g(y,x)=193-(i=0)
206ДАЛЕЕ
отображать номер уровня
207ПЕЧАТЬ;w
отобразить верхний левый "дверной косяк"
208VDU9,227
инициализировать координаты x и y комнаты
209k=1
210l=1
инициализировать координаты x и y игрока в комнате
211s=5
212t=4
отключить клавиши курсора для редактирования
213*FX4,1
A% используется вызовом &FFF4 (OSBYTE) позже
300A%=135
цикл текущего уровня
301ПОВТОР
отобразить/удалить объекты в ячейках текущей комнаты
302FORj=0TO1
303FORi=0TO1
304VDU31,18*i+10,14*j+8,g(l+j*2+1,k+i*2+1)+32
305ДАЛЕЕ
отобразить/удалить стены текущей комнаты
z равен 0 для горизонтальных стен и 1 для вертикальных стен
306FORz=0TO1
307FORj=0TO2-z
308FORi=0TOz+1
400VDU31,i*18+2-z,j*14+z+1,17,g(l+j*2+z,k+i*2+1-z)
401FORc=z*4TO16
402VDU227,8,9+з
403ДАЛЕЕ
снова установить белый цвет, отобразить "дверной косяк"
404VDU17,1,227
405ДАЛЕЕ,
текущий цикл комнаты
406ПОВТОР
отобразить проигрыватель
407ВДУ31,с,т,227
действительный цикл перемещения
500ПОВТОР
действительная петля нажатия клавиши
501ПОВТОР
502u=GET-136
503b=(и=3)-(и=2)
504a=(и=0)-(и=1)
505UNTILa+b
проверить, что лежит в направлении, в котором пытался двигаться игрок
506ВДU31,с+а,т+б
Вызов &FFF4 (OSBYTE) с A%=135 возвращает символ в текущей позиции курсора
507z=(USR(&FFF4)AND768)/256
0 - пустое место
1 – ключ
2 — выход из портала
3 – стена
выйти из цикла, когда z = 0 ИЛИ z = 1 ИЛИ z = 2 И все ключи собраны, иначе движение в этом направлении невозможно
508UNTILz+(v=w)<2
удалить плеер
600ВДУ31,с,т,32
обновить координаты x и y игрока
601с=с+а
602t=t+b
если ключ собран, то удалить его из ячейки, увеличить количество собранных ключей, подать звуковой сигнал, сменить палитру на зеленую, если все ключи собраны, отобразить собранные ключи
603IFz=1THENg(l+t DIV7,k+s DIV9)=0:v=v+1:VDU7,19,1,7+(v=w)*5;0;31,38+(v >9),0:ПЕЧАТЬ;v
цикл выхода, когда игрок вышел из комнаты или достиг выходного портала
700UNTILs=0ORs=38ORt=0ORt=30ORz=2
если выйти из комнаты слева/справа, войти в новую комнату справа/слева
701s=s-a*37
если выйти из комнаты сверху/снизу, войти в новую комнату снизу/сверху
702t=t-b*29
обновить координаты комнаты
703l=l+b*4
704k=k+a*4
выйти из цикла, если достигнут выходной портал (уровень пройден)
705UNTILz=2
уровень увеличения
706w=w+1
зеленый/пурпурный мигающий экран
707VDU19,1,10;0;
воспроизвести звуковой эффект в конце уровня
708GOSUB1000
выйти из цикла, когда пройден последний уровень (недостаточно ячеек, чтобы поместить все объекты на следующий уровень)
709UNTILw=n*n
710END
Маалгоритм генерации ze
800DEFPROCa(x,y)
установить ячейку как посещенную
801g(y,x)=0
если PROCa была вызвана из основной программы, то определите графические символы, установите более высокий тон звукового сигнала
802IFr<0THEN!&C08=&FD070000:!&C0C=&A7:!&C10=&A5BD81FF:!&C14=&FF81BDA5:!&C18=-1:!&C1C=-1:?&265=200
установить 4 направления на выбор
1 – вверх
3 – слева
5 – справа
7 - вниз
900!&70=&7050301
проверить направления в случайном порядке, ища 1-е, где ячейка в этом направлении не посещается
901v=4
902ПОВТОР
Используется RND(12), поскольку 12 – это НОК 1, 2, 3 и 4
903z=RND(12)MODv
r — выбранное направление
904r=z?&70
замените это направление в списке направлением в конце списка
905z?&70=v?&6F
906b=r DIV3-1
907a=r MOD3-1
908z=g(y+b*2,x+a*2)
потерять направление в конце списка
909v=v-1
выход из цикла, когда список маршрутов пуст или когда мы нашли направление, в котором можем двигаться
910UNTILv=0ORz
если мы нашли правильное направление, то убираем стену до этой ячейки и создаем новый лабиринт в этом направлении (т. е. рекурсивный вызов PROCa). Когда мы вернемся, снова поищите правильные направления.
если не было найдено правильных направлений, вернуться назад
при вызове из GOSUB1000 z будет равно 2, поэтому воспроизводится звуковой эффект fили конец уровня
1000IFz=1THENg(y+b,x+a)=0:PROCa(x+a*2,y+b*2):GOTO900ELSEIFz=0THENENDPROC ELSEFORz=0TO255:SOUND1ANDz,-15,z,0:NEXT :ВОЗВРАТ
Как скачать Maze Adventure by David Payne через торрент
Всего несколько простых шагов:
- Устанавливаем программу μTorrent, через которую мы будем скачивать торренты
- Выбираем и скачиваем подходящий торрент-файл репака Maze Adventure by David Payne
- Двойным кликом открываем скаченный файл, программа μTorrent запустится автоматически и предложит выбрать место для сохранения дистрибутива.
- После того как репак скачается, запускайте его. Начнется установка и... это все, приятной игры!