-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathbas07-03.txt
341 lines (320 loc) · 21.1 KB
/
bas07-03.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
П р и м е р [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<Y AND BX<34 THEN LI=LI-1:PLAY F$:GOTO 1300
1280 IF A+2>=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. Записанные ранее версии Вашей программы остаются в непри-
косновенности!