ZX-Ревю 1993 №11-12 1992 г.

Adventure Games - редактор адвентюрных игр "Adventure Building system" Окончание.


Темы статьи: Программирование  

Adventure Games

"Adventure Building system" Окончание. Начало см. в предыдущем выпуске.

Чтобы завершить демонстрационную программу, начатую нами в предыдущем номере "ZX-РЕВЮ", загрузите программу с ленты_В (Листинг_4) и добавьте строки: с 1100 по 3315 из Листинга_5. Сохраните готовую демонстрационную игру командой RUN 9990. Скомпонуйте файлы готовой демонстрационной программы в следующем порядке: Файл "INTRO" (Лист._3) Файл "adventure" (Лист._4+5) Файл "system"CODE Файл "objects"DATA

Последние два файла сгенерированы при помощи головной программы ABS.

Листинг_5.

Текст 2-ой части демонстрационной игры. Продолжение файла "adventure".

1100 IF NO>MOB THEN LET R$(1) = ^TO НЕВОЗМОЖНО!": GO TO 50

1105 IF PEEK (O+NO)=99 THEN LET R$(1)="nP0BEPbTE СВОЙ ИНВЕНТАРЬ!": GO TO 50

1110 IF PEEK (O+NO)<>PEEK F THEN LET R$(1)="НАВЕРНОЕ, ЭТО ВАМ ПРИСНИЛОСЬ!": GO TO 50

1115 IF PEEK (F+99)>=MAX THEN LET R$(1)="y ВАС ВЕДЬ ТОЛЬКО ДВЕ РУКИ,": LET R$(2)="ВАМ ВСЕ

ЭТО HE УНЕСТИ.": GO TO 50 1120 IF NO=7 THEN CLS : GO SUB 8800: PRINT AT 2,10;"ПОЗДРАВЛЯЕМ": GO SUB 8800: PRINT AT

5,3;"ВЫ ЗАКОНЧИЛИ СВОЮ МИССИЮ.": GO SUB 8800: GO TO 1602 1125 POKE (O+NO),99: POKE (F+99),PEEK (F+99)+1: LET R$(1)="O.K." : GO TO 50 1200 IF NO>MOB THEN LET R$(1)="HE БУДЕМ ДЕЛАТЬ ГЛУПОСТЕЙ!": GO TO 50 1205 IF PEEK (O+NO)<>99 THEN LET R$(1)="ПРОВЕРЬТЕ СВОЙ ИНВЕНТАРЬ!": GO TO 50 1210 IF NO=9 AND PEEK F<>11 THEN POKE (0+9),0: POKE (O+2),PEEK F: POKE (F+2),0: POKE

(F+99),PEEK (F+99)-1: LET R$(1)="O.K. ОН СРАЗУ ЖЕ ПОГАС.": GO TO 50 1215 IF NO=9 THEN POKE (O+9),0:POKE (O+2),PEEK F: POKE (F+2),0: POKE (F+99),PEEK (F+99)-1: RANDOMIZE USR SS: PRINT INK 5;"О.К. НО ОН ТУТ ЖЕ ГАСНЕТ!!!": GO SUB 8800: GO TO 100 1220 IF NO=8 THEN LET Р$(1)="НО ВЕДЬ ОН НАДЕТ НА ВАС.": GO TO 50 1230 POKE (0+NO),PEEK F: POKE (F+99),PEEK (F+99)-1: LET R$(1)="O.K.": GO TO 50 1300 IF NO<10 THEN GO TO 1350 1302 IF NO<>16 THEN GO TO 1315

1305 IF (PEEK F=8 OR PEEK F=9) THEN LET R$(1)="ДВЕРЬ СДЕЛАНА ИЗ ДОБРОТНОГО": LET

R$(2)="ДЕРЕВА И В ДАННЫЙ МОМЕНТ": LET R$(3)="3АКРЫТА, НО НЕ ЗАПЕРТА." 1310 IF PEEK (F+4)=1 THEN LET R$(3)="ОСТАЕТСЯ ШИРОКО ОТКРЫТОЙ." 1313 GO TO 50

1315 IF NO<>21 THEN GO TO 1335

1317 IF (PEEK F=14 OR PEEK F=15) THEN LET R$(1)="BOPOTA СДЕЛАНЫ ИЗ НЕВАЖНОГО": LET

R$(2)="ДЕРЕВА И В ДАННЫЙ МОМЕНТ": LET R$(3)="ЗАКРЫТЫ ИЗНУТРИ НА ЗАСОВ." 1320 IF PEEK (F+7)=1 THEN LET R$(3)="ОСТАЮТСЯ ОТКРЫТЫМИ." 1322 GO TO 50

1325 IF (PEEK F=15 AND (NO=23 OR NO=18) AND PEEK (F+6)=1) OR (PEEK F=7 AND PEEK (F+5)=1 AND

NO=24) THEN LET R$(1)="ЗДЕСЬ ЯМА, БУДЬТЕ OCTOPOЖНЫ!": GO TO 50 1330 IF ((PEEK F=15 AND (NO=23 OR NO=18)) OR (PEEK F=7 AND NO=24)) THEN LET R$(1) = "ЧУBCTBУETCЯ ЗАБОТЛИВЫЙ УХОД,": LET R$(2)="НO НЕДАВНИЙ ДОЖДЬ ОСТАВИЛ": LET R$(3)="РАСКИСШУЮ ПОЧВУ!": GO TO 50 1335 IF NO=22 AND ((PEEK F=7 AND PEEK (F+5)=1) OR (PEEK F=15 AND PEEK (F+6)=1)) THEN LET

R$(1)=^TO ДОВОЛЬНО ГЛУБОКАЯ ЯМА,": LET R$(2)="^ ЕСЛИ ТУДА СВАЛИТЬСЯ, ТО...!": GO TO 50

1340 IF PEEK F=15 AND NO=26 AND PEEK (F+6)=0 THEN LET R$(1)="ВЫГЛЯДИТ ТАК, КАК БУДТО ЗДЕСЬ"

LET R$(2)="КТО-ТО КОПАЛ.": GO TO 50 1345 GO TO 1375

1350 IF (PEEK (O+NO)<>PEEK F AND PEEK (O+NO)<>99) THEN LET R$(1) ="HO ВЕДЬ ЕГО РЯДОЙ С ВАМИ НЕТ!": GO TO 50

1355 IF NO=1 OR NO=8 THEN LET R$(1)="KPACHBb^ ПЛЕД, ВЫГЛЯДИТ КАК": LET R$(2)="M3 ФРАНДУЗСКОЙ ШЕРСТИ.": GO TO 50

1360 IF NO=2 OR NO=9 THEN LET R$(1)="НЕБОЛЬШОЙ ФАКЕЛ, СОВЕРШЕННО": LET R$(2)="ОБЫКНОВЕННЫЙ

НА ВИД.": GO TO 50 1365 IF NO=3 THEN LET R$(1)="0HA ДОСТАТОЧНО ПРОЧНА.": GO TO 50

1370 IF NO=7 THEN LET R$(1)="ЧТО ЗА ПОДОЗРЕНИЯ!": LET R$(2)="(ОН НАСТОЯЩИЙ. СКОРЕЙ БЕРИ

