Это игра, созданная специально для БК-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
Скачать исходник, как текстовый файл
КОММЕНТАРИИ РЕЦЕНЗЕНТА
- Программа работает только в режиме 32 символа в строке.
- Так как координаты элементов стен, ям, кладов, арсенала и выходов определяются в случае участия в игре одного игрока с помощью датчика случайных чисел, они могут попадать в одно и то же место лабиринта в различных сочетаниях, что может приводить к сокрытию от игрока некоторых элементов.
- Нет достаточной задержки на заставке игры. Для введения задержки до
нажатия любой клавиши достаточно вставить две строки:
211 Q¤=INKEY¤ 212 IF Q¤="" THEN 211
- Вместо количества игроков «1» можно набирать любой символ, отличный от «2».
- При ручной расстановке элементов лабиринта нет страховки на случай ввода
151-го элемента стены. Необходимо, чтобы при вводе 150-го элемента стены
сразу осуществлялся переход непосредственно на игру. Это достигается, например,
вставкой оператора
725 IF K=151 THEN 750
- В случае ввода менее 150 элементов стен могут возникать непредвиденные ошибки из-за наличия не присвоенных значений элементов массивов XS%, YS%.
- Программу можно существенно улучшить по времени реакции на действия игрока и по объёму занимаемой памяти. Это особенно необходимо для игр, а этой игре несколько недостаёт динамичности.
Качество игровой программы не хуже качества программ, опубликованных в книге «Персональный компьютер в играх и задачах» (M.: Наука, 1988). Программа игры достаточно хорошо показывает основные возможности языка БЕЙСИК БК-0010.01.
Л. H. Жариков