ASCII Maze Game for Apple IIe
Простая игра-лабиринт. Найдите путь через случайно сгенерированный лабиринт к букве X, чтобы сбежать!
Клавиши со стрелками для перемещения маленького символа @ (вас). Игра заканчивается, когда вы достигаете X на карте.
Это было действительно веселое испытание. Ограничением на джем было не более 10 строк Бейсика для выбранной вами 8-битной системы и не более 72 символов в строке. Мне пришлось придумать так много неинтуитивных способов сделать что-то, чтобы сжать все в ограничения по размеру. Присвоить одной и той же переменной одно и то же значение 200 раз? Конечно, почему бы и нет! Создайте одноразовый оператор IF, чтобы ваш GOTO работал? Еще бы! В конце поленитесь и используйте несколько операторов печати для форматирования? Я просто хочу, чтобы это безумие прекратилось....
Определенно больше похоже на четырехмерную логическую головоломку, чем на обычное программирование, но это было весело.
Я использовал AppleWin для запуска и тестирования. Мне не удалось найти веб-эмулятор, позволяющий копировать и вставлять код, но с AppleWin это легко. Если я найду простой способ загрузить программу и поиграть в нее, я опубликую ее здесь. Предупреждаем: эта программа сильно оптимизирована по длине и количеству строк кода. НЕ для эффективности. Если вы собираетесь попробовать, установите себе таймер — после того, как вы наберете «RUN», пройдет около 2 минут, прежде чем лабиринт отобразится. Однако есть приятный вращающийся индикатор, так что, по крайней мере, вы будете знать, что программа что-то делает. После загрузки лабиринта все работает гладко, и вы можете быстро перемещаться по лабиринту.врезайтесь в стены, как это делают люди.
Лабиринт создан с использованием нечестивой насмешки над алгоритмом минимального остовного дерева Прима. Согласно инструкциям по джему, я опубликую объяснение кода позже. Мне сейчас нужно отдохнуть от этого..
Вот полный код для вашего ознакомления.
[Обновление] Добавил образ диска! Теперь вы можете загрузить образ диска, затем перейти на https://www.scullinsteel.com/apple2/ и перетащить образ диска на эмулятор Apple II, чтобы начать воспроизведение.
[Обновление] Хорошо, согласно инструкциям Jam, вот объяснение кода:
==[ LINE 0 ]======================================== 0HOME:DIMG(40,24):DIMD(3):FORN=0TO3:D(N)=N:NEXTN:I=1:DIML(210,1):H=2:V=2 -------------------------------------------------- ---- ГЛАВНАЯ // Клеэто экран. DIM G(40, 24) // Создает массив для хранения сетки лабиринта. Разрешение текстового режима Apple IIe — 40x24. DIM D(3) // Массив для хранения возможных направлений. Это будет перетасовано для проверки случайного направления. FOR N = 0 TO 3 // Необходимо присвоить всем четырем направлениям числа D(N) = N // Используйте числа из цикла FOR, чтобы установить начальное состояние D() на 0,1,2,3 NEXT N // Цикл до тех пор, пока N = 3 I=1 // Индекс списка пространств, которые еще необходимо проверить как возможный путь в лабиринте. DIM L(210,1) // Массив для хранения списка пробелов, которые необходимо проверить. Максимально возможное количество мест — всего 209 (38/2)*(22/2). Я не знаю, почему я сделал это 210. H=2 // Начальная начальная позиция X для генератора лабиринта. V=2 // Начальная начальная позиция Y для генератора лабиринта. =============================================== ==== ==[ СТРОКА 1 ]========================================= 1J=RND(1)*4:K=RND(1)*4:T=D(J):D(J)=D(K):IFS=0THENDIMQ$(2):Q$(0)=" #":S=1 -------------------------------------------------- ---- J = RND(1) * 4 // Получаем случайное число от 0 до 3 K = RND(1) * 4 // Получаем еще одно случайное число от 0 до 3 T = D(J) // Используя эти два случайных числа в качестве местоположений, мы меняем местами два числа в нашем массиве направлений. T для температуры? D(J) = D(K) // Обмен еще не завершен. Это происходит на следующей строке. IF S = 0 THEN DIM Q$(2) // Требовалось место для создания этого массива, поэтому использовал оператор IF, предназначенный для однократного запуска. Неинициализированные переменные имеют значение 0 в Applesoft BAS.IC. Q$(0) = "#" // Этот массив предназначен для хранения "графики" для рисования лабиринта. 0=# (стены) S = 1 // Установите S в 1, чтобы этот оператор IF не запускался снова. =============================================== ==== ==[ СТРОКА 2 ]======================================== 2D(K)=T:FORT=0TO3:N=D(T):O=(N=0)-(N=1):P=(N=2)-(N=3):L(1, 0)=Ч:Л(1,1)=В -------------------------------------------------- ---- D(K) = T // Завершить перетасовку направлений FOR T = 0 TO 3 // Повторное использование T для этого цикла FOR N = D(T) // Какое направление проверяем в первую очередь? O = (N = 0) - (N = 1) // Если N равно 0, то это оценивается как 1. Если нет, оно оценивается как 0. Таким образом, если N равно 0, это будет выглядеть как O = 1 - 0 P = (N = 2) - (N = 3) // Если бы N было 3, это выглядело бы как P = 0 - 1. Этот метод дает нам четыре возможных результата для (O,P). (1,0), (-1,0), (0,1), (0,-1) L(1, 0) = H // Устанавливаем первую позицию нашего списка позиций на H,V. L(1, 1) = V // Эти две строки повторяются снова и снова, устанавливая для этой позиции одни и те же X и Y, но это не имеет значения, потому что, если список когда-либо достигнет 0, генератор лабиринта остановится. =============================================== ==== ==[ СТРОКА 3 ]======================================== 3X=L(I,0)+O*2:Y=L(I,1)+P*2:E=1:IFX>39ORX<1ORY>23ORY<1ORG(X,Y)THENE=0 -------------------------------------------------- ---- X = L(I, 0) + O * 2 // O * 2, потому что мы проверяем, сможем ли мы проложить там туннель через два пробела. Y = L(I, 1) + P * 2 // Мы берем X, Y, если верхняя позиция на нашемсписок, затем добавьте смещение O,P, чтобы получить X,Y для проверки E = 1 // Следующий IF был слишком длинным для строки 4, поэтому мы используем E, чтобы телепортировать результат проверки на следующую строку IF X > 39 OR X < 1 OR Y > 23 OR Y < 1 OR G(X, Y) THEN E = 0 // Проверяем X,Y, чтобы убедиться, что они вышли за пределы или G(X,Y) уже имеет туннель (0 = ложь) =============================================== ==== ==[ СТРОКА 4 ]======================================== 4IFETHENT=3:G(X,Y)=1:G(X-O,Y-P)=1:I=I+1:L(I,0)=X:L(I,1)=Y:NEXTT:GOTO1 -------------------------------------------------- ---- IF E THEN T = 3 // Установив T равным 3, следующий NEXT T выйдет из цикла. ЕСЛИ E ложно, Applesoft BASIC пропустит остальные операторы в этой строке. G(X, Y) = 1 // Если мы здесь, то расположение X,Y должно быть удачным. Установите его на 1 (этаж) G(X - O, Y - P) = 1 // Поскольку проверенное нами местоположение X,Y находилось на расстоянии двух пробелов, отступите на один пробел и вырежьте его тоже. I = I + 1 // У нас есть новое допустимое пространство, которое можно добавить в наш список. L(I, 0) = X // Добавляем X индекса пространства I в список. L(I, 1) = Y // Добавляем Y индекса пространства I в список. NEXT T // Мы нашли допустимое пространство для вырезания, и поскольку мы установили T равным 3, теперь мы можем завершить цикл FOR. ПЕРЕХОД 1 // Если мы нашли допустимое пространство, нам нужно проверить его соседей. Давайте сделаем все это снова. =============================================== ==== ==[ СТРОКА 5 ]======================================== 5HTABH:VTABV:?"DIGGING"MID$("-\|/",T+1,1):NEXTT:I=I-1:Q$(1)=" ":IFIGOTO1 ------------------------------------------------------ HTAB H // У меня в этой строке было дополнительное место, VTAB V // поэтому я повторно использовал H и V, чтобы установить местоположение экрана для следующих ? "КОПАНИЕ" MID$("-\|/", T + 1, 1) // ? то же самое, что ПЕЧАТЬ в Applesoft BASIC. Для объединения также не нужны специальные символы. // MID$ использует переменную T для прохождения строки "-\|/" и печатает одну из них после "DIGGING" для выполнения случайной вращающейся анимации. NEXT T // Вся эта строка выполняется, когда проверенное нами направление не показывает допустимого нового местоположения для вырезания. В этом NEXT говорится, что нужно продолжать проверку, пока мы не проверим все четыре направления. I = I - 1 // Если мы не нашли нового направления для резьбы, то отступите на одну позицию назад в списке мест, которые мы посетили. Q$(1) = " " // Просто втиснул это сюда, потому что мне нужно было куда-то его поместить. 1=" " (этаж) IF I GOTO 1 // Если наш индекс не равен 0 (ложь), то у нас все еще есть пробелы для проверки, от которых мы можем разветвиться. =============================================== ==== ==[ СТРОКА 6 ]======================================== 6G(38,22)=2:Q$(2)="X":FORY=1TO23:FORX=1TO40:?Q$(G(X,Y));:NEXTX,Y -------------------------------------------------- ---- G(38, 22) = 2 // Втиснул это сюда. Это локация X, наш выход из лабиринта. Q$(2) = "X" // Последний определяемый тайл. 2=X (выход) FOR Y = 1 TO 23 // Поскольку мы рисуем стену-пространство-стену лабиринта, размер всегда будет нечетным. Итак, максимальная высота 24-1. FOR X = от 1 до 40 // За исключением сохранения кода спаСейчас мы рисуем дополнительную колонну стен... ? Q$(G(X, Y)); // Проверяем число в сетке G и печатаем правильный тайл на экране. // Завершающая точка с запятой сообщает оператору PRINT (?) не переходить к следующей строке после печати. NEXT X, Y // Цикл по строкам и столбцам. =============================================== ==== ==[ СТРОКА 7 ]======================================== 7HTABH-A:VTABV-B:?" ":HTABH:VTABV:?"@":WAIT49152,128:K=PEEK(49152)-128 -------------------------------------------------- ---- HTAB H - A // Нужно стереть игрока из его старого местоположения, поэтому вычитаем смещение. VTAB V - B // Если это первый проход, то это просто 0. ? " " // Рисуем место, где находился игрок. HTAB H // Перемещаем курсор в новое место игрока ВТАБ V // Новая локация игроков. ? "@" // Рисуем игрока. WAIT 49152, 128 // Секретный код Apple для ожидания нажатия клавиши. K = PEEK(49152) - 128 // Получаем нажатую клавишу из буфера клавиатуры. =============================================== ==== ==[ СТРОКА 8 ]========================================= 8A=(K=21)-(K=8):B=(K=10)-(K=11):T=G(H+A,V+B):IFT=0THENA=0:B=0 :?CHR$(7) -------------------------------------------------- ---- A = (K = 21) - (K = 8) // То же, что и в строке 2, только на этот раз мы проверяем, какая клавиша была нажата. B = (K = 10) - (K = 11) // 21,8,10,11 вправо, влево, вниз, вверх. Вы также можете использовать 68,65,83,87 для W,A,S,D. T = G(H + A, V + B) // Узнать, что находится в логекатион, куда мы хотим перейти. IF T = 0 THEN A = 0 // Если это стена (0) B = 0 // тогда мы туда не переедем. ? CHR$(7) // При печати символа 7 издается звуковой сигнал. Вот что вы получите, если врежетесь в стену. =============================================== ==== ==[ СТРОКА 9 ]======================================== 9H=H+A:V=V+B:POKE49168,0:ONT<2GOTO7:?"":?"":"ТЫ СВОБОДЕН!":END -------------------------------------------------- ---- H = H + A // Если A и B были хорошим смещением, то это установит H и V в новые местоположения. V = V + B // Если нет, то они равны 0, поэтому это ничего не дает. POKE 49168, 0 // очищаем буфер клавиатуры и готовимся к дальнейшим нажатиям кнопок игрока. ON T < 2 GOTO 7 // Это было весело. Мне нужен был IF, но для этого потребовалась бы дополнительная строка кода, которой у меня не было. ? "" // Итак, ON GOTO берет список мест, куда нужно перейти (в данном случае только одно), а затем использует номер ? "" // указано после ON для выбора местоположения. В этом случае мы сравниваем, чтобы увидеть, меньше ли T 2. Если это не так, то это означает, что мы достигли выхода. ? "ТЫ СВОБОДЕН!" // Итак, если T равно 0 или 1, то T<2 будет оцениваться как 1, что приведет к переходу к первому местоположению в списке. Если он равен 0 (ложь), END // тогда он пропускает GOTO и просто продолжает выполнять оставшуюся часть строки. Это просто распечатка сообщения о том, что вы свободны, а затем завершение программы. =============================================== ====Как скачать ASCII Maze Game for Apple IIe через торрент
Всего несколько простых шагов:
- Устанавливаем программу μTorrent, через которую мы будем скачивать торренты
- Выбираем и скачиваем подходящий торрент-файл репака ASCII Maze Game for Apple IIe
- Двойным кликом открываем скаченный файл, программа μTorrent запустится автоматически и предложит выбрать место для сохранения дистрибутива.
- После того как репак скачается, запускайте его. Начнется установка и... это все, приятной игры!