ЕГО": LET R$(3)='^ ПОКОНЧИМ С ЭТИМ ДЕЛОМ!": GO TO 50 1372 IF NO=6 THEN LET В$(1)="НУ ЧТО ВЫ ЕРУНДОЙ ЗАНИМАЕТЕСЬ!": GO TO 50 1375 LET R$(1)="ВЫГЛЯДИТ СОВЕРШЕННО ОБЫКНОВЕННО,": LET R$(2)="HEТ НИЧЕГО СТРАННОГО.": GO TO 50

1400 GO TO 100

1500 RANDOMIZE USR SS: PRINT TAB 3; PAPER 2;"DHHHHHHHHHHHHHHHHHHHHHHHE"

1501 RANDOMIZE USR SS: PRINT TAB 3; PAPER 2; INK 6;"A"; INK 7;" В ВАШЕМ РАСПОРЯЖЕНИИ: "; INK

5;"G"

1502 RANDOMIZE USR 64968

1503 LET HE=0

1504 FOR X=0 TO (MOB-1)

1506 IF PEEK (PBS+X)=0 THEN LET X=MOB: GO TO 1512

1508 RANDOMIZE USR SS: PRINT TAB 3; PAPER 2; INK 6;"A "; INT 7;O$(PEEK (PBS+X)); INK;"G":

LET HE=HE+1 1510 NEXT X

1512 IF HE=0 THEN RANDOMIZE USR SS: PRINT TAB 3; PAPER 2; INK 6 ;"A"; INK 7;"НЕТ СОВСЕМ

НИЧЕГО"; INK 6;"G"

1513 RANDOMIZE USR SS: PRINT TAB 3; PAPER 2; "CBBBBBBBBBBBBBBBBBBBBBRBF"

1514 GO TO 195 1600 CLS

1602 PRINT AT 8,2;"ХОТИТЕ ПОПРОБОВАТЬ ЕЩЕ РАЗ?"; AT 11,8;"ВВЕДИТЕ Y ИЛИ N" 1604 POKE 23658,8: INPUT A$

1606 IF A$="Y" THEN RANDOMIZE USR 65058: GO TO 100 1608 IF A$="N" THEN GO SUB 8800: GO SUB 8800: GO TO 9999 1610 BEEP .2,20: GO TO 1600

1700 REM ЗАПИСЬ

1701 RANDOMIZE USR 65034

1702 CLS

1704 PRINT AT 7,0; " ДЛЯ ВРЕМЕННОГО СОХРАНЕНИЯ ПОЗИЦИИ В ПАМЯТИ КОМПЬЮТЕРА ВВЕДИТЕ ""В"" (ВРЕМЕННО)"

1706 PRINT " " ДЛЯ ПОСТОЯННОГО СОХРАНЕНИЯ ПОЗИЦИИ НА МАГНИТНОМ НОСИТЕЛЕ ВВЕДИТЕ ""П"" (ПОСТОЯННО)"

1708 POKE 23658,0: INPUT A$: IF A$<>"В" AND A$<>"П" THEN GO TO 1708 1710 IF A$ = "B" THEN GO TO 100 1712 SAVE "DATA"CODE 64130,150 1714 GO TO 100

1800 REM ЗАГРУЗКА

1801 CLS

1802 PRINT AT 7,0; "ДЛЯ ВОССТАНОВЛЕНИЯ ВРЕМЕННО СОХРАНЕННОЙ ПОЗИЦИИ ИЗ ПАМЯТИ ВВЕДИТЕ ""В""

(ВРЕМЕННО)"

1804 PRINT " "ДЛЯ ЗАГРУЗКИ ПОСТОЯННО СОХРАНЕН-НОЙ ИГРЫ С МАГНИТНОГО НОСИТЕЛЯВВЕДИТЕ ""П""

(ПОСТОЯННО)"

1805 POKE 23658,0: INPUT A$: IF A$<>"В" AND A$<>"П" THEN GO TO 1806 1808 CLS : IF A$="В" THEN GO TO 1814

1811 INK 0

1812 LOAD "DATA"CODE 64130,150 1815 INK 6

1814 IF PEEK 64190=0 THEN PRINT AT 12,0; "ВЫ НИ РАЗУ НЕ СОХРАНЯЛИ ИГРУ.......НЕТ ДАННЫХ ДЛЯ

ВОССТАНОВЛЕНИЯ! ": BEEP .5,15: PAUSE 150: GO TO 100

1815 RANDOMIZE USR 65046

1816 GO TO 100

1915 IF PEEK F=9 AND NO=17 AND PEEK (F+3)=0 AND PEEK (F+11)=0 THEN POKE (F+3),1: POKE

(F+11),1: LET R$(1)="ОТКРЫВ ЕГО, ВЫ СЛЫШИТЕ ТИХИЙ": LET R$(2)="ГОЛОС, ДОНОСЯЩИЙСЯ ИЗ ГЛУБИНЫ": LET R$(3)="БУФЕТА: ""ШВЫРНИ ШКАТУЛКУ": LET R$(4)="C ЧЕРДАКА И УВИДИШЬ,

ЧТО БУДЕТ.......: GO TO 50

1917 IF PEEK F=9 AND NO=17 AND PEEK (F+3)=1 THEN LET R$(1)="БУДЬ ВНИМАТЕЛЬНЕЕ!": LET

R$(2)="ОН УЖЕ ОТКРЫТ": GO TO 50 1920 IF PEEK F=9 AND NO=17 AND PEEK (F+3)=0 THEN POKE (F+3),1:LET В$(1)="О.К. НО ЧТО ТАКОЕ? ВСЕ ТИХО!": GO TO 50

IF NO=3 AND (PEEK (O+3)=99 OR PEEK (O+3)=PEEK F) THEN LET R$(1)= "НЕСМОТРЯ НИ НА КАКИЕ

УСИЛИЯ": LET R$(2)="ОТКРЫТЬ ЕЕ НЕ УДАЕТСЯ!": GO TO 50 IF PEEK F=11 AND NO=25 AND PEEK (F+8)=0 THEN LET Я$(1)="НЕ ОТКРЫВАЕТСЯ! ЗАПЕРТ НА КЛЮЧ.": GO TO 50

IF PEEK F=11 AND NO=25 AND PEEK (F+8)=1 THEN LET Р$(1)="ОН УЖЕ ОТКРЫТ!": GO TO 50 GO TO 45

IF ((PEEK F=8 OR PEEK F=9) AND NO=16) OR ((PEEK F=14 OR PEEK F=15) AND NO=21) THEN LET

R$(1)="ОКАЗЫВАЕТСЯ, ЗДЕСЬ НЕ ЗАПЕРТО!": GO TO 50 IF ((PEEK F=8 OR PEES F=9) AND NO=16 AND PEEK (F+4)=1) OR ((PEEK F=14 OR PEEK F=15) AND

NO=21 AND PEEK (F+7)=1) THEN LET Р$(1)="НО ВЕДЬ УЖЕ ОТКРЫТО НАСТЕЖЬ!": GO TO 50 IF PEEK F=11 AND NO=25 AND PEEK (F+8)=0 AND PEEK (O+5)=99 AND PEEK (F+9)=0 THEN POKE (F+8), 1: POKE (F+9),1: POKE (O+3),11:LET R$(1)="СЕЙФ ОТКРЫВАЕТСЯ, И ВНУТРИ ВЫ": LET R$(2)="ВИДИТЕ ДЕРЕВЯННУЮ ШКАТУЛКУ.": GO TO 50 IF PEEK F=11 AND NO=25 AND PEEK (F+8)=1 THEN LET R$(1)="A ОН ТЕПЕРЬ НЕ ЗАПЕРТ!": GO TO 50

