П р и м е р [76]. Предположим, что Вы управляете космическим кораблем, ──────────────── который может перемещаться вверх и вниз. Вы можете обстреливать появившийся вражеский корабль, который также стреляет по Ва- шему кораблю. Программа структурирована таким образом, что возможны лишь следующие столкновения спрайтов: α) вражеский корабль с Вашим снарядом; β) Ваш корабль с вражеским снарядом; γ) вражеский снаряд с Вашим снарядом. При попадании в цель вражеского снаряда Ваш корабль гибнет, и игра пре- кращается; если же Вам удается одним из своих снарядов поразить противни- ка - Ваш счет увеличивается. Игры такого типа безжалостно обнажают серьезную слабость языка BASIC: это весьма "м е д л е н н ы й" язык.Спрайты позволяют несколько увеличить скорость выполнения программы, но ясно,что без машинных кодов обойтись не удастся! 70 DEFINT A-Z:OPEN"GRP:"AS#1:DIM M(100):DIM T(7) 110 R=RND(-TIME) 120 ON STRIG GOSUB 1000 130 ON SPRITE GOSUB 1250 140 ON INTERVAL=10 GOSUB 1110 150 ON SPRITE GOSUB 1250 160 COLOR 15,1,1:SCREEN 2,0,0 190 'Начальная установка спрайтов 210 FOR I=0 TO 3 220 S$="" 230 FOR J=1 TO 8:READ S:S$=S$+CHR$(S):NEXT J 260 SPRITE$(I)=S$ 270 NEXT I 280 ' И з о б р а ж е н и е ф о н а 310 DRAW"bm0,176":DRAW"s4a0" 330 LINE(0,0)-(255,191),15,B:LINE(16,2)-(239,2),15 350 LINE(16,2)-(239,189),15,B:LINE(16,16)-(239,16),15 370 DRAW"bm136,5":COLOR 15 380 T$="Счет:":GOSUB 920 390 SC=0 400 PRINT#1,USING"######";SC 420 ' З в е з д н о е н е б о 440 FOR I=1 TO 100 450 E=INT(RND(1)*224)+16:F=INT(RND(1)*160)+16:PSET(E,F) 480 NEXT I 500 'Случайное движение корабля противника 530 FOR I=1 TO 100:M(I)=INT(RND(1)*130)+16:NEXT I 560 CIRCLE(160,60),40,11:PAINT(160,60),11 570 CIRCLE(175,45),10,9,,,13/10:PAINT(175,45),9 590 'У с т а н о в к а о т м е т о к 610 DRAW"bm10,4" 620 FOR I=10 TO 13:PUT SPRITE I,STEP(10,0),15,1:NEXT 650 X=24:Y=96:LI=14 660 F$="t180v12o2s11m100e16r16d#2" 670 M$="t180v12o6l24bgbgab" 680 W$="t180s1m3000o3c" 690 MX=200:MY=96:IX=IX+1:T=-2:F=0:J=0 700 STRIG(0)ON:SPRITE ON:INTERVAL ON 730 IF IX>100THEN IX=0 740 L=SGN(M(IX)-MY) 760 'О с н о в н о й ц и к л 780 PUT SPRITE 0,(X,Y),15,1 790 PUT SPRITE 1,(MX,MY),15,0 800 IF F THEN GOSUB 1040 810 IF J THEN GOSUB 1160 820 IF STICK(0)=1 THEN Y=Y-2 830 IF STICK(0)=5 THEN Y=Y+2 840 IF Y<=16 THEN Y=16 850 IF Y>=176 THEN Y=176 860 MY=MY+L:IF MY=M(IX)THEN IX=IX+1:GOTO 730 870 MX=MX-T:IF MX<40 OR MX>228 THEN T=-T 880 GOTO 780 890 'Подпрограмма вывода на экран 920 FOR I=1 TO LEN(T$):PRINT#1,T$:DRAW"bm-2,0":NEXT 960 RETURN 970 ' Свой с н а р я д 1000 IF F THEN RETURN 1010 PLAY"l8s8m300o6c","l8s8m300o7c" 1020 A=Y:B=X+16:F=1 1030 RETURN 1040 B=B+7 1050 IF B>232 THEN PUT SPRITE 3,(0,209):F=0:RETURN 1060 PUT SPRITE 3,(B,A),15,2:RETURN 1070 RETURN 1080 ' С н а р я д противника 1110 IF J THEN RETURN 1120 PLAY"l16s14m800o2a" 1130 BX=MX-8:BY=MY+4 1140 PUT SPRITE 4,(BX,BY),2,3 1150 J=-1:STRIG(0)ON:RETURN 1160 BX=BX-5 1170 IF BX<16 THEN BY=209:J=0 1180 PUT SPRITE 4,(BX,BY),2,3 1190 RETURN 1200 'Подпрограмма обработки прерываний. 1210 'Определение спрайтов по отношению к их расположению 1250 SPRITE OFF:INTERVAL OFF 1260 IF A+2>MY AND A+5<=MY+7 AND B+8>=MX THEN SI=30:PLAY M$:GOTO 1300 1270 IF BY+2>Y AND BY-7=BY AND A+5<=BY+7 AND BY+8>=36 THEN SI=10:PLAY W$:GOTO 1400 1290 SPRITE ON:INTERVAL ON:STRIG(0)ON:RETURN 1300 ' В с п ы ш к а на экране 1330 FOR I=0 TO 50 1340 COLOR,,RND(1)*16 1350 NEXT 1360 MY=96:MX=220 1370 ' Удаление снаряда 1400 PUT SPRITE 3,(0,209):F=0:A=0:B=209 1410 PUT SPRITE 4,(0,209):J=0:BX=0:BY=209 1420 IX=IX+1 1430 ' Увеличение счета 1460 DRAW"bm178,5":COLOR 1 1470 PRINT#1,USING"######";SC 1480 SC=SC+SI 1490 DRAW"bm178,5":COLOR 15 1500 PRINT#1,USING"######";SC 1510 COLOR,,1 1520 IF LI=9 THEN GOTO 1590 1530 PUT SPRITE LI,(0,209) 1540 SPRITE ON:INTERVAL ON 1550 RETURN 730 1560 ' К о н е ц и г р ы 1590 STRIG(0)OFF:INTERVAL OFF:SPRITE OFF 1600 PUT SPRITE 0,(0,209) 1610 PUT SPRITE 1,(0,209) 1620 PUT SPRITE 3,(0,209) 1630 PUT SPRITE 4,(0,209) 1640 LINE(24,60)-(232,76),15,BF 1650 DRAW"bm26,64":COLOR 1 1660 T$=" ИГРА ОКОНЧЕНА" 1670 GOSUB 920 1680 FOR I=1 TO 5000:NEXT 1690 S=STICK(0):IF S=0 THEN 1690 1700 IF S<>1 THEN 1720 1710 CLS:GOTO 310 1720 COLOR 15,4,4 1730 END 1740 ' Д а н н ы е для с п р а й т о в 1770 DATA 0, 60, 66,255, 66,255, 66, 60 1780 DATA 0,224, 68,255,255, 68,224, 0 1790 DATA 0, 64, 34, 63, 34, 64, 0, 0 1800 DATA 0, 2, 68,252, 68, 2, 0, 0 VII.3. И н и ц и а л и з а ц и я в MSX-BASIC При включении компьютера он приводится автоматически в некоторое исход- ное состояние (происходит его и н и ц и а л и з а ц и я) ; так, например, экран устанавливается в режим SCREEN 0 и окрашивается в определенный цвет. В языке MSX-BASIC для компьютеров MSX-2 существуют операторы для допол- нительной инициализации. Действие этих операторов в своем роде уникально: ┌─────────────────────────────────────────────────────────────────────┐ │ будучи о д и н раз выполненными, они воздействуют на компьютер │ │ при к а ж д о м включении (установленные ими значения запомина- │ │ ются в небольшой по объему памяти,сохраняющей свое содержимое при │ │ отключенном основном питании)! │ └─────────────────────────────────────────────────────────────────────┘ ┌──────────────────────┐ 1. Оператор │ SET ADJUST(X,Y) │ └──────────────────────┘ где: SET ("установить"), ADJUST ("корректировка") - служебное слово; X и Y - арифметические выражения, целые части значений которых принадлежат отрезку [-7,8] (по умолчанию X=0,Y=0), регулирует положение используемой части экрана. ┌──────────────────────────────────────────┐ 2. Оператор │ SET BEEP [з в у к][,г р о м к о с т ь] │ , └──────────────────────────────────────────┘ где: SET , BEEP - служебные слова; з в у к - арифметическое выражение, целая часть значения которого принадлежит отрезку [1,4]; г р о м к о с т ь - арифметическое выражение,целая часть которого принадлежит отрезку [1,4]; устанавливает звук и громкость при выполнении оператора BEEP. Любой из параметров может быть опущен (его значение совпадет со значе- нием, установленным ранее), причем, если опущен первый параметр, то запя- тая должна быть сохранена. ┌─────────────────────────────────────────────┐ 3. Оператор │ SET TITLE ["з а г о л о в о к"][,ц в е т] │ , └─────────────────────────────────────────────┘ где: SET , TITLE ("заголовок") - служебные слова; з а г о л о в о к - значение строковой константы, длина которого не должна превышать 6 ; ц в е т - арифметическое выражение, целая часть значения которого принадлежит отрезку [1,4]; позволяет переопределять заголовок, возникающий на экране при включении компьютера. Если з а г о л о в о к имеет длину 6, то система будет "ожи- дать" нажатия любой клавиши после вывода заголовка на экран. ┌─────────────────────────────────┐ 4. Оператор │ SET PASSWORD "п а р о л ь" │ , └─────────────────────────────────┘ где: SET , PASSWORD - служебные слова; п а р о л ь - значение строковой константы, длина которого не дол- жна превышать 255 ; позволяет ввести пароль, проверяемый всякий раз при включении компьютера. Если Вы забыли пароль, нажмите клавиши "STOP" и "GRAPH" при включении. ┌──────────────────────────────────────┐ 5. Оператор │ SET PROMPT "п о д с к а з к а" │ , └──────────────────────────────────────┘ где: SET , PROMPT - служебные слова; п о д с к а з к а - значение строковой константы, длина которого не более 6 символов; переопределяет подсказку Ok. П р и м е ч а н и е. Можно сохранить результат действия только одного из операторов SET TITLE, SET PASSWORD или SET PROMPT: использованный послед- ним "замещает" предыдущий. Пользуясь этой возможностью, можно отменить пароль, вернуться к исход- ному заголовку, к подсказке "Ok". Достаточно ввести команду SET PROMPT "Ok" ┌──────────────────────┐ 6. Оператор │ SET SCREEN │ , └──────────────────────┘ где: SET , SCREEN - служебные слова; позволяет с о х р а н и т ь значения параметров, относящихся к состоя- нию экрана, которые были ранее установлены операторами SCREEN, COLOR, KEY ON/OFF, WIDTH . Сохраняются только те параметры, которые могут вводиться в командном режиме: режим экрана (0 или 1); ширина экрана (от 1 до 80, если режим экрана =0; от 1 до 32, если режим экрана =1); цвет текста (от 0 до 15); цвет фона (от 0 до 15); цвет бордюра (от 0 до 15); высвечивание текста функциональных клавиш (ON или OFF); размер спрайтов (от 0 до 3); звук при нажатии клавиш (0 или 1); скорость передачи информации (1200 или 2400 бод); тип используемого принтера (MSX или другой тип); режим вывода (от 0 до 3). При включении компьютера неявно выполняются операторы SCREEN, COLOR, KEY ON/OFF и WIDTH, параметры которых были сохранены. Мартобря 86 числа. Н.В.Гоголь. Записки сумасшедшего ┌─────────────────────────────┐ 7. Оператор │ SET DATE "ММ/ДД/ГГ",[A] │ , └─────────────────────────────┘ где: SET , DATE ("дата") - служебные слова; ММ/ДД/ГГ - значение строковой константы, определяющей дату; A - необязательный параметр; определяет дату в формате: "ММ/ДД/ГГ" , где: ММ - месяц (от 00 до 12); ДД - день (от 00 до 31); ГГ - две последние цифры года. Отметим, что наличие нулей обязательно! Например: SET DATЕ "01/05/89" Если присутствует параметр A,то дата будет рассматриваться как д а т а подачи сигнала ("будильник с календарем") (при этом игнорируются месяц и год). ┌───────────────────────────┐ 8. Оператор │ SET TIME "ЧЧ:ММ:СС",[A] │ , └───────────────────────────┘ где: SET , TIME - служебные слова; ЧЧ:ММ:СС - значение строковой константы, определяющей время; A - необязательный параметр; задает время в следующем формате: "ЧЧ:ММ:СС" , где: ЧЧ - часы (от 00 до 23); ММ - минуты (от 00 до 59); СС - секунды (от 00 до 59). Отметим, что наличие нулей обязательно! Присутствие параметра A задает в р е м я подачи сигнала ("будильник"), причем секунды игнорируются. Учтите, что используя параметр А, всегда не- обходимо вводить вначале в р е м я , а лишь затем д а т у ! Все врут календари. А.С.Грибоедов. Горе от ума Для получения даты и времени MSX-BASIC предоставляет также еще два опе- ратора: ┌──────────────────────┐ 1) │ GET DATE Z$,[A] │ , └──────────────────────┘ где: GET ("получать"), DATE - служебные слова; Z$ - строковая переменная; A - необязательный параметр. Этот оператор присваивает значение даты переменной Z$ в формате "ММ/ДД/ГГ". Команда GET DATE Z$,A возвращает значение, определяющее дату подачи сигнала. ┌─────────────────────┐ 2) │ GET TIME Z$,[A] │ , └─────────────────────┘ где: GET, TIME - служебные слова; Z$ - строковая переменная; A - необязательный параметр. Этот оператор присваивает значение времени переменной Z$ в формате "ЧЧ:ММ:СС". Команда GET TIME Z$,A возвращает значение, определяющее время подачи подачи сигнала. Отметим, что подача сигнала не является автоматической. Для ее осуществ- ления необходимо использовать подпрограмму, сравнивающую текущие дату и время с заданными параметром A,и в случае совпадения выдающую сигнал BEEP или определенное сообщение. П р и м е р ы: ───────────── 1) set date "01/17/89" 2) set date "01/17/89",a Ok Ok get date d$:?d$ get date d$,a:?d$ 01/17/89 00/17/00 Ok Ok 3) set time "20:45:30" │ Начался отсчет 4) set time "20:45:30",a Ok │ времени Ok get time t$:?t$ get time t$,a:?t$ 20:45:40 ◀──── 10 с прошло с момента 20:45:00 Ok выполнения предыдущей Ok команды 5) set time "20:45:30":set time"20:50:30",a Ok get time t$:get time tm$,a:?t$,tm$ 20:45:43 20:50:00 Ok Более того: get time m$,a:?m$ ◀─── !!! 20:50:00 Ok 6) Ваш компьютер можно использовать и в бытовых целях. Если не хотите опаздывать на свидание, пользуйтесь возможностями компьютеров MSX-2 !!! 10 SET BEEP 3,4 20 SET TIME "22:30:45":SET DATE "01/17/89" 30 SET TIME "22:31:45",A:SET DATE "01/17/89",A 40 GET TIME TM$,A:GET DATE DT$,A 50 GET TIME T$:GET DATE D$ 60 IF MID$(T$,1,6)+"00"=TM$ AND "00"+MID$(D$,3,4)+"00"=DT$ THEN BEEP:G OTO 50 ELSE GOTO 50 7) Если Вы хотите сохранить несколько версий программы,с которой Вы ра- ботаете, то Вас наверняка заинтересует следующий пример: 10 GET TIME Y$ 20 SAVE"A"+LEFT$(Y$,2)+MID$(Y$,4,2)+RIGHT$(Y$,2) 30 'Основная программа Запись программы в 14 ч 53 мин 33 с приведет к созданию файла с именем A145333. Записанные ранее версии Вашей программы остаются в непри- косновенности!