Герберт должен собрать все желтые цветы на экране, тогда он
сножет спастн Вильну. Но ему мешают паукн и прочие злобные твари.
Управление - курсорными клавишами. После прохождения одного экрана,
Герберт попадает на следующий, похожий на предыдущий Отличается он
только большим количествон пауков из-за которых пробраться к цветам
и подарить их Вильме становится труднее. .
Эта игра состоит иэ трех файлов: Бейсик-программы - файла
11FP", файла машинных кодов "FPcode"CODE 31766,314 и файла, совмеща-
ющего в себе символьный набор и блок символов UDG-графикн
"FPgraph"CODE 64600,936.
Начинать набор програнмы надо с Листинга_1. Это файл "FP" При
наборе можно, набрав строки 5 и 9990 выполнять периодическую запись
файла иа ленту, командой RUN 5.
Теперь наберите Листинг_2. Это - вспомогательная программа,
предназначенная для генерации кодового блока и формирования блока
UDG-графикн.
После старта вспомогательной программы происходит загрузка
русско-латинского символьного набора, используемого для русифика-
ции, затем начнется формирование кодов Если Вы все набрали пра-
вильно, то после завершения работы программы Вам будут предложены
для записи два кодовых блока, которые надо записать следом за фай-
лом основной Бейсик-программы "FP". На этом компоновка готовой
программы будет завершена Можете загружать ее и запускать.
Лисшинг_1.
1 GO ТО 10
2 CLEAR 31765 LOAD "FPcode"C
ode
3 POKE 23675,88: POKE 23676,2
55: LOAD "FPgraph"CODE 64600
4 RUN
5 GO TO 9990
6 RANDOMIZE USR 15616
7 STOP
"8 POKE 23606,88: POKE 23607,2
51: RETURN
9 POKE 23606,0: POKE 23607,60
RETURN
10 BORDER 0: INK 0: PAPER 0: F
LASH 0 BRIGHT 0 OVER 0. INVERS
E 0: CLS
15 GO SUB 8: LET H=0. RANDOMIZ
E
40 RESTORE 100: INK 4: PLOT 7,
72: DRAW 241,0: DRAW 0,-9: DRAW
-241,0" DRAW 0,8. INK 0
50 PRINT INK 6;AT 7,2;"EF";AT
8,2;"GH";AT 7,28;"EF";AT 8,28;"
GH"; INK 5;AT 16,10; FLASH 1;"УП
РАВЛЕНИЕ: " ; FLASH 0;AT 18,12;"КЛ
АВИШИ";AT 19,10;"ПЕРЕМЕЩЕНИЯ";AT
20,12;"КУРСОРА";AT 21,10;"ИЛИ "
II J II И _ H ■■ g II II II
60 LET A$="
ГЕРБЕРТ ДОЛЖЕН СОБИ
РАТЬ ЦВЕТЫ НА КАЖДОМ ЭКРАНЕ ДЛЯ
СПАСЕНИЯ ВИЛЬМЫ. ЗАДАЧУ ОСЛО
ЖНЯЮТ ГАДКИЕ СУЩЕСТВА, СКИТАЮЩИЕ
СЯ ПО ЭКРАНУ.. НАЖМИТЕ ЛЮБУЮ
КЛАВИШУ ДЛЯ НАЧАЛА ИГРЫ."
70 READ Р: IF Р<0 THEN RESTOR
Е 100: GO ТО 70
80 PRINT INK 3;AT 13,1;А$( Т
О 30): LET А$=А$(2 ТО )+А$(1): I
F INKEYSO"" THEN GO ТО 100
90 ВЕЕР 1,Р: GO ТО 70
100 DATA 0,0,0,0,4,4,4,4,5,7,7,
7,7,7,7,9,11,12,12,7,7,7,9,7,5,4
,4,0,0,0,0,0,0
110 DATA 5,5,9,9,9,9,7,5,4,4,7,
7,7,7,7,7,2,2,5,5,5,5,4,2,4,4,7,
7,7,7,7,7,5,5,9,9,9,9,7,5
120 DATA 4,4,7,7,7,7,9,11,12,12
,7,7,7,9,7,5,4,4.0,0,0,0,0,0,-1
130 LET S=0: LET L=3: LET B=1
140 LET At="0000000000" CLS -
POKE 23560,0: IF L=0 THEN GO TO
20
145 IF B=14 THEN LET B=1
150 FOR N=1 TO 5: PRINT INK 2;
AT* N+4,N+10;A$(N TO 11-N):NEXT N
160 PRINT INK 5;AT 11,12;"KL";
AT 12,12;"MN"
170 PRINT INK 7;AT 11,18;"KL";
AT 12,18;"OP"
180 print ink 6;at 11,15;"ef";
at 12,15;"gh"
190 print ink 3;at 15,1;"спаси
те вилъму...";at 17,15;"экран но
мер ";в;
200 restore 210: for n=1 то 30:
read p. веер .1,р. next n
210 data 0,-2,-3,-3,0,0,0,0,0,0
,2,2,0,0,0,0,-2,-2,-3,-3,0,0,5,5
,5,7,9,9.9,9,9
220 poke 31804,4*b+14: poke 318
97,4*b+14
230 let a-32080: for f-l to в
240 let x=int (rnd*3)-1: let y=
int (rnd*3)-1: if x-0 or y-0 the
n go to 240
250 for n=0 to 30 step 10: poke
a+n,144+(n/10): poke a+1+n.2: p
оке a+3+n,x: poke a+7+n,y:next n
260 let x-int (rnd*12)+3: let y
-int (rnd*20)+3
270 for n=0 to 10 step 10: poke
a+2+n,x: poke a+22+n,x+l: poke
a+6+(n*2),y: poke a+16+(n*2),y+l
280 poke a+4+n,2: poke a+24+n,3
: poke a+5+n,16: poke a+25+n.17
290 poke a+8+(n*2),2: poke a+18
+(n*2),3: poke a+9+(n«2),23: рок
e a+19+(n*2),24: next n
300 let a—a+40" next f. cls
310 print ink 6;at 0,0;"£f";at
1,0;"gh";at 18,0;"£f";at 19,0;"
gh";at 0,25;"ef";at 1,25;"gh";at
18,25;"ef";at 19,25;"gh"
320 for n-0 to 18 step 3: print
ink 4;at n,28;"e";at n+1,28;"s
": next n: print ink 4;at 3,1;"
e";at 4,1;"s";at 15,1;"r";at 16,
1; "g"
330 let x=9: let y-0: let d=0:
let f=0
340 let ox=x: let oy-y
350 print at 0,0;: randomize us
r 31766
360 let k=peek 23560
370 let x=x+((k=10 or k-54) and
x<18)-((k=11 or k=55) and x>0)
380 let y=y+((k-9 or k=56) and
y<30)-((k=8 or k—53) and y>0)
400 go sub 440: if d=1 then go
to 140
410 print at ox,oy;" ";at ox+1
,oy;" "; ink 5;at x,y;"kt":at x
+1,y;"mn"
420 print ink 6;at 20,0;"c4et:
";s;at 20,25;"жизни:";l;at 20,10
;"макс.счет:";h
430 go to 340
440 if (attr (x,y+l)=0 or attr
(x,y+l)-0 or attr (x.y+1j-5) and
(attr (x+l,y)-0 or attr (x+1,y)
=5) and (attr (x+l,y+l)-0 or att
r (x+l,y+l)=5) then return
450 if attr (x,y)-7 or attr (x,
y+1j-7 or attr (x+l,y)=7 or attr
(x+l,y+l)=7 then go to 540
460 if attr (x,y)=6 or attr (x,
y+l)=6 or attr (x+l, y)=6 or attr
(x+l, y+l) -6 then go to 490
470 if attr (x,y)<5 or attr (x,
y+l)<5 or attr (x+l,y)<5 or attr
(x+l,y+l)<5 then go to 560
480 return
490 let u=(x>16)*18: let i=(y>2
3)»25
500 for n-6 to 0 step -1: print
ink n;at u,i;"ef";at u+1,i;"gh
": beep .01,20-n: next n
510 let s-s+10: let f=f+1: if f
<4 then return
520 print at 9,28;" ";at 10,28;
" ": beep .1,-20: beep .01,50
530 RETURN
540 FOR N=0 TO 20: BEEP .005,N:
NEXT N
550 LET S=S+100: LET B=B+1: GO
TO 140
560 PRINT AT OX, OY; " " ;AT OX+1
,OY;" "; INK 7;AT X,Y;CHR$ 141;
CHR$ 142;AT X+l,Y;CHRS 133;CHRS
138
570 BEEP 4,0 BEEP 4 0 BEEP
.2,0: BEEP .4,0: BEEP .4,2: BEEP
.2,1: BEEP .4,1: BEEP .2,0: BEE
. P .4,0: BEEP .2,-1: BEEP .B,0
590 LET L-L-l: IF L>0 THEN LET
D=l: RETURN
600 IF S>H THEN LET H=S
610 LET D=l: RETURN
9990 SAVE "FP" LINE 2
9999 BORDER 7: PAPER 7: INK 0
Листинг 2.
10 BORDER 0: INK 7: PAPER 0: F
LASH 0: BRIGHT 0: OVER 0: INVERS
E 0: CLS : CLEAR 31765: POKE 236
75,88: POKE 23676,255
15 LOAD "chr "CODE 64600
20 DEF FN H(A$)=16*(CODE A$(N)
-48- ( 7 AND A$ (N)>,,9" ) ) +CODE A$(N
+1)-48-(7 AND AS(N+l)>"9")
30 FOR L=80 TO 220 STEP 10: PR
INT "Line: ";L;: READ A.C.AS: LE
T T=0
40 FOR N=1 TO LEN AS STEP 2
50 POKE A,FN H(AS): LET T=T+FN
H(AS } : LET A=A+1: NEXT N
60 IF CoT THEN BEEP .1,50: P
RINT TAB 10;"ERROR:";TAB 17;"Tot
al:";T'TAB 17;"Check:";C: STOP
70 PRINT : NEXT L
80 DATA USR "A",4164,"04242323
9389671F2024C4C4C991E6F8374F9DAE
ADAF2702ECF2B975B5F5E440"
90 DATA USR "E",3716,"03070707
3B7D7E7EC0E0E0E0DCBE7E7E7D3B0F17
274 3800OBEDCEOEOEOCOO000"
100 DATA USR "К",1059,"070F1832
20242330E0F0184C0424C4ОС"
110 DATA USR "M",1758,"1F100908
0F7181FFF8089010F08E81FF"
120 DATA USR "O",2028,"FFF04908
0F31437DFF0F9210F08CC2BE"
130 DATA USR "Q",533,"00367F7F7
F3E1C08"
140 DATA USR "R" , 1863 , " 083C6BD6
6A57EA566B56FF817E42427E"
150 DATA USR "T",1373,"1CI4ICO5
063C7EFF382838A060387EFF"
160 DATA 31803,6793,"060E21C47C
2323 3E10D7 3E00D7 3E16D77ED74F237E
814F237EB920052B3601180D237EB920
062B2B36FF18022B2B2B712 32323237E
D74F3E20D7237E814F23 7EB920052B36
01180D237EB920062B2B36FF18022B2B
2B712323232310A8"
170 DATA 31896,3582,"060E21C47C
3E10D7237ED73E16D7237ED723232323
7ED72B2B2B2B2B2B7ED7232323232323
2323232310DAC9"
180 DATA 31940,1372,"A303010000
0002010217A4 030100000003 010318A3
031200000017FF0217A4031200000018
FF0318"
190 DATA 32040,1376,"A303000001
0117FF0217A4030000010118FF031ВАЗ
031300000002010217A4031300000003
010318"
200 DATA 319B0,858,"9A070001001
21EC000009B070D0100121F0000009E0
701C101131E0000009F07010101131F0
00000"
210 DATA 32020,428,"A3030201021
119000000A403020102111A000000"
220 DATA 31766,2100,"061921227C
7ED72310FB1819161508100511014259
204 9414E20442E424952445345591100
M
230 PRINT ""-PRESS ANY KEY TO
SAVE THE CODE-"
240 IF INKEYJ-"" THEN GO TO 240
250 SAVE"FPeode"CODE 31766,314
260 SAVE"FPgraph"CODE 64600,936
Комментарии по работе основной Бейсик-программы.
Автостарт программы происходит со строки 2, после чего загру-
жаются два блока кодов, необходимые для игры. О них говорилось вы-
пге. После завершения загрузки происходит старт программы сначала.
После прорисовки титульного экрана с указанием клавишей управ-
ления, в "бегущей строке" выводится текст, поясняющий игровую ситу-
ацию Текст этот задан в стринговой переменной А$. Вывод этого
текста на экран сопровождается мелодией, которая закодирована при
помощи DATA в строках 100...120. Вывод текста и мелодии выполняется
строками 70...90.
При нажатии на любую клавишу, что проверяется в строке во,
происходит переход на строку 100 - начало игры.
Строка 130 задает начальные значения переменным. Счет - S,
жизни - L, игровой экран - В (или уровень сложности).
Строки 150...210 обеспечивают вывод заставки перед непосредс-
твенным началом игры, здесь указывается текущий номер экрана.
Строки 220.. 340 выполняют прорисовку игрового экрана и подго-
товку исходных параметров перед стартом кодового блока. Он происхо-
дит в строке 350.
Программа в машинных кодах отрабатывает перемещение разных
объектов, мешающих основному персонажу - нашему старому знакомому
Герберту нарвать букет цветов для спасения Вильны.
В строке 360 проверяется факт нажатия клавишей. Код последней
нажатой клавншн запоминается в систенной переменной LAST_K, распо-
ложенной по адресу 23560. Опрашивая эту ячейку, программа выполняет
действия по перемещению основного персонажа. Особенность такого
способа заключается в том, что нажав клавишу один раз, например,
вправо, можно отпустить ее: начнется движение объекта вправо. Код в
ячейке 23560 сохраняется до тех пор, пока не будет нажата другая
клавиша.
Анализ кода происходит в Бейсик-строках 370, 380. Здесь проис-
ходит расчет новых координат для изображения Герберта.
Для того, чтобы остановить объект, который начал движение, на-
до нажать любую другую клавишу, например, "пробел". Теперь в ячейке
23560 будет другой код и перемещения не будет.
Другая особенность такого способа опроса клавишей заключается
в том, что невозможно получить эффект перемещения персонажа по-диа-
гонали, так как код в ячейке 23560 может быть только один.
Факт столкновения Герберта с различными объектами анализирует-
ся по атрибутам тех знакомест, в которых он должен быть нарисован.
Это проверяется подпрограммой GO SUB 440 (вызывается в строке 400).
Еслн цвет черный (в этом месте ничего нет), то просто возврат из
подпрограммы
Если цвет - белый, это означает, что Герберт "нашел" Вильну
(она от страха белого цвета). В этом случае строка 450 переводит
программу на строку 540.
Если цвет - желтый, это значит, что Герберт нашел цветок, на
экране он желтого цвета. В этом случае строка 460 переводит на
строку 490
Если цветовой атрибут меньше 5, это означает столкновение Гер-
берта с гадкими врагами. В этом случае следует переход со строки
470 на строку 560.
После возврата из подпрограммы 440 игровой цикл повторяется.