IF PEEK F=11 AND NO=25 AND PEEK (F+8)=0 AND PEEK (O+5)<>99 THEN LET R$(1) = "^ ЭТОГО

НУЖЕН КЛЮЧ!": GO TO 50 IF NO=3 AND (PEEK (O+3)-PEEK F OR PEEK (O+3)=99) AND PEEK (O+5)=99 THEN LET R$(1) = "^4

К ШКАТУЛКЕ HE ПОДХОДИТ.": GO TO 50 GO TO 45

IF (PEEK F<>7 AND PEEK F<>15) THEN LET R$(1)="ЗДЕСЬ НЕЛЬЗЯ КОПАТЬ": GO TO 50 IF (((PEEK F=15 AND (NO=23 OR NO=18 OR NO=22 OR NO=26)) OR (PEEK F=7 AND (NO=24 OR NO=22))) AND PEEK (O+4)<>99) THEN LET R$(1) = "M КАК ЖЕ ЭТО СДЕЛАТЬ?": LET R$(2) = "^ ЭТОГО НУЖЕН ПОДХОДЯЩИЙ": LET R$(3)="ИНСТРУМЕНТ.": GO TO 50 IF PEEK F=15 AND PEEK (F+10)=0 AND (NO=18 OR NO=22 OR NO=23 OR NO=26) THEN POKE (F+10),1: POKE (O+5),15: POKE (F+6),1: LET Я$(1)="ВЫ ИСПОРТИЛИ КРАСИВУЮ ЛУЖАЙКУ": LET R$(2)="ГЛУБОКОЙ ЯМОЙ. НО ВОТ ЧТО-ТО": LET R$(3)="БЛЕСТНУЛО... ЭТО КЛЮЧ!": GO TO 50 IF ((PEEK F=15 AND PEEK (F+5)=1) OR (PEEK F=7 AND PEEK (F+5)=1)) THEN LET R$(1)="НЕТ

СПАСИБО, БОЛЬШЕ HE НАДО!": GO TO 50 IF PEEK F=15 AND PEEK (F+6)=0 AND PEEK (O+4)=99 AND (NO=23 OR NO=22 OR NO=18 OR NO=26)

THEN POKE (F+6),1: LET R$(1)="O.K. ВЫ ВЫКОПАЛИ ЯМУ В САДУ.": GO TO 50 IF PEEK F=7 AND PEEK (F+5)=O AND PEEK (O+4)=99 AND (NO=24 OR NO=22) THEN POKE (F+5),1:

LET R$(1)="O.K. ВЫ В ПОЛЕ ВЫКОПАЛИ ЯМУ.": GO TO 50 GO TO 45

IF PEEK (O+9)=99 AND NO=9 THEN LET Р$(1)="НО ОН И ТАК ГОРИТ!": GO TO 50 IF NO=2 AND PEEK (O+2)=99 AND PEEK F<>11 THEN POKE (O+2),O: POKE (O+9),99: POKE

(F+2),1: LET R$(1)="O.K. ТЕПЕРЬ ФАКЕЛ ГОРИТ.": GO TO 50 IF NO=2 AND PEEK (O+2)=99 THEN POKE (0+2),0: POKE (O+9),99 : POKE (F+2),1: RANDOMIZE

USR SS: PRINT INK 5;"О.К. ТЕПЕРЬ ФАКЕЛ ЯРКО СВЕТИТ!": GO SUB 8800: GO TO 100 GO TO 45

IF PEEK (O+2)=99 AND NO=9 THEN LET R$(1)="MG ВЕДЬ ОН НЕ ГОРИТ!": GO TO 50

IF NO=9 AND PEEK (O+9)=99 AND PEEK F<>1 THEN POKE (0+9),О: POKE (0+2),99: POKE (F+2),0:

LET R$(1) = "О.К. ФАКЕЛ ПОГАС.": GO TO 50 IF NO=9 AND PEEK (O+9)=99 THEN POKE (O+9),0: POKE (0+2),99: POKE (F+2),0: RANDOMIZE USR

SS: PRINT INK 5;"О.К. ФАКЕЛ БОЛЬШЕ HE СВЕТИТ.": GO SUB 8800: GO TO 100 GO TO 45

IF PEEK F=11 AND (NO=19 OR NO=14) THEN POKE F,6: GO TO 100 IF PEEK F=6 AND (NO=20 OR NO=14) THEN POKE F,2: GO TO 100 IF PEEK F=2 AND NO=15 THEN POKE F,6: GO TO 100 IF PEEK F=6 AND NO=15 THEN POKE F,11: GO TO 100

IF (PEEK F=14 OR PEEK F=15) AND PEEK (F+7)=O THEN LET R$(1)="ЭТО НЕСЕРЬЕЗНО, ЛУЧШЕ

ОТКРОЙТЕ": LET R$(2)="ВОРОТА ИЗ САДА!": GO TO 50 IF (PEEK F=14 OR PEEK F=15) AND PEEK (F+7)=1 THEN LET R$(1)="M ЗАЧЕМ ВАМ ЭТО ДЕЛАТЬ?":

LET R$(2)="ВЕДЬ ВОРОТА ОТКРЫТЫ.": GO TO 50 GO TO 45

IF PEEK F=2 AND (NO=20 OR NO=15) THEN POKE F,6: GO TO 100 IF PEEK F=6 AND (NO=19 OR NO=15) THEN POKE 64280,11: GO TO 100 GO TO 45

IF (PEEK F=8 OR PEEK F=9) AND NO=16 AND PEEK (F+4)=1 THEN POKE (F+4),0: LET R$(1)="O.К.

ТЕПЕРЬ ДВЕРЬ ЗАКРЫТА.": GO TO 50 IF (PEEK F=14 OR PEEK F=15) AND NO=21 AND PEEK (F+7)=1 THEN POKE (F+7),O: LET

R$(1)="O.K. ТЕПЕРЬ ВОРОТА ЗАКРЫТЫ.": GO TO 50 IF PEEK F=9 AND NO=17 AND PEEK (F+3)=1 THEN POKE (F+3),0: LET R$(1)="O.K. ТЕПЕРЬ БУФЕТ ЗАКРЫТ.": GO TO 50

2615 IF PEEK F=11 AND NO=25 AND PEEK (F+8)-1 THEN LET R$(1)="КАЖЕТСЯ, ДВЕРЦУ ЗАКЛИНИЛО!": GO

TO 50 2620 GO TO 45

2700 IF PEEK F=2 AND NO=3 AND PEEK (0+3)=99 AND PEEK (F+11)=1 THEN POKE (0+7),6: POKE (0+6), 6: POKE (0+3),0: POKE (F+99),PEEK (F+99)-1: LET R$ (1) ="ВОТ ЭТО БРОСОК!!!": LET R$(2) = "OT УДАРА ШКАТУЛКА РАЗБИЛАСЬ.": LET R$(3)="ЧTO-TO ИЗ НЕЕ ВЫПАЛО И БЛЕСНУВ,": LET R$(4) = "ПОКАТИЛОСЬ ПО ПОЛУ КОНЮШНИ.": GO TO 50 2705 IF PEEK F=2 AND NO=3 AND PEEK (O+3)=99 THEN LET Я$(1)="Я БЫ ЭТОГО НЕ ДЕЛАЛ.": LET

R$(2)="НАДО ЕЩЕ КОЕ-ЧЕГО": LET R$(3)="ДОБИТЬСЯ ОТ БУФЕТА!": GO TO 50 2710 GO TO 1200

