Это игра, созданная специально для БК-0010-01 ленинградскими студентами Дмитрием Звездиным (ЛИТМО) и Алексеем Рогусским (ЛЭТИ). Здесь так же, как и в игре «Остров сокровищ» (см. ВТ, 1988, №3 (прим.gid: это игра на бейсике для Искры-1256)), игрока ожидают приключения, опасности, разочарования и ПОБЕДА! Желаем серьёзно отдохнуть.

ЛАБИРИНТ

Описание игры. В игре активно может участвовать один «кладоискатель». Допускается участие соперника, расставляющего (прячущего) клады. Прячущий должен расставить на поле 20x20 150 стен, 3 клада, из которых 2 ложных, 3 ямы, арсенал, 2 выхода. Для перехода в этот режим нужно на вопрос: «Сколько вас?» - ответить нажатием на кнопку «2». После этого БК запросит координаты объектов, например, «КЛ1?». Ответ - два числа, указывающие координаты по X и Y, отсчитываемые от верхнего левого угла лабиринта (предполагается, что рисунок лабиринта у прячущего уже имеется). Истинный клад вводится третьим. Затем на экране появится рамка, обозначающая границы лабиринта, а в верхнем левом углу курсор. Нажатие на пробел оставляет в текущей позиции «проход», нажатие на любую другую клавишу - «стену». Справа от рамки будет высвечиваться число, обозначающее количество стен, которое не должно превышать 150! Все объекты расставлены, и «кладоискатель» может начинать путешествие. Командой к началу поиска может быть чистая рамка лабиринта с точкой в произвольном (!) месте. «Кладоискатель» перемещается на одну позицию с помощью клавиш «Н», «И», «П», «О» вверх, вниз, влево и вправо соответственно. При столкновении со стенкой «кладоискателю» возвращаются предыдущие координаты. Но стены - не беда! Их можно взрывать гранатами. Для этого нужно подойти к стене вплотную и нажать клавишу управления в режиме АР2. Так, если вы хотите взорвать стену справа от вас, нажмите клавишу «АР2» и «О». Стены бывают бронированные. Это значит, что для того, чтобы её пробить, могут понадобиться две гранаты. Всего гранат 25, но есть арсенал, попав в который вы можете пополнить свой боезапас. Задача «кладоискателя» найти истинный клад, но есть ещё и два ложных. Узнать о том, какой клад он нашёл, «кладоискатель» может только после выхода из лабиринта. Если вы выбрали режим игры без прячущего, то берегитесь - все объекты расставляются случайным образом, и клады с арсеналом могут быть в стенках, так что «кладоискатель» может и не победить.

Описание программы. Авторы создавали игру не с целью сделать из неё сложный тренажёр кладоискателя, а как пример составления игровой программы для пользователей, осваивающих БЕЙСИК. Некоторые места в программе могут быть совсем нерациональны, но это сделано для лучшего понимания начинающими.

В строках с номерами 10-140 расположены операторы, рисующие заставку к игре. В строке 180 - оператор описания двух глобальных массивов с координатами объектов. В строке 240 - печать краткой инструкции к игре. В строках 260-290 - опрос и анализ нажатой клавиши на вопрос «Сколько вас?». Строка 280 - печать введённого символа «эхо». В строках 300-410 происходит расстановка объектов случайным образом. В строках 430-710 - ввод координат объектов с клавиатуры. В строке 660 третий параметр в описании положения курсора равен нулю - гашение курсора, а в строке 680 код печатаемого символа 191 - 277(8). Он получается нажатием на клавишу «ъ» в режиме АР2. 720-770 - оформление экрана к началу игрового цикла, 780-790 - случайные начальные координаты «кладоискателя», 800 - присваивание значения «пусто» переменной, отведённой под хранение кодов клавиш. 740 - рисуем рамку к заставке, а 820 - рисуем рамку после каждого хода, так как в «приграничных» ходах рамка может быть испорчена, 840 - вывод точки в то место, где был «кладоискатель», проводятся преобразования координат символьных (64x24) в графические (256x240), 860-900 - проверка направления движения или стрельбы и соответствующие изменения координат. Символы, которые генерируются при нажатии на клавиши «Н», «И», «Р», «О» в АР2 (стрельба), имеют коды. 920-1200 - вывод шутливых надписей в зависимости от переменной количества ходов. А в 1020-1090 - подпрограмма в кодах (№ 9/88), помещающая в служебную строку текст. В 1000 - очистка служебной строки (код получается нажатием «АР2» и «.»). 1130 - пример работы функции MID. 1210-1380 - проверяем, не попали ли мы на стенку. 1390-1440 - взрываем стенку. 1450-1480 - изменение координат. 1520-1620 - на что же именно мы встали? 1630-1660 - рисуем выход. 1670-1680 - анализ победы. 1690-1820 - вывод сообщений. 1700-1730 - звук из пьезодинамика (адрес 177716(8), в десятичном БЕЙСИК-формате - «-50»). 1880 - не выпускаем за границу лабиринта. 1890 - подпрограмма оформления.

