Fishie - Keep the sea plastic free by Marco's Retrobits
FISHIE - СОХРАНИТЕ МОРСКОЙ ПЛАСТИК!
Базовый экшен 10 Liner для Sinclair ZX Spectrum
Марко Варезио (Marco's Retrobits): https://retrobits.itch.io
Блог на английском языке: https://retrobits.altervista.org
Блог на итальянском языке: https://somebitsofme.altervista.org
Канал YouTube: https://www.youtube.com/channel/UCWTxG8paNsOUEU5mPcNklXA
Скачать/играть онлайн: https://retrobits.itch.io/fishie
Видео игрового процесса:
"Рыбка – очистите море от пластика!" это небольшая игра с большим экологическим посылом.
Помогите Рыбке очистить море от пластиковых отходов, ловя пузырьки кислорода, которые появляются из воды, прежде чем они лопнут.
Каждый раз, когда вы ловите пузырь, мусор на той же линии исчезает, а Рыбка получает очко.
Контакт с пластиковыми отходами вреден и может привести к потере одной жизни.
"Рыбка – очистите море от пластика!" написан на языке BASIC для домашнего компьютера Sinclair ZX Spectrum
и это мое (второе) участие в 11-м выпуске (2022 г.) конкурса BASIC 10 Liner Contest (http://basic10liner.com/), категория PUR-80.
ОПИСАНИЕ ИГРЫ
При запуске программы отображается титульный экран.
Вы можете начать игру, нажав любую клавишу.
Маленькая желтая рыбка в левой части экрана — это Фиши, наш герой.
Вы можете заставить рыбку плавать вверх, вниз, влево или вправо, нажимая клавиши e, d, o или p соответственно.
Пластиковые отходы появляются изa, в правой части экрана, и отталкивается волнами влево.
При соприкосновении с мусором он исчезнет, но Рыбка потеряет жизнь, поэтому задерживаться в левой части экрана особенно опасно.
К счастью, из воды тоже выходят пузырьки кислорода.
Каждый раз, когда Рыбка ловит пузырь, мусор на той же линии исчезает, а вы получаете очко.
Вы должны добраться до пузырей как можно быстрее, потому что движение волн заставит их лопнуть.
По ходу игры кислородные пузыри будут появляться все реже и реже, что усложнит задачу Фиши.
В нижней части экрана отображается полезная информация, такая как ваш текущий счет, наивысший результат, количество оставшихся жизней и краткое описание элементов управления игрой.
ОПИСАНИЕ ПРОГРАММЫ
Переменные
h: высокий балл
s: Текущая оценка
l$(20,32): массив из 20 строк; каждая строка имеет длину 32 символа и представляет собой строку в игровой области
e$: "Пустая" строка, т.е. строка с 32 пробелами
i: Итератор цикла
a: используется как временная переменная и как флаг, указывающий на столкновение между Fishie и кислородным пузырем
b: Флаг, указывающий на столкновение между Fishie и пластиковыми отходами
x: Горизонтальное положение Fishie (номер столбца)
y: вертикальная позиция Fishie (номер строки)
f: Осталось жизней
p: Вероятность появления пузырьков кислорода
l: Линия внешнего вида пластиковых отходов
c: Пласстолбец внешнего вида отходов
k: код нажатой клавиши
s$: символ на экране в позиции Фиши (используется для обнаружения столкновений)
Список программ
1 РАМКА 5:БУМАГА 1:ЧЕРНИЛА 5:ПУСТЬ h=0:ПУСТЬ s=0:DIM l$(20,32):ПУСТЬ e$="":ВОССТАНОВИТЬ 9:ДЛЯ i=65368TO65375:ПРОЧИТАТЬ a:ПОК i, a:LET e$=e$+" ":NEXT i 2 CLS:LET x=5:LET y=11:LET f=3:LET p=.9:FOR i=1TO20:LET l$(i)=e$:NEXT i:PRINT AT 10,13;"FISHIE ":GO SUB 10:PAUSE 0:LET s=0:CLS:GO SUB 10 3 LET l=1+INT(RND*20):LET c=23+INT(RND*10):LET c$=CHR$(35-(l=y)*(c=x)*3) 4 ПУСТЬ l$(l)=l$(l,2 TO c)+c$+l$(l,c+1 TO):ПУСТЬ k=CODE(INKEY$):ЕСЛИ k=0, ТОГДА ПЕРЕЙТИ К 6 5 НАПЕЧАТАЙТЕ y,x;" ":LET y=y-(k=101)*(y>1)+(k=100)*(y<20):LET x=x+(k=112)*( х<31)-(к=111)*(х>0) 6 PRINT INK 3;AT l,0;l$(l):IF RND0):BEEP .02+.4*b,15-30*b:ГРАММА 5
9 ПЕЧАТЬ В y,x;INK 6;CHR$(32+112*(f<>0)):ПЕРЕХОД К 3-(f=0):ДАННЫЕ 32,28,190,251,255,190,28,32
10 LET h=s*(s>=h)+h*(s
который преобразует листинг BASIC в текстовом файле ASCII в образ ленты эмулятора .TAP.
В частности, "{A}" означает первое использованиеr определенный графический символ с кодом 144 (0x90), который был определен как символ рыбы.
Объяснение исходного кода
Инициализация программы
Строка 1 выполняется только один раз, когда программа запускается и выполняет инициализацию экрана, переменных и пользовательских графических символов.
Цикл FOR инициализирует первый графический символ UDG изображением рыбы, используя DATA в строке 9.
1 РАМКА 5:БУМАГА 1:ЧЕРНИЛА 5:ПУСТЬ h=0:ПУСТЬ s=0:DIM l$(20,32):ПУСТЬ e$="":ВОССТАНОВИТЬ 9:ДЛЯ i=65368TO65375:ПРОЧИТАТЬ a: POKE i,a:LET e$=e$+" ":NEXT i
Инициализация игры
Строка 2 выполняется каждый раз при запуске новой игры. Он очищает экран, выполняет некоторые другие инициализации, отображает титульный экран и ожидает нажатия клавиши.
В частности, 20 строк в l$ инициализируются пробелами с помощью e$.
2 CLS:LET x=5:LET y=11:LET f=3:LET p=.9:FOR i=1TO20:LET l$(i)=e$:NEXT i:PRINT AT 10,13 ;"FISHIE":GO SUB 10:PAUSE 0:LET s=0:CLS:GO SUB 10
Совет по взлому: вы можете усложнить игру, установив p (вероятность образования пузырьков кислорода) на более низкое значение.
Вы также можете изменить количество доступных жизней, инициализировав f другим значением.
Игровой цикл
Строка 3 случайным образом выбирает позицию (строка l, столбец c), где могут появиться пластиковые отходы.
c$ хранит символ, который будет отображаться в выбранной позиции: если выбранная позиция перекрывается с позицией Fishie, c$ будет установлен на пробел (код 32), иначе будет установлен символ, используемый для отходов ("#", код 35).
Я бы предпочел использовать графический символ для отходов, но это вызывает проблемы с функцией SCREEN$, используемой в строке 7 для обнаружения столкновений, поэтому я выбрал символ "#".
3 LET l=1+INT(RND*20):LET c=23+INT(RND*10):LET c$=CHR$(35-(l=y)*(c=x)*3 )
В строке 4 выполняются некоторые манипуляции со строками, чтобы имитировать волну в строке l: строка частично сдвигается влево, а символ c$ вставляется в столбец c.
Затем проверяется ввод данных пользователем, и если никакая клавиша не нажата, программа переходит к строке 6.
4 ПУСТЬ l$(l)=l$(l,2 TO c)+c$+l$(l,c+1 TO):LET k=CODE(INKEY$):IF k=0 THEN GO ДО 6
Строка 5 выполняется только при нажатии клавиши. Рыбка удаляется с экрана, печатая пробел, а новая позиция нашего героя (x, y) вычисляется на основе кода нажатой клавиши.
5 НАПЕЧАТАЙТЕ AT y,x;" ":LET y=y-(k=101)*(y>1)+(k=100)*(y<20):LET x=x+(k=112) )*(х<31)-(к=111)*(х>0)
Совет по взлому: элементы управления (вверху: клавиша "e", код символа: 101; внизу: клавиша "d", код символа: 100; вправо: клавиша "o", код символа 112; влево: клавиша "p" , код символа: 111) выбраны таким образом, чтобы они находились в одном и том же положении на наиболее распространенных раскладках клавиатуры (QWERTY, AZERTY, QWERTZ).
Вы можете настроить различные элементы управления, изменив [коды символов](https://worldofspectrum.org/ZXBasicManual/zxmanappa.html) в строке 5.
Строка 6, печатает строку l, измененную в line 4. Затем с вероятностью p в случайном месте печатается кислородный пузырек (символ "o").
6 PRINT INK 3;AT l,0;l$(l):IF RND
Строки 7 и 8 обрабатывают обнаружение столкновений. Во-первых, s$ устанавливается на символ, который в данный момент находится в позиции Fishie на экране.
Если Фиши попадает в кислородный пузырь "o", a устанавливается равным 1, b устанавливается равным 0, счет s увеличивается, а вероятность кислорода p уменьшается (в определенных пределах).
В противном случае, если Рыбка наткнется на пластиковый мусор "#", значение a будет равно 0, значение b будет равно 1, а количество жизней f будет уменьшено.
7 LET s$=SCREEN$(y,x):LET a=(s$="o"):LET b=(s$="#"):LET s=s+a:LET f= f-b:ЕСЛИ а, ТО ПУсть p=p-.01+.01*(p<.15)
Если обнаружено столкновение, соответствующая строка на экране очищается (заменяется пробелами) и информация об игре, отображаемая на экране, обновляется. Цвет ГРАНИЦЫ и звуковой сигнал сообщат, набрал ли игрок очко или потерял жизнь.
8 ЕСЛИ a+b ТО ПУСТЬ l$(y)=e$:ПЕЧАТЬ AT y,0;l$(y):GO SUB 10:BORDER (a*4+b*2)*(f>0 ):ЗВУК.02+.4*b,15-30*b:ГРАНИЦА 5
В строке 9, если игра не окончена (количество жизней f все еще больше 0), Fishie печатается в ранее рассчитанной позиции (x, y), а затем программа переходит к началу игрового цикла в точке строка 3 для следующей итерации; в противном случае программа переходит на строку 2.
Строка 9 также содержит ДАННЫЕ для изображения рыбы.
9 ПЕЧАТЬ НА y,x;ЧЕРНИЛА 6;CHR$(32+112*(f<>0)):ПЕРЕХОД 3-(f=0):ДАННЫЕ 32,28,190,251,255,190,28,32
Подпрограмма печати статуса игры
Подпрограмма в строке 10 проверяет, является ли текущий счет s новым рекордом, и соответствующим образом обновляет h.
Затем в нижней части экрана отображается счет, рекорд, количество жизней и краткое описание элементов управления игрой.
10 LET h=s*(s>=h)+h*(s Подтверждение длины строк программы Заменив каждый BASIC-токен одним символом и удалив лишние пробелы, каждая строка в итоговом исходном коде не превысит ограничение в 80 символов: 1b5:C1:X5:lh=0:ls=0:dl$(20,32):le$="":S9:fi=65368F65375:Aa:oi,a:le$=e$+" ":ни 2v:lx=5:ly=11:lf=3:lp=.9:fi=1F20:ll$(i)=e$:ni:pI10,13;"FISHIE":h10:m0:ls =0:v:h10 3ll=1+R(T*20):lc=23+R(T*10):lc$=U(35-(l=y)*(c=x)*3) 4ll$(l)=l$(l,2 Fc)+c$+l$(l,c+1 F):lk=I(XEY$):uk=0 Gg6 5pIy,x;" ":ly=y-(k=101)*(y>1)+(k=100)*(y<20):lx=x+(k=112)*(x< 31)-(к=111)*(х>0) 6pX3;Il,0;l$(l):uT
7ls$=K(y,x):la=(s$="o"):lb=(s$="#"):ls=s+a:lf=f-b:ua Glp=p- 0,01+0,01*(p<0,15) 8ua+b Gll$(y)=e$:pIy,0;l$(y):h10:b(a*4+b*2)*(f>0):Z.02+.4 *б,15-30*б:б5 9pIy,x;X6;U(32+112*(f<>0)):g3-(f=0):D32,28,190,251,255,190,28,32 10lh=s*(s>=h)+h*(s Поэтому, "Рыбка - Освободите море от пластика!" подходит для категории PUR-80 of BASIC 10 Liner Contest (https://basic10liner.com).
Как скачать Fishie - Keep the sea plastic free by Marco's Retrobits через торрент
Всего несколько простых шагов:
- Устанавливаем программу μTorrent, через которую мы будем скачивать торренты
- Выбираем и скачиваем подходящий торрент-файл репака Fishie - Keep the sea plastic free by Marco's Retrobits
- Двойным кликом открываем скаченный файл, программа μTorrent запустится автоматически и предложит выбрать место для сохранения дистрибутива.
- После того как репак скачается, запускайте его. Начнется установка и... это все, приятной игры!