2800 IF ((PEEK F=15 AND PEEK (F+6)=1) OR (PEEK F=7 AND PEEK (F+5)=1)) AND PEEK (0+4)<>99 AND NO=22 THEN LET R$(1)="M КАК ЖЕ ВЫ СОБИРАЕТЕСЬ ЭТО": LET R$(2)="СДЕЛАТЬ БЕЗ НУЖНОГО ИНСТРУМЕНТА!": GO TO 50 2802 IF (PEEK F=15 AND PEEK (F+6)=0 AND (NO=22 OR NO=26)) OR (PEEK F=7 AND PEEK (F+5)=0 AND

NO=22) THEN LET R$ (1)="ШИКАРНО ПОЛУЧИЛОСЬ!": GO TO 50 2805 IF PEEK F=7 AND NO=22 AND PEEK (O+4)=99 AND PEEK (F+5)=1 THEN POKE (F+5),0: LET

R$(1)="O.K. ВЫ ЗАКОПАЛИ ЯМУ В ПОЛЕ.": GO TO 50 2810 IF PEEK F=15 AND NO=22 AND PEEK (O+5)=15 THEN LET R$(1)="ОСТОРОЖНО! ЗАКОПАЕТЕ КЛЮЧ!": GO TO 50

2812 IF PEEK F=15 AND NO=22 AND PEEK (O+4)=99 AND PEEK (F+6)=1 THEN POKE (F+6),0: LET В$(1)="Э.К. ВЫ ЗАКОПАЛИ ЯМУ": LET R$(2)="И ОСТАВИЛИ НА ЛУЖАЙКЕ": LET R$(3)="НЕКРАСИВОЕ ПЯТНО!": GO TO 50 2815 GO TO 45

2900 IF PEEK F=11 AND NO=25 AND

2902 (F+8)=1 THEN LET Я$(1)="НЕ ПОЛУЧАЕТСЯ, ДВЕРЬ ЗАЕЛО!": GO TO 50 2905 GO TO 45

3000 IF NO=1 AND PEEK(O+1)=99 THEN POKE (O+1),0: POKE (O+8),99: POKE (F+1),1: POKE

(F+99),PEEK (F+99)-1: LET R$(1)="ОТЛИЧНО! ОСВОБОДИЛАСЬ РУКА.": LET R$(2)="ДА И ПЛЕД ВАМ ОЧЕНЬ ИДЕТ.": GO TO 50 3005 IF NO=1 AND PEEK (O+8)=99 THEN LET R$(1)="OH УЖЕ ОДЕТ НА ВАС!": GO TO 50 3008 IF NO=1 THEN LET Я$(1)="НЕ ПОЛУЧАЕТСЯ, СНАЧАЛА НАДО": LET R$(2)="В3ЯТЬ ЕГО В РУКИ.": GO

TO 50 3010 GO TO 45

3100 IF NO=8 AND PEEK ^+99)=МАХ THEN LET Я$(1)="НЕ ВЫХОДИТ! ОБЕ РУКИ ЗАНЯТЫ.": GO TO 50 3102 IF NO=8 THEN POKE (O+1),99 : POKE (0+8),0: POKE (F+1),0: POKE (F+99),PEEK (F+99)+1: LET R$(1)="O.K. НО ПОЧЕМУ?": LET R$(2)="РАЗВЕ ВЫ К НЕМУ ЕЩЕ": LET R$(3)="НЕ ПРИШЛИ?": GO TO 50

3105 IF NO=1 THEN LET Р$(1)="НО ЕГО НЕТ НА ВАС!": GO TO 50 3110 GO TO 45

3200 IF PEEK F=2 AND (NO=15 OR NO=27) THEN POKE F,6: FOR X=-5 TO 15: BEEP .04,K: NEXT X: FOR

X=14 TO -5 STEP -1: BEEP .08,X: NEXT X: BEEP 1,-6: GO TO 100 3205 IF (NO=27 OR NO=5 OR NO=5) THEN LET R$(1)="G.K. НО НИЧЕГО HE СЛУЧИЛОСЬ!": GO TO 50 3210 GO TO 45

3300 IF NO<10 AND PEEK (O+NO)<>99 THEN LET R$(2)="ПРОВЕРЬТЕ СВОЙ ИНВЕНТАРЬ!": GO TO 50 3305 IF NO=5 AND PEEK (F+8)=O THEN LET R$(1)="M КАК ЖЕ НАДО ИСПОЛЬЗОВАТЬ": LET R$(2)="ЭТОТ КЛЮЧ?": GO TO 50

3310 IF NO=4 THEN LET R$(1)="ПОДУМАЙТЕ... - НАВЕРНОЕ,": LET R$(2)="ВЫ ЗНАЕТЕ, ЧТО МОЖНО

ДЕЛАТЬ": LET R$(3) = "С ПОМОЩЬЮ ЛОПАТЫ!"^ TO 50 3315 LET R$(1)="ЧТО ЗНАЧИТ **ИСПОЛЬЗОВАТЬ**!?": LET R$(2)="НЕЛЬЗЯ ЛИ УТОЧНИТЬ?": GO TO 50

Теперь пришло время расшифровки некоторых ключевых моментов, которые помогут Вам отслеживать логику работы программы.

Управление адвентюрной игрой.

БЕЙСИК-программа управляет игрой с помощью следующих данных:

- номер глагола (или команды) (VB);

- номер существительного (или направления) (NO);

- таблицы текущего расположения объектов;

- таблицы состояния флагов.

В прошлом номере "ZX-РЕВЮ" мы рассмотрели параметры, задаваемые при помощи строк DATA (Лист. 2). Теперь, подводя итог сказанному, мы приводим полный перечень слов (Листинги 1 и 2), распознаваемых программой, в виде двух таблиц, отдельно для глаголов и существительных (и прочих слов). Для каждого слова указан его номер.

Анализатор текста.

Система, анализирующая текст, позволяет вводить до 30 символов, среди них могут быть русские и латинские заглавные буквы, цифры и символы. Русские буквы набираются непосредственно буквенными клавишами, за исключением Ч, Э, Ш, Щ, Ю. Последние набираются одновременно с нажатием SYMB. SH. клавишами A, S, F, G, X. Для "забоя" последнего введённого символа используется клавиша "DELETE" или "КУРСОР ВЛЕВО". Приглашение процедуры ввода изображается символом ">", а курсор - в виде символа "*".

ВЫ НАХОДИТЕСЬ Ы ДВЕРИ ФЕРМЕРСКОГО ДОМА. ДОМ СДЕЛАН ОЧЕНЬ ДОБРОТНО И КРЕПКО, КАК БНДТО ХОЗЯЕВАМ БЫЛО ОТ ЧЕГО СКРЫВАТЬСЯ.

В ПОЛЕ ВАШЕГО ЗРЕНИЯ: НЕТа СОВСЕМ НИЧЕГО

ВАШИ ДЕЙСТВИЯ?

>ИДТИ НА СЕВЕР

ТНДА НЕ ПРОЙТИ

ВАШИ ДЕЙСТВИЯ?

>ИДТИ НА ВОСТОК

ДВЕРЬ ЗАКРЫТAt

ВАШИ ДЕЙСТВИЯ?

>ОТКРЫТЬ ДВЕРЬ

O.K. ТЕПЕРЬ ДВЕРЬ ОТКРЫТА

ВАШИ ДЕЙСТВИЯ?

