Применение New Supercode
Пакет New Supercode создан по образу и подобию Supercode и содержит 50 подпрограмм в машинных кодах, большинство из которых не имеет аналогов в Supercode.
После загрузки вы увидите список процедур (меню), из 50 строк, каждая из которых вызывает определенную подпрограмму и имеет вид:
33 ATTR CODE 48976,29
где слева направо расположены: номер кодовой подпрограммы, ее название, слово CODE, означающее принадлежность к кодовому типу,
начальный адрес и длина программы в байтах. Нижняя часть меню даст информацию об управлении строками.
Выбор нужной строки осуществляется с помощью стрелки курсора, перемещаемой клавишами б (вниз) и 7 (вверх), а для того, чтобы воспользоваться процедурой, следует нажать Enter. При этом на экран будет выведена краткая инструкция о выбранной подпрограмме. Нажатие клавиши D (DEMO) позволит посмотреть, как действует подпрограмма, а S (SAVE) - записать ее на ленту или дискету. Возврат в меню происходит при нажатии клавиши Т.
Игровая программа «Звездная война»
Покажем теперь, как можно использовать кодовые подпрограммы на примере игры «Звездная война». Но прежде, чем мы начнем говорить об игре, перепишем из комплекта NEW Supercode на магнитную ленту или дискету четыре следующих подпрограммы: LITERY, DZWIEK2, DZWIEK3 и EKRAN 2. О том, что они из себя представляют и какие функции выполняют в игре, мы расскажем при описании строк программы, а сейчас несколько слов о самой программе и о том, что произойдет после ее запуска.
Загрузив программу и выполнив оператор RUN, вы сразу увидите действие одной из кодовых подпрограмм: на экране появятся буквы необычных размеров и форм. Налюбовавшись названием игры, нажмите любую клавишу - раздастся характерный звук летящего снаряда и затем взрыва. Очень эффектно! Далее следует традиционная информация об управляющих клавишах и, наконец, возникает звездное небо, на фоне которого передвигается космический корабль противника. Здесь же окажется перекрестье прицела вашего лазера (рис. 9.2). Чтобы убедиться в его исправности, нажмите М, появятся два грозных луча, и вы услышите звук выстрела, созданный третьей кодовой подпрограммой.
Теперь возникает типичная игровая ситуация: вы должны, передвигая прицел, совместить его с вражеским кораблем и нажать М. При попадании раздастся грохот взрыва, а на экране возникнет хаотическая картинка, созданная кодовой подпрограммой EKRAN 2. После этого игра возвращается к своему началу.
Программа 33. ЗВЕЗДНАЯ ВОЙНА.
10 CLEAR 46945 12 POKE 23658,8 15 BORDER 0: PAPER 0: INK 7 20 CLS
30 GO SUB 7000
40 GO SUB 7100 50 CLS
60 LET y=0: LET xs=3: LET ys=20: LET d$="SPACE WAR":INK 2: BRIGHT 1: GO SUB 7200 70 LET y=160: LET xs=1: LET ys=2: LET d$="PRESS ANY KEY TO START": INK 6: GO SUB 7200 80 IF INKEY$="" THEN GO TO 80 90 BRIGHT 0
100 RANDOMIZE USR 59366 110 BORDER 0
120 REM -------------
125 CLS
130 LET d$="O-LEFTПППP-RIGHT": LET y=10: LET xs=2:LET ys=5: GO SUB 7200 140 LET d$="Q-UPПППППA-DOWN ": LET y=60: LET xs=2:LET ys=5: GO SUB 7200 150 LET d$="M-FIRE": INK 2: LET y=110: LET xs=4: LET ys=5:GO SUB 7200 160 IF INKEY$="" THEN GO TO 160
170 REM -----------
172 LET s=0: LET sh=0
175 INK 7: CLS : OVER 1
176 FOR N=1 TO 200: PLOT RND*255,RND*175: NEXT N
177 PRINT AT 10,15;"E"
179 INK 3: PLOT 0,0: DRAW 0,175: DRAW 255,0: DRAW 0,-175: DRAW -255,0
180 LET zx=INT (RND*30): LET zy=INT (RND*20)
185 LET zx1=zx: LET zy1=zy
186 PRINT AT zy,zx;"AB": PRINT AT zy+1,zx;"CD" 190 LET px=15: LET py=10
195 LET px1=px: LET py1=py 197 LET f=0
200 IF INKEY$="P" THEN LET px=px+1: GO TO 300 210 IF INKEY$="0" THEN LET px=px-1: GO TO 300 220 IF INKEY$="Q" THEN LET py=py-1: GO TO 300 230 IF INKEY$="A" THEN LET py=py+1: GO TO 300 240 IF INKEY$="M" THEN LET f=1: GO TO 300 250 GO TO 400 300 REM ------------
310 IF px<0 OR px>31 OR py<0 OR py>21 THEN LET px=px1:LET py=py1: GO TO 400 315 INK 7
320 PRINT AT py1,px1;"E" 330 INK 5: PRINT AT py,px;"E" 340 LET px1=px: LET py1=py
345 IF f=1 THEN INK 2: PLOT 0,0:DRAW px*8+4,172-(py*8): PLOT 255,0: DRAW -(253-px*8),172-(py*8): RANDOMIZE USR 59342: INK 7: PLOT 0,0: DRAW px*8+4,172-(py*8): PLOT 255,0: DRAW -(253-px*8),172-(py*8)
350 IF f=1 AND ((zx=px AND zy=py) OR (px=zx+1 AND py=zy) OR (px=zx AND py=zy+1) OR (px=zx+1 AND py=zy+1)) THEN RANDOMIZE USR 59366: GO TO 1000 360 IF f=1 THEN LET f=0 400 REM ------------
410 IF s=sh THEN LET s=0: LET sh=INT (RND*5+4): LET prx=SGN (RND*2-1): LET pry=SGN
(RND*2-1)
420 LET s=s+1
422 LET zx=zx+prx: LET zy=zy+pry
425 IF zx<1 OR zx>29 OR zy<1 OR zy>19 THEN LET zx=zx1: LET zy=zy1: GO TO 200 440 INK 7
450 PRINT AT zy1,zx1;ПП"АБ" 460 PRINT AT zy1+1,zx1;"CD" 470 INK 6: PRINT AT zy,zx; "AB" 480 PRINT AT zy+1,zx;"CD" 490 LET zx1=zx: LET zy1=zy 500 GO TO 200
1000 REM ------------
1010 PAPER 0: BORDER 0: CLS 1015 FOR M=1 TO 10
1020 FOR N=1 TO 250 STEP 40: POKE 57399,N: RANDOMIZE USR 57392: NEXT N
1030 NEXT M
1040 GO TO 50
7000 REM -Graphics-
7010 FOR n=0 TO 39
7020 READ s
7030 POKE USR "A"+n,s
7040 NEXT n
7050 DATA 0,64,64,64,35,39,39,30 7060 DATA 0,2,2,2,196,228,228,120 7070 DATA 30,39,39,35,64,64,64,0 7080 DATA 120,228,228,196,2,2,2,0 7090 DATA 16,16,16,238,16,16,16,0 7095 RETURN
7100 REM -- LOAD code --7110 INK 0: PAPER 0: PRINT AT 0,0; 7120 LOAD ""CODE
7122 INK 7: LET d$="LOADING": LET y=50: LET xs=2: LET ys=10: GO SUB 7200
7123 LET d$="PLEASE WAIT": LET y=130: LET xs=2: LET ys=1:INK 3: GO SUB 7200 7130 INK 0: PRINT AT 0,0;: LOAD ""CODE
7140 PRINT AT 0,6;: LOAD ""CODE 7145 PRINT AT 0,0;: LOAD ""CODE 7150 RETURN
7200 REM -- Litery --7210 LET x=(256-xs*8*LEN d$)/2 7220 LET a=23306: POKE a,x 7230 POKE a+1,y: POKE a+2,xs 7240 POKE a+3,ys: POKE a+4,8 7250 LET a=a+4 7260 FOR i=1 TO LEN d$ 7270 POKE a+i,CODE d$(i) 7280 NEXT i 7290 POKE a+i,255
7295 RANDOMIZE USR 59033
7296 RETURN 7300 REM --10. - установка RAMTOP;
12 - включение курсора больших букв;
30 - обращение к подпрограмме ввода графических символов: для корабля - 4, для прицела - 1;
40 - обращение к подпрограмме, загружающей с ленты четыре кодовые блока: LITERY, DZWIEK2, DZWIEK3, EKRAN 2;
60 - эта часть программы выводит на экран название игры, сформированное с помощью кодовой подпрограммы LITERY. Здесь у - верхняя граница выводимых букв, измеряемая в пикселях, начиная от верхнего края экрана; xs - их ширина в знакоместах; ys - высота букв в знакоместах. В символьной переменной d$ задается текст, который требуется вывести;
70 - то же, что и в строке 60, но для текста
PRESS ANY KEY TO CONTINUE
80 - ожидание нажатия любой клавиши;
100 - с помощью кодовой подпрограммы DZWIEK3, вызываемой оператором
RANDOMIZE USR 59366
создается звуковой эффект, имитирующий полет снаряда и его взрыв; 110 - восстановление цвета бордюра после действия предыдущей подпрограммы;
130...150 - вывод на экран текста, поясняющего функции клавиш;
160 - ожидание нажатия любой клавиши;
172 - установка начальных значений переменных: s - счетчик шагов перемещений корабля, sh - указатель количества этих шагов;
176 - создание на экране рисунка звездного неба. Оператор RANDOMIZE в начале строки восстанавливает счетчик случайных чисел после обращения к подпрограммам в машинных кодах;
177 - установка прицела в средней части экрана;
179 - вывод на экран рамки, ограничивающей игровое поле;
180 - вычисление случайным образом начальных координат корабля;
185 - ввод дополнительных координат корабля, в которых будут сохраняться предыдущие их значения;
186 - вывод на экран силуэта космического корабля;
190 - ввод начальных координат прицела, которые при его перемещении потребуются для операций стирания;
197 - вводится переменная f, соответствующая текущему положению кнопки Огонь, причем в данном случае кнопка считается не нажатой (f = 0);
200...240 - эта группа операторов обеспечивает управление прицелом;
310 - ограничения на перемещения прицела;
320 - закраска белым цветом «старого» прицела при его перемещении по экрану (напомним, что был установлен режим OVER 1);
330 - голубым цветом изображается «новый» прицел;
340 - запоминание координат, необходимое для того, чтобы их можно было восстановить, если они выйдут за пределы игрового поля;
345 - проверка условия, был ли сделан выстрел. Если да, то устанавливается красный цвет «чернил» и рисуются два лазерных луча, а с помощью кодовой подпрограммы DZWIEK2 воспроизводится звук выстрела. После выстрела устанавливаются белые «чернила» и на месте лазерных лучей рисуются две линии белого цвета;
350 - если была нажата клавиша Огонь, и есть попадание в одно из четырех знакомест, обозначающих корабль, то включается кодовая подпрограмма DZWIEK3, которая формирует взрыв, а затем осуществляется переход на подпрограмму 1000... 1040, которая уничтожает все экранное изображение и создается процедурой EKRAN 2;
360 - если попадания нет, то переменной ОГОНЬ присваивается нулевое значение;
410 - если перемещение, которое сделал корабль, равно установленному ранее, то для следующего прохода S устанавливается равным 0, а переменной sh присваивается случайное значение в диапазоне от 4 до 8;
420 - увеличение счетчика на единицу;
422 - к текущим координатам корабля прибавляются приращения;
425 - проверка, не вышел ли корабль за границы игрового поля экрана;
440 - установка цвета вывода символов (белый);
450, 460 - вывод на экран изображения корабля, заданный старыми координатами;
470, 480 - установка цвета символов (желтый) и вывод на экран изображения корабля, заданного новыми координатами;
490 - изменение значений координат;
500 - безусловный переход к блоку управления прицелом;
1000... 1040 - подпрограмма, имитирующая уничтожение корабля противника. На экране мелькают хаотические пятна, созданные в двух циклах при участии
кодовой подпрограммы EKRAN 2, запускаемой оператором
RANDOMISE USR 57392
Перед ее использованием в ячейку 57399 заносится число в диапазоне от 0 до 255;
7000...7095 - подпрограмма определения графических символов, из которых четыре используются для изображения космического корабля, а один для создания перекрестья прицела;
7100...7150 - подпрограмма загрузки кодовых подпрограмм. Сначала грузится подпрограмма LITERY, затем на экран выводится фраза LOADING, PLEASE WAIT
после чего загружаются DZWIEK3, DZWIEK2 и EKRAN 2;
7200... 7296 - подпрограмма вывода на экран различных текстов, сформированных с помощью кодовой подпрограммы LITERY. При этом координату у необходимо задать заранее, а координату х определять заранее не нужно, так как подпрограмма сама выравнивает текст по центру экрана. Размеры букв по горизонтали - xs и вертикали ys задаются заранее. И, конечно же, необходимо ввести сам текст. Запуск программы осуществляется оператором RANDOMISE USR 59033