Назначения и идентификаторы «глобальных» переменных:

KHD - Количество Ходов;

Z - Код символа;

PK - Признак Клада;

XK, YK - Координаты курсора (переменные - латинский шрифт)

GR - Количество Гранат;

1 REM ПРОГРАММА «ЛАБИРИНТ»
2 REM Авторы: Рогусский, Звездин, Озерков
5 CLS
20 DATA 15,3,16,20,7,12,24,12,23,16,8,8,23,8,9,17,12,19,20,19,19,4,11,4
30 FOR T=0 TO 11
40 READ X,Y
50 ? AT (X,Y) "*"
60 NEXT
70 CIRCLE (90,128),20,1,0,6,5,5,1,4
80 CIRCLE (128,70),20,1,0,6,5,5,1,4
90 CIRCLE (166,118),13,1,0,4,5,0,9
100 CIRCLE (166,140),13,1,3,2,1,7,0,9
110 CIRCLE (128,128),20,,,,1,3
120 PSET (113,108)
130 DRAW "D80"
140 GOSUB 1890
150 FOR G=0 TO 6
160 BEEP
170 NEXT
180 DIM XS%(150),KX(9),YS%(150),KY(9)
190 CLS
200 KHD=0
210 PK=0
220 K=1
230 GR=25
240 ? "-+-*** FACE OF THE WALL ***-+-",,,"Управляя '8' клавишами 'N','I','Р','О' (3-1> соответст-
венно) нужно найти истинный клад (есть еще 2 ложных) и выход (их 2). есть ямы(Я) и арсенал. 
КЛАДЫ БЫВАЮТ В СТЕНАХ! стены взрываются в 'AP2'. Следите за информацией.",,,
250 ? "СКОЛЬКО ВАС[1/2]?"
260 Q$=INKEY$
270 IF Q$="" THEN 260
280 ?AT(17,10)Q$
290 IF Q$="2" THEN 430
300 FOR T=1 TO 7
310 KX(T)=INT(20*RND(1))+1
320 KY(T)=INT(20*RND(1))+1
330 NEXT
340 FOR T=1 TO 150
350 XS%(T)=INT(20*RND(1))+1
360 YS%(T)=INT(20*RND(1))+1
370 NEXT
380 KX(8)=19*INT(2*RND(1))+1
390 KY(8)=INT(20*RND(1))+1
400 KX(9)=INT(20*RND(1))+1
410 KY(9)=19*INT(2*RND(1))+1
420 GOTO 720
430 INPUT "КЛ1"; KX(1),KY(1)
440 INPUT "КЛ2"; KX(2),KY(2)
450 INPUT "КЛ3"; KX(3),KY(3)
460 INPUT "АРС"; KX(4),KY(4)
470 INPUT "ЯМА1"; KX(5),KY(5)
480 INPUT "ЯМА2"; KX(6),KY(6)
490 INPUT "ЯМА3"; KX(7),KY(7)
500 INPUT "ВЫХ1"; KX(8),KY(8)
510 INPUT "ВЫХ2"; KX(9),KY(9)
520 CLS
530 PSET (7,9)
540 DRAW "R161D202L162U202"
550 ?AT(23,12) "СТЕН"
560 FOR Y=1 TO 20
570 FOR X=1 TO 20
580 BEEP
590 LOCATE X,Y,2
600 Z$=INKEY$
610 T=RND(1)
620 IF Z$="" THEN 600
630 IF Z$="" THEN 700
640 XS%(K)=X
650 YS%(K)=Y
660 LOCATE 27,12,0
670 ?AT(27,12)K
680 ?AT(X,Y)"?"
690 K=K+1
700 NEXT X
710 NEXT Y
720 CLS
730 PSET (7,9)
740 DRAW "R161D202L162U202"
750 GOSUB 1890
760 ?AT(22,2) "ГРАНАТ:"; GR
770 ?AT(22,3) "ХОДОВ:"; KHD
780 XK=INT((RND(1))*20)+1
790 YK=INT((RND(1))*20)+1
800 Z$=""
810 PSET(7,9)
820 DRAW "R161D202L162U202"
830 LOCATE XK,YK,0
840 PSET (XK*8+4,YK*10+5),1
850 Z$=INKEY$
860 IF Z$="" THEN 850
870 IF Z$="N" OR Z$="," THEN YK=YK-1
880 IF Z$="I" OR Z$=")" THEN YK=YK+1
890 IF Z$="Р" OR Z$="0" THEN XK=XK-1
900 IF Z$="O" OR Z$="/" THEN XK=XK+1
910 ? AT(XK,YK)"8"
920 IF KHD=100 THEN ? AT(2,22)"НЕ НАДО НЕРВНИЧАТЬ"
930 IF KHD=120 THEN ? AT(2,22)" "
940 IF KHD=200 THEN ? AT(6,22)"ТОРОПИСЬ!"
950 IF KHD=210 THEN ? AT(6,22)" "
960 IF GR=2 THEN ?AT(22,4)"ОСТАВЬ "AT(22,5)"ОДНУ "AT(22,6)"ДЛЯ СЕБЯ"
970 IF GR=0 THEN ?AT(22,4)" "AT(22,5)" "AT(22,6)" "
980 IF KHD=300 THEN ? AT(2,22)"КИПЯТИ КОТЕЛОК!"
990 IF KHD=310 THEN ? AT(2,22)" "
1000 IF KHD=420 THEN? CHR$(&0236)
1010 IF KHD<>400 THEN 1100
1020 DATA 2561,5443,4930,-27520,-30702,2689,32452,135
1030 FOR T=0 TO 7
1040 READ J
1050 POKE &O400+2*T,J
1060 NEXT T
1070 DEF USR0=&0400
1080 IF KHD=400 THEN A$="КОСОГЛАЗИЕ=+/-100"
1090 A$=USR0(A$)
1100 IF KHD<>250 THEN 1210
1110 Q$=" НЕ СПИ - ЗАМЕРЗНЕШЬ!! "
1120 FOR T=25 TO 0 STEP-1
1130 M$=MID$(Q$,26-T,T)
1140 ?AT(2,22)M$
1150 IF T<>25 THEN 1190
1160 FOR G=0 TO 100
1170 BEEP
1180 NEXT G
1190 NEXT
1200 ? AT(25,22) "*"
1210 T=0
1220 T=T+1
1230 IF T=151 THEN 1490
1240 IF XS%(T)<>XK THEN 1220
1250 IF YS%(T)<>YK THEN 1220
1260 ?AT (XK,YK) "?"
1270 IF Z$<>"N" THEN 1300
1280 YK=YK+1
1290 GOTO 800
1300 IF Z$<>"1" THEN 1330
1310 YK=YK-1
1320 GOTO 800
1330 IF Z$<>"Р" THEN 1360
1340 XK=XK+1
1350 GOTO 800
1360 IF Z$<>"0" THEN 1390
1370 XK=XK-1
1380 GOTO 800
1390 GR=GR-1
1400 ?AT(22,22)"ГРАНАТ:",GR
1410 IF GR<0 THEN 1450
1420 XS%(T)=0
1430 YS%(T)=0
1440 ?AT(XK,YK)" "
1450 IF Z$="." THEN 1280
1460 IF Z$=")" THEN 1310
1470 IF Z$="0" THEN 1340
1480 IF Z$="/" THEN 1370
1490 Z$=""
1500 KHD=KHD+1
1510 ?AT(22,3)"ХОДОВ:"; KHD
1520 FOR T=1 TO 9
1530 IF (XK=KX(T)) AND (YK=KY(T)) THEN 1560
1540 NEXT
1550 GOTO 1840
1560 IF (T>=1)AND(T<=3) THEN ?AT(XK,YK)"K" ELSE 1600
1570 FOR G=0 TO 9
1580 BEEP
1590 NEXT
1600 IF ((T=1)OR(T=2))AND(PK<>1)THEN PK=2
1610 IF T=3 THEN PK=1
1620 IF (T<>8)AND(T<>9) THEN 1670
1630 IF XK=1 THEN ? AT(0,YK)"1"
1640 IF XK=20 THEN ? AT(21,YK)">"
1650 IF YK=1 THEN ? AT(XK,0)"3"
1660 IF YK=20 THEN ? AT(XK,21)"-"
1670 IF ((T=8)OR(T=9))AND(PK=2) THEN ? AT(22,4)"КЛАД" AT(22,5)"ЛОЖНЫЙ!"
1680 IF ((T=8)OR(T=9))AND(PK=1) THEN 1690 ELSE 1800
1690 ?AT(22,10) "ПОБЕДА"
1700 FOR T=0 TO 80000 STEP 100
1710 POKE -50,0
1720 POKE -50,-1
1730 NEXT
1740 IF GR>0 THEN 1760
1750 ?AT(22,11)"НО ВЫ" AT(22,12)"ВЗОРВАЛИ" AT(22,13)"КУЧУ" AT(22,14)"СТЕН!"
1760 FOR G=0 TO 29
1770 BEEP
1780 NEXT
1790 GOTO 190
1800 IF T=4 THEN GR=GR+3
1810 ? AT(22,2) "ГРАНАТ:"; GR
1820 IF (T>=5) AND (T<=7) THEN ? AT(XK YK)"Я" ELSE 1840
1830 GOTO 780
1840 ?AT(XK,YK)" "
1850 IF XK=0 THEN 1340
1860 IF XK=21 THEN 1370
1870 IF YK=21 THEN 1310
1880 IF YK=0 THEN 1280 ELSE 800
1890 FOR TT=25 TO 29 STEP 4
1900 FOR T=19 TO 21
1910 ?AT(TT,T)"*"
1920 NEXT
1930 NEXT
1940 FOR T=18 TO 22 STEP 4
1950 FOR TT=26 TO 28
1960 ?AT(TT,T)"*"
1970 NEXT
1980 NEXT
1990 ?AT(27,19)"С"
2000 ?AT(26,20)"CPS"
2010 RETURN