>ИДТИ НА ВОСТОК *

Как уже говорилось, процедура построена таким образом, что анализирует пробелы между словами, выделяя первое и последнее слово. Первое слово считается глаголом, а последнее - существительным или направлением перемещения. Поэтому команды "БРОСИТЬ ЭТУ ЛОПАТУ", "БРОСИТЬ КОРОТКУЮ ЛОПАТУ" дают тот же эффект, что и просто "БРОСИТЬ ЛОПАТУ".

Анализатор просматривает введённый текст команды и возвращается в БЕЙСИК с числом VB, соответствующим номеру использованного глагола и с числом NO, соответствующим номеру использованного существительного. Любое нераспознанное слово выдаёт в БЕЙСИК число 200 для глагола и число 201 для существительного.

Таблица 1.

ГЛАГОЛЫ

ОСНОВНЫЕ

ИДТИ.......0

СЕВЕР......0

С..........0

ЮГ.........0

Ю..........0

ВОСТОК.....0

В..........0

НАПРАВО....0

ЗАПАД......0

З..........0

НАЛЕВО.....0

ВВЕРХ......0

Х..........0

ВНИЗ.......0

Н..........0

ВЗЯТЬ......1

БРАТЬ......1

ПОЛОЖИТЬ...2 БРОСИТЬ....2 ПРОВЕРИТЬ..3 ОСМОТРЕТЬ..3 СМОТРЕТЬ...4 ИНВЕНТАРЬ..5

И..........5

СТОП.......6

КОНЕЦ......6

СОХРАНИТЬ..7 ЗАГРУЗИТЬ..8

Эта информация может обыгрываться в БЕЙСИКЕ как угодно, но в нашей демонстрационной программе применяется самое простое решение, - в этом случае пользователь всегда получает ответ "НЕ ПОЛУЧАЕТСЯ".

Если же Вы даёте команду, состоящую из одного слова, например, "СМОТРЕТЬ", то за глагол Вы получите VB=4, а за отсутствие существительного - должны были бы получить NO=201, что вызовет реакцию "НЕ ПОЛУЧАЕТСЯ", хотя нам такая реакция не нужна. Для того, чтобы избежать подобных ситуаций, мы включаем глагол "СМОТРЕТЬ" и в список существительных тоже, при этом присваиваем ему порядковый номер 99 (см. Листинг_1, строка 2190 и Таблицу_2).

Со всеми другими глаголами (командами), которые могут использоваться без существительного, надо поступить тем же образом.

Возможен и другой вариант, когда такому глаголу Вы присваиваете номер не 99, а соответствующий тому существительному, которое с этим глаголом обычно связано. В демонстрационной программе мы так поступили со словом КОПАТЬ - ему присвоен номер 22 (см. Листинг_2, строка 2192 и Таблицу_2), потому что КОПАТЬ и КОПАТЬ ЯМУ - понятия равнозначные. Поэтому пусть читатель, бросивший беглый взгляд на таблицы глаголов и существительных без чтения текста, не упрекает нас в незнании основ русской грамматики.

Таблица_2

ИНВЕНТАРЬ_

ПЛЕД......................1

ШЕРСТЯНОЙ ПЛЕД............1

ФАКЕЛ.....................2

МАЛЕНЬКИЙ ФАКЕЛ...........2

ШКАТУЛКА..................3

ДЕРЕВЯННАЯ ШКАТУЛКА.......3

ЛОПАТА....................4

КОРОТКАЯ ЛОПАТА...........4

КЛЮЧ......................5

БРОНЗОВЫЙ КЛЮЧ............5

ЩЕПКИ.....................6

ДЕРЕВЯННЫЕ ЩЕПКИ..........6

АЛМАЗ.....................7

КРУПНЫЙ АЛМАЗ.............7

ПЛЕД, НАДЕТЫЙ НА ПЛЕЧИ....8

ГОРЯЩИЙ ФАКЕЛ.............9

НАПРАВЛЕНИЕ_

СЕВЕР......С..............10

ЮГ.........Ю..............11

ВОСТОК.....В...НАПРАВО....12

ЗАПАД......З...НАЛЕВО.....13

ВВЕРХ......Х..............14

ВНИЗ.......Н..............15

СУЩЕСТВИТЕЛЬНЫЕ И ДРУГИЕ СЛОВА

ПРОЧИЕ СЛОВА

ДВЕРЬ..........

...16

БУФЕТ..........

...17

ЛУЖАЙКА........

...18

СТУПЕНИ........

...19

ЛЕСТНИЦА.......

...20

ВОРОТА.........

...21

КОПАТЬ.........

...22

ЯМУ............

...22

САД............

...23

ПОЛЕ...........

...24

СЕЙФ...........

...25

ПЯТНО..........

...26

ПРЫГАТЬ........

...27

КОМАНДЫ

СМОТРЕТЬ.......

...99

ИНВЕНТАРЬ......

...99

И..............

...99

СТОП...........

...99

КОНЕЦ..........

...99

СОХРАНИТЬ......

...99

ЗАГРУЗИТЬ......

...99

Обратите внимание, что для тех существительных, которые имеют длину, меньше заданной для идентификации (4 символа) - это, например, существительные ЯМА, САД -задавать их надо в родительном падеже, то есть: ЯМУ (а САД, ПОЛЕ, СЕЙФ и т.д. и в родительном и в именительном падеже совпадают). Ведь подаваемая команда может быть: ВЫКОПАТЬ ЯМУ или ОСМОТРЕТЬ ЯМУ или ПРЫГНУТЬ В ЯМУ и т. д. Если же допускать такие команды, которые потребуют так же и слова ЯМА, например, ПРОВЕРИТЬ, КАК ВЫКОПАНА ЯМА, то существительные надо задавать дважды: ЯМА и ЯМУ, но присваивать им одинаковые номера.

Обратите также внимание на разницу в использовании некоторых глаголов. Это, например, СМОТРЕТЬ и ОСМОТРЕТЬ. Первый не относится к какому-либо предмету

конкретно и подразумевает, как бы оглядеться по сторонам, при этом перерисовывается экран и заново сканируется и отображается табло "В ПОЛЕ ВАШЕГО ЗРЕНИЯ". Глагол СМОТРЕТЬ может использоваться самостоятельно, без существительного. Другой глагол -ОСМОТРЕТЬ - самостоятельно использоваться не может и служит для получения каких-то дополнительных сведений о конкретном предмете, например, о ДВЕРИ, ПОЛЕ, ШКАТУЛКЕ, ЩЕПКАХ от неё, когда она будет разбита и т. д.

Различаются такие глаголы ОТКРЫТЬ и ОТПЕРЕТЬ. Учитывайте, что, например, ДВЕРЬ может быть закрыта, но не заперта на замок, а СЕЙФ закрыт, да ещё и заперт.

Таблица расположения объектов.

Переменная O определяет начало этой таблицы. В ней находятся данные о текущем расположении 50 объектов. Для каждого объекта в любой момент времени здесь содержится число, определяющее номер локации, в которой в данный момент находиться объект.

Например, для объекта с номером 1 (ПЛЕД) Вы можете узнать его расположение командой PEEK (O+1), а изменить его состояние - командой POKE (O+1), N. Здесь "N" -новое место размещения объекта.

Если PEEK (O+X)=99, то это означает, что объект находится у Вас в руках (или на Вас).

Если PEEK (O+X)=0^to значит, что объект в данный момент не виден.

По ходу игры Бейсик-программа вносит изменения в таблицу расположения объектов.

Пример расшифровки логической конструкции:

IF PEEK (O+9)<>99 THEN ...

означает следующее:

ЕСЛИ У ВАС ПРИ СЕБЕ НЕТ ГОРЯЩЕГО ФАКЕЛА, ТО ...

Таблица состояния флагов.

Некоторые объекты имеют одно и то же имя, например ФАКЕЛ. В то время, когда это просто ФАКЕЛ или МАЛЕНЬКИЙ ФАКЕЛ, то это объект номер 2. В то же время, если это ГОРЯЩИЙ ФАКЕЛ, то это уже объект номер 9. Кроме того, по ходу игры могут происходить разные события с предметами, не входящими в инвентарь. Это, например, отпирание и открывание дверей, фиксация того, что интересующее событие произошло и т.д. Все эти моменты отражаются в таблице флагов.

Переменная F определяет адрес ячейки, с которой начинается эта таблица. В ней возможно расположение данных о 100 объектах, причём некоторые флаги зарезервированы для особых случаев.

Определяется состояние флага предмета X командой PEEK (F+X), а изменяется командой POKE (F+X), Z, где Z - новое состояние предмета.

По ходу игры Бейсик-программа вносит изменения в таблицу состояния флагов.

Флаг (F+0) содержит номер текущей локации - то есть место, где Вы сейчас находитесь. Расшифровка логических конструкций в программе будет выглядеть так. Например:

IF PEEK F=7 THEN ...

означает следующее:

ЕСЛИ ДЕЙСТВИЕ ПРОИСХОДИТ В ПОЛЕ ТО ...

Другой пример:

... POKE F, 6 ...

означает:

... МЫ ОКАЗЫВАЕМСЯ В КОНЮШНЕ ...

Флаг (F+99) служит для отражения количества предметов (ИНВЕНТАРЯ), которые герой имеет при себе в данный момент.

Пример логической конструкции:

POKE (F+99), PEEK (F+99)+1

означает ни что иное, как то, что Вы берёте объект в руки. Другой пример:

IF PEEK (F+99)=MAX THEN . . .

означает:

ЕСЛИ У ВАС В РУКАХ МАКСИМАЛЬНОЕ КОЛИЧЕСТВО ПРЕДМЕТОВ, ТО ...

Когда игра начинается, все флаги, за исключением (F+0) имеют нулевое значение. В процессе игры, когда герой надевает ПЛЕД, флагу (F+1) присваивается единица, а когда он зажигает ФАКЕЛ, единица присваивается флагу (F+2) и т. д.

Ниже приводится таблица флагов, использующихся в игре. Значение 1 присваивается соответствующему флагу, если выполняется действие, показанное в таблице.

ТАБЛИЦА СОСТОЯНИЯ ФЛАГОВ_

F+0=NO - НОМЕР ТЕКУЩЕЙ ЛОКАЦИИ F+1=1, если ПЛЕД НАДЕТ НА ПЛЕЧИ F+2=1, если ФАКЕЛ ЗАЖЖЁН F+3=1, если БУФЕТ ОТКРЫТ F+4=1, если ДВЕРЬ ОТКРЫТА F+5=1, если ВЫКОПАНА ЯМА В ПОЛЕ F+6=1, если ВЫКОПАНА ЯМА В САДУ F+7=1, если ВОРОТА ОТКРЫТЫ F+8=1, если СЕЙФ НЕ ЗАПЕРТ F+9=1, если ШКАТУЛКА НАЙДЕНА F+10=1, если КЛЮЧ НАЙДЕН F+11=1, если БУФЕТ ОТКРЫВАЛСЯ

ХОТЯ БЫ 1 РАЗ F+9 9=NO - ЧИСЛО ВЗЯТЫХ ОБЪЕКТОВ

Если с этим объектом происходит противоположное действие (дверь опять закрывается), то флаг должен обнуляться. Однако могут быть ситуации, когда состояние одного объекта оценивается несколькими флагами. Например, если ОТКРЫТЬ БУФЕТ в первый раз, то установится в единицу два флага: F+3 и F+11. Если теперь ЗАКРЫТЬ БУФЕТ, то сбросится флаг F+3, а флаг F+11 так и останется в состоянии 1.

Теперь можно проследить, как в игре формируются более сложные действия. Ситуация, когда зажигается факел, например, моделируется следующим образом: POKE (F+2), 1: POKE (O+2)=0: POKE (O+9), 99

То есть, во-первых, устанавливается флаг зажжённого факела, во-вторых, исчезает объект под названием МАЛЕНЬКИЙ ФАКЕЛ, в третьих - у Вас в руках появляется новый объект: ГОРЯЩИЙ ФАКЕЛ.

Ситуация, когда Вы кладёте горящий факел, например, в саду (при этом он гаснет), будет выглядеть так:

POKE (O+9), 0: POKE (F+2), 0: POKE (O+2), 15:

Сначала исчезает объект ГОРЯЩИЙ ФАКЕЛ и обнуляется его флаг, а затем в САДУ появляется объект МАЛЕНЬКИЙ ФАКЕЛ.

Теперь, когда Вы имеете представление о том, как моделируются те или иные логические конструкции, можно проследить действие программы сначала.

Демонстрационная программа.

В строке 100 начинается прорисовка игрового экрана. На нём изображён только текст, так задумано в концепции отладочной системы ABS. Однако ничего не мешает Вам изменить 7000-ные строки так, чтобы, например, запускался декомпрессор, выводя в верхней трети (или двух третях) экрана рисунок локации. Эти экраны можно подготовить, например, при помощи компрессора, опубликованного в "ZX-РЕВЮ" №3-4, стр. 61-63.

Строка 102 выполняет подпрограмму из большого блока строк, который начинается со строки 7000. Описание локации вводится обычным оператором PRINT в строках 7000 + номер локации, умноженный на 10. Это происходит в зависимости от номера локации PEEK F. Для АМБАРА (1 ЛОКАЦИЯ) будет GO SUB 7000, для ЧЕРДАКА (2 ЛОКАЦИЯ) - GO SUB 7010 и т. д. Длина описания каждой локации - не более 10 БЕЙСИК-строк. Каждое описание должно заканчиваться командой RETURN.

Строка 104 (вместе со строкой 7110) обеспечивают реакцию программы на событие, когда Вы попадаете в погреб без ГОРЯЩЕГО ФАКЕЛА.

Строки 105-129 обеспечивают проверку того, что можно увидеть в этой локации. Если что-то есть, то эта информация также выводится на экран в виде табло: "В ПОЛЕ ВАШЕГО ЗРЕНИЯ". Блок в машинных кодах сам выполняет проверку того, какие объекты следует объявить в этих ситуациях, а начать выполнять процедуры Бейсика. Вместо слов можно вводить изображение соответствующих предметов при помощи символов UDG-графики, печатая их оператором PRINT прямо поверх картинки.

Процедура RANDOMIZE USR SS (строка 195) проверяет необходимость и осуществляет скроллинг экрана и должна выполняться всякий раз, после того, как происходит перерисовка экрана.

Далее, в строке 200, запускается большая процедура в кодах, обеспечивающая сканирование клавиатуры и печать на экране вводимых команд, а также их первичный анализ - "Анализатор текста", о котором уже говорилось выше.

Результатом работы этой процедуры являются значения двух ячеек памяти: 64114 и 64115. В первой из них содержится номер использованного глагола, во второй -существительного (или направления перемещения). Они передаются в Бейсик-переменные в строках 202 и 204. Номер глагола будет теперь VB, а номер существительного - NO.