Скачать исходник, как текстовый файл

КОММЕНТАРИИ РЕЦЕНЗЕНТА

  1. Программа работает только в режиме 32 символа в строке.
  2. Так как координаты элементов стен, ям, кладов, арсенала и выходов определяются в случае участия в игре одного игрока с помощью датчика случайных чисел, они могут попадать в одно и то же место лабиринта в различных сочетаниях, что может приводить к сокрытию от игрока некоторых элементов.
  3. Нет достаточной задержки на заставке игры. Для введения задержки до нажатия любой клавиши достаточно вставить две строки:
    211 Q¤=INKEY¤
    212 IF Q¤="" THEN 211
  4. Вместо количества игроков «1» можно набирать любой символ, отличный от «2».
  5. При ручной расстановке элементов лабиринта нет страховки на случай ввода 151-го элемента стены. Необходимо, чтобы при вводе 150-го элемента стены сразу осуществлялся переход непосредственно на игру. Это достигается, например, вставкой оператора
    725 IF K=151 THEN 750
  6. В случае ввода менее 150 элементов стен могут возникать непредвиденные ошибки из-за наличия не присвоенных значений элементов массивов XS%, YS%.
  7. Программу можно существенно улучшить по времени реакции на действия игрока и по объёму занимаемой памяти. Это особенно необходимо для игр, а этой игре несколько недостаёт динамичности.

Качество игровой программы не хуже качества программ, опубликованных в книге «Персональный компьютер в играх и задачах» (M.: Наука, 1988). Программа игры достаточно хорошо показывает основные возможности языка БЕЙСИК БК-0010.01.

Л. H. Жариков

 

Performed by © gid, 2012-2022.