Строка 208 разрешает при отсутствии ГОРЯЩЕГО ФАКЕЛА в ПОГРЕБЕ только следующие действия: ИДТИ, ЗАЖЕЧЬ, ПОГАСИТЬ, ПОДНЯТЬСЯ, СТОП, ИНВЕНТАРЬ, СОХРАНИТЬ и ЗАГРУЗИТЬ.

Если в результате работы процедуры ввода команды не зафиксирован ни один из допустимых глаголов, то значение ячейки 64114 будет равно 200. Аналогично, если в команде не зафиксировано ни одно из заданных существительных (или направления перемещения), то значение ячейки 64115 будет 201. Как поступить в этих случаях - решать Вам. В демонстрационной программе в этом случае строка 228 адресует на строку 45, где выводиться сообщение "НЕ ПОЛУЧАЕТСЯ".

Если глагол и существительное идентифицированы, то дальнейшее распределение производиться в строке 235, в зависимости от значения глагола: происходит переход на подпрограммы обработки глаголов, расположенные в большом блоке строк, который начинается со строки 1000.

Поскольку наиболее вероятно, что Вы будете оформлять программу с разделённым экраном, нужно было бы вводить проверку на необходимость скроллирования перед тем, как печатать сообщение от программы на экране. Чтобы избежать такой проверки, мы в демонстрационной программе оформляем реакцию программы в виде символьных переменных R$(1), R$(2), R$(3), R$(4), которые печатаются с помощью главной печатающей процедуры (строка 50).

Обработка глаголов.

Каждая подпрограмма обработки глаголов должна иметь не более 100 Бейсик-строк. Номер первой строки определяется по номеру глагола: 1000 + номер глагола, умноженный на 100. Так обеспечивается переход, например в случае ИДТИ - на строку 1000, в случае ВЗЯТЬ - на строку 1100 и т. д.

Вот полный перечень строк для соответствующих глаголов.

ИДТИ...........1000

ВЗЯТЬ..........1100

ПОЛОЖИТЬ.......12 0 0

ОСМОТРЕТЬ......13 0 0

СМОТРЕТЬ.......14 0 0

ИНВЕНТАРЬ......15 0 0

СТОП...........1600

СОХРАНИТЬ......17 0 0

ЗАГРУЗИТЬ......18 0 0

ОТКРЫТЬ........19 0 0

ОТПЕРЕТЬ....... 2 000

КОПАТЬ.........2100

ЗАЖЕЧЬ.........2200

ПОГАСИТЬ.......23 0 0

ЛЕЗТЬ..........2400

СПУСТИТЬСЯ.....2 50 0

ЗАКРЫТЬ........2 60 0

ШВЫРНУТЬ.......27 0 0

ЗАКОПАТЬ.......2 80 0

ЗАПЕРЕТЬ.......2900

НАДЕТЬ.........3000

СНЯТЬ..........3100

ПРЫГАТЬ........32 0 0

ИСПОЛЬЗОВАТЬ...33 0 0

Специфичной является подпрограмма перемещения, расположенная со строки 1000. Мы попадаем на неё независимо от направления, во всех случаях предусмотренного перемещения. В строке 1002 происходит изменение номера слова, определяющего переменные. Так, для СЕВЕР вместо 10 получается значение 1, для ЮГ - вместо 11 -значение 2 и т. д. Это необходимо для корректного дальнейшего выполнения программы в кодах.

В строке 1005 выполняется следующая проверка. Если Вы находитесь перед дверью и идёте на восток или находитесь в прихожей и идёте на запад и в обоих этих случаях дверь закрыта, то вывод текста "ДВЕРЬ ЗАКРЫТА".

Строка 1010. Аналогичная проверка для ворот.

Строка 1020. Если Вы пытаетесь идти в поле, в котором выкопана яма или в саду, в котором выкопана яма, то Вы в неё падаете. В этом случае игра для Вас заканчивается.

В строке 1090 выполняется подпрограмма в кодах, которая выполняет перемещение в другую локацию согласно таблице допустимых перемещений. Входным параметром для этой процедуры является значение содержимого ячейки 64115 (оно было занесено туда в строке 1002). Другим параметром для этой процедуры является значение флага (F+0), то есть текущая локация. Результат работы этой процедуры возвращается также в ячейку 64115, теперь там значение, соответствующее новой локации. Если же там ноль, то это значит, что в направлении, которое Вы задали, перехода нет. Этот контроль производится в строке 1092. В строке 1093 происходит изменение флага текущей локации - Вашего положения. Строка 1094 возвращает на начало программы с новыми условиями - в новой локации.

Обратите внимание, что зацикливание происходит тремя способами. Первый - если команда не воспринимается - на строку 45 с выводом сообщения "НЕ ПОЛУЧАЕТСЯ". Второй - на строку 50 - без изменения верхней части экрана - то есть без изменения локации и отображения предметов, находящихся в поле Вашего зрения. Третий способ - переход на строку 100 (как при старте игры) - это перерисовка всего экрана (переход в новую локацию или команда СМОТРЕТЬ). При этом также изменяется и табло "В ПОЛЕ ВАШЕГО ЗРЕНИЯ:".

Примеры расшифровки подпрограмм.

Теперь, для примера, мы дадим расшифровку реакции программы на некоторые Ваши действия. Потом Вы должны будете продолжать эти рассуждения для всех строк программы, если хотите в деталях разобраться в том, что происходит в разных ситуациях.

Итак, например, строка 1100 - сюда мы попадаем в случае обработки глагола ВЗЯТЬ.

Строка 1100 накладывает ограничение на попытку взять объект, не являющийся инвентарем (то есть имеющий больший номер).

Строка 1105 недоумевает по поводу попытки взять объект, который уже находится у Вас в руках.

Строка 1110 удивляется, если Вы хотите взять инвентарь, который в принципе существует, но его сейчас нет в этой локации.

Строка 1115 возмущается, если Вы хотите поднять больше объектов, чем это разрешено программой.

Строка 1120 радуется, если Вы берёте в руки АЛМАЗ - это конечная цель миссии.

Строка 1125 соглашается с Вами, если Вы берёте остальные объекты инвентаря, которые не были зафиксированы в предыдущих строках.

Крупным блоком является блок, обрабатывающий глагол ОСМОТРЕТЬ (ПРОВЕРИТЬ). Здесь проверка разветвляется на несколько ветвей для ускорения анализа.

Строка 1300 разделяет проверку на относящуюся к инвентарю и прочим объектам.

Строка 1305 отражает закрытое, а строка 1310 - открытое (в случае выключенного флага двери) состояние двери. Строка 1312 зацикливает программу.

Строка 1315 аналогично двери перехватывает проверку ворот.

Строки 1317 и 1320 аналогично двери отражают открытое или закрытое состояние ворот (в зависимости от флага ворот). После чего строка 1322 зацикливает программу.

Строка 1325 предупреждает о выкопанной яме, если Вы находитесь в саду и осматриваете САД или ЛУЖАЙКУ и при этом яма выкопана (флаг ямы в саду - установлен) или Вы находитесь в поле с выкопанной ямой и осматриваете ПОЛЕ.

Строка 1330 отражает результаты проверки, если Вы находитесь в саду и осматриваете сад или лужайку, но яма не выкопана (этот случай был перехвачен предыдущей строкой) или в поле, в котором тоже нет ямы.

Строка 1335 показывает результат проверки ЯМЫ, если Вы находитесь в поле, в котором выкопана яма или в саду, в котором выкопана яма.

Строка 1340 - результат осмотра ПЯТНА, если Вы находитесь в саду и яма закопана.

Строка 1345 - это результат всех остальных проверок.

Строка 1350 перехватывает проверки тех предметов, которых нет в этой локации и нет

у Вас.

Строка 1355 показывает результат осмотра ПЛЕДА или ПЛЕДА НАДЕТОГО НА ПЛЕЧИ.

Строка 1360 - результат осмотра ФАКЕЛА или ГОРЯЩЕГО ФАКЕЛА.

Строка 1365 - осмотр ШКАТУЛКИ.

Строка 1370 - осмотр АЛМАЗА.

Строка 1372 - осмотр ЩЕПОК.

Строка 1375 - все прочие случаи, не предусмотренные программой.

Подробную расшифровку некоторых строк мы дали только для примера. С остальными Вы теперь сможете разобраться самостоятельно.

Кодовый блок программы.

Эта информация представляет определённый интерес для "хакеров". Речь идёт о блоке кодов "system" CODE. В том случае, если Вы не изменяли данные, заданные в Листингах 1 и 2, адрес загрузки блока кодов - переменная SAVE - будет равен 63400. Этот блок занимает пространство до 65368 (начало символов UDG - графики, стандартно расположенных здесь). Если Вы увеличили число слов, распознаваемых программой, то адрес загрузки Вашего блока отодвинется в сторону младших адресов. Здесь надо проконтролировать, чтобы он не перекрывался с загружаемым символьным набором, который сейчас расположен с адреса 50000 и имеет длину 768 байт (см. Листинг_3) - может этот адрес и изменить.

С адреса загрузки SAVE блока "system" CODE расположены те данные, которые были заданы в строках DATA программы ABS (вместе с Листингом_2). Здесь расположена таблица переходов между локациями, как она была задана в 3000-х строках, группы четвёрок символов, заданных для идентификации слов и т.д.

Начиная с адреса 64000, блоки, расположенные здесь, имеют постоянные адреса и не изменяют своего положения.

Ячейки 64114 и 64115 являются рабочими ячейками, в которых хранятся выходные параметры анализатора текста и подпрограмм перемещения.

С адреса 64116 расположена таблица данных, передаваемых через эту область из программы ABS в демонстрационную программу (см. строки 9957-9960 Листинга_4).

С адреса 64130 зарезервирована область размером 150 байт. Она служит для временного сохранения текущего состояния игры, которое определяется таблицей состояния флагов (100 байтов) и таблицей текущего расположения объектов (50 байтов). Сами эти таблицы расположены с адреса 64230 (этому числу равна переменная F, а переменная O на 99 байтов больше, то есть 64379). Ячейка 64130 - первая ячейка сохраняемой области - соответствует значению флага (F+0), то есть текущей локации. Это число не может быть равно нулю (не бывает нулевой локации). При старте демонстрационной программы, в эту ячейку заносится ноль (строка 9961 Листинга_4), предохраняя, таким образом, от сбоя при попытке загрузить состояние, если оно не было прежде сохранено. Эту проверку выполняет строка 1814 Листинга_5.

С адреса 64430 расположены процедуры в кодах.

Процедура по адресу 64440 проверяет необходимость и выполняет скроллинг экрана, обеспечивая в заданных пределах сохранение на экране Ваших команд и ответов программы на них.

Процедура по адресу 64495 (строка 200) - анализатор текста.

Процедура по адресу 64930 сканирует таблицу расположения объектов, выявляя те предметы инвентаря, которые находятся в текущей локации и видны (строка 105 Листинг_4).

Процедура по адресу 64968 (строка 1502) выполняет аналогичную операцию для того инвентаря, который находится у Вас в руках (или на Вас).

Процедура по адресу 65005 (строка 1090) - процедура перемещения.

Процедура по адресу 65058 (строка 9980 Листинг_4) выполняет инициализирующие действия при старте программы, в частности, обнуляет 150-байтовую область с адреса 64280 - таблицу флагов, заносит значение стартовой локации в таблицу флагов (F+0) а также исходное расположение объектов в таблице текущего расположения.

Создание собственной игры.

Когда Вы отладите программу и демонстрация заработает, перед Вами встанет следующий вопрос: "А как мне написать свою игру?"

Во-первых, прежде чем приступать к созданию собственной игры, прогоните демонстрацию и внимательно изучите все детали. Во-вторых, даже и не подходите к компьютеру, пока тщательно не продумаете сценарий своей игры на бумаге. Вы должны, по крайней мере, разработать карту и разместить на ней все участвующие в игре объекты с указанием, к какому типу они относятся.

Сначала спланируйте весь сценарий просто на бумаге, после чего можете приступать к работе с головной программой (Листинги 1 и 2, объединённые при помощи MERGE, иными словами, то, что теперь записано на ленте _А). Ещё раз отметим, что самый простой способ понять, что и как надо делать - это максимально подробно проследить логику работы демонстрационной программы.

С чего практически начать?

Посмотрите на Листинг_4 - кроме блока строк с 7000 - это почти готовый дебют для новой игры. Надо лишь добавить к нему блоки строк с 1700 и с 1800 - СОХРАНЕНИЕ и ЗАГРУЗКА, да ещё со строки 1600 - КОНЕЦ и получится прекрасная заготовка для Вашей собственной игры. Осталось только добавить (или изменить имеющиеся) строки, отвечающие за закрытые или запертые двери, освещение, монстров и разные ловушки, которые будут в Вашей игре. Эти изменения надо ввести в блок перемещения - со строки 1000.

Скорость работы и объём памяти.

При создании собственной игры размер занимаемой памяти может стать критичным. Место, отведённое для Бейсик - программы можно расширить, отодвинув символьный набор в сторону старших адресов, но так, чтобы он не наложился на блок кодов "system" CODE, об этом уже говорилось несколько выше. Практически для этого надо изменить параметры оператора CLEAR и изменить адрес загрузки символьного набора "chr" CODE. Надо также в соответствии с новым адресом загрузки символьного набора изменить значение CHARS, задаваемое в строке 20 Листинг_3.

Другим решением бывает замена часто встречающихся чисел переменными. Например, 0 и 1 постоянно встречаются в листинге. Поэтому, например, если присвоить: LET M=0: LET J=1 и по всему тексту программы заменить 0 и 1 на M и J Вы получите существенную экономию памяти. Числа 0 и 1 могут заменяться иначе. 0 - NOT PI, а 1 - SGN PI. В то же время, если этот подход довести до неразумных пределов, он может сказаться на скорости работы программы.

Структура подпрограмм.

Подпрограмма "ПРОВЕРИТЬ" или "ОСМОТРЕТЬ" по-видимому, у Вас будет одной из крупнейших подпрограмм, но можно ускорить время её работы, если разбить её на несколько блоков. Так, например, это делает строка 1300 в демонстрационной программе, разветвляя исполнение в зависимости от номера объекта по разным ветвям. Но и дальнейшая разбивка этих ветвей тоже возможна.




СОДЕРЖАНИЕ:


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Свиток - подробное описание игры Chaos.
Вступление - содержание номера.
BBS-Лист - Список Vicomm-совместимых BBS.
Risk - мысли risk'a o genz'e 3.5
Программистам - Современные программы.

В этот день...   18 апреля