ZX-Ревю 1993 №9-10 1992 г.

Сделайте сами - программа для создания адвентюрных игр ABS.


СДЕЛАЙТЕ САМИ

(C) Т.Д. Фрост (T.D. FROST),1986.

(C) Адаптация, Алексеев А.Г.,1993.

(С) Авторизованный перевод, редактирование, "ИНФОРКОМ". 1993 г.

ADVENTURE GAMES Введение.

Те, кто интересуются адвентюрными играми, знают о существовании программ для автоматизированного создания таких игр - QUILL, GAC и др. Интерес к этим программам поддерживается прежде всего тем, что очень часто любителям игровых программ приходят в голову отличные сюжеты, рождаются готовые сценарии и человек хочет сам создать карту своего выдуманного мира, населить пещеры троллями, попрятать золото в сундуках и насытить игру хитроумными головоломками. Что делать в такой ситуации? Если Вы не программист, то дело ваше почти безнадежное.

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

Эта программа будет полезна и тем, кто просто интересуется вопросом "Как это делается?" Как устроены адвентюрные игры, как они работают - все это Вы узнаете, разобрав эту систему.

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

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

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

Структура системы.

Система ABS довольно объемна. Листинг 1 - это сама программа ABS. Листинги 2...5 -демонстрационная адвентюрная программа, показывающая, как пользоваться программой ABS. В них содержится вся необходимая для корневой программы информация - количество комнат, количество объектов, описания комнат и т.п. Под "комнатами" здесь понимаются конечно не физические комнаты, а локации, т.е. участки, из которых состоит игровое пространство - это может быть и лес и горы и борт космического корабля и действительно комнаты.

Во время работы демонстрационная программа выдает на экран описание текущей локации (а может выводиться графика, если она есть) и список объектов, видимых в данном месте. Программа задает вопрос: "ВАШИ ДЕЙСТВИЯ?" и ждет от Вас команды. Ваша команда типа: "ВЗЯТЬ ФАКЕЛ" печатается на экране, затем анализируется сначала глагол, потом существительное и исполняется программой.

Головная программа (Листинг 1) содержит кодировку часто встречающихся действий,

например "С" или "ИДТИ С" означает "ИДТИ НА СЕВЕР".

Листинги.

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

Программа русифицирована нашим традиционным способом с использованием утолщенного русско-латинского символьного набора в кодировке ASCII КОИ-7, сформированного в файл "chr" CODE.

Сначала введите Листинг_1. Он сохраняется на ленте прямой командой RUN 9990. Это "Мастер-копия" головной программы. Вы будете ею пользоваться всякий раз, когда захотите создать новую игру, а пока спрячьте эту кассету в надежном месте, сейчас она нам больше не понадобится.

Листинг_1. Программа "ABS". Мастер-копия. Файл "ABS".

1 GO TO 100

2 CLEAR 49999: LOAD "chr" CODE 50000

4 GO TO 0

5 GO TO 9990

8 POKE 23606,80: POKE 23607,194: RETURN

9 POKE 23606,0: POKE 23607,60: RETURN 40 CLS : POKE 33658,8: GO SUB 8

42 PRINT PAPER 0; INK 6; BRIGHT 1;AT 1,3;" ADVENTURE BUILDER SYSTEM " 44 RETURN

50 PRINT INK 2; BRIGHT 1; FLASH 1; AT 8,6;"ПОДОЖДИТЕ НЕМНОГО..."^ 10,5;"ИДЕТ ГЕНЕРАЦИЯ ДАННЫХ."

52 RESTORE 50: FOR X=64008 TO 64047: READ A: POKE X,A: NEXT X

54 DATA 254,226,40,15,254,195,40,15,254,204,40,15,254,203,40,15,195,48,250,62,126,24,10,62,

124,24,6,62,123,24,2,62,125,195,72,252,121,222,133,201 58 RESTORE 60: FOR X=64430 TO 65077: READ A: POKE X,A: NEXT X

60 DATA 205,190,251,62,21,50,60,250,24,33,58,137,92,254,2,192,62,3,50,137,92,229,6,0,205,0,

14,225,201,58,137,92,71,62,24,144,254,22,40,216

61 DATA 50,60,250,33,61,250,6,55,54,0,35,16,251,33,61,250,54,1,35,54,1,35,54,0,33,106,92,54,

0,62,22,215,58,60,250,215,62,0,215,62

62 DATA 62,215,62,22,215,58,60,250,215,58,61,250,215,60,50,61,250,62,42,215,1,0,0,205,61,31,

205,191,2,33,8,92,78,62,13,185,202,181,252,62

63 DATA 12,185,202,132,252,62,8,185,202,132,252,58,61,250,254,32,202,48,250,121,254,32,40,

13,254,230,212,44,250,254,128,210,8,250,79,24,9,79,58,61,250

64 DATA 254,3,218,48,250,65,62,22,215,58,60,250,215,58,61,250,61,215,60,50,61,250,120,245,

215,241,42,62,250,17,63,250,25,119,42,62,250,35,34

65 DATA 62,250,17,50,0,33,200,1,205,181,3,195,243,251,58,61,250,254,3,218,48,250,61,50,61,

250,62,22,215,58,60,250,215,58,61,250,215,61,50,61,250

66 DATA 62,32,215,42,62,250,1,62,250,9,54,0,58,62,250,61,50,62,250,195,120,252,58,61,250,

254,3,218,48,250,62,22,215,56,60,250,215,58,61,250

67 DATA 61,215,62,32,215,17,25,0,33,250,0,205,181,3,33,63,250,54,32,35,229,6,31,126,254,48,

56,3,35,16,248,225,17,100,250,52,31,144

68 DATA 6,0,184,250,251,252,126,18,35,19,16,250,24,17,79,71,126,18,35,19,16,250,62,0,145,71,

175,19,18,16,252,33,93,250,6,31,126,254,0,32

69 DATA 3,43,16,248,126,254,32,40,3,43,16,248,5,72,6,0,33,64,250,9,6,0,17,107,250,126,18,35,

19,16,250,33,0,0,17,100,250,6,0,26,190

70 DATA 32,10,35,19,16,248,126,50,114,250,24,17,72,6,0,9,35,62,199,190,40,2,24,225,33,114,

250,54,200,33,0,0,17,107,250,6,0,26,190,32

71 DATA 10,35,19,16,248,126,50,115,250,24,17,72,6,0,9,35,62,199,190,40,2,24,225,33,115,250,

54,201,58,115,250,71,62,0,184,216,33,24,251,58

72 DATA 115,350,6,0,79,9,62,1,190,192,58,115,250,6,0,128,50,115,250,201,33,0,0,6,0,54,0,35,

16,251,17,0,0,6,0,58,24,251,33,124,251

73 DATA 190,40,4,35,16,250,201,79,62,0,144,18,19,35,121,24,243,33,0,0,6,0,54,0,35,16,251,17,

0,0,6,0,62,99,33,124,251,190,40

74 DATA 4,35,16,250,201,79,62,0,144,18,19,35,121,24,243,17,7,0,33,0,0,6,0,58,24,251,190,40,

3,25,16,250,58,115,250,71,35,16,253,126

75 DATA 50,115,250,201,33,24,251,17,130,250,1,150,0,237,176,201,33,130,250,17,24,251,1,150,

0,237,176,201,33,24,251,6,150,54,0,35,16,251,1,24,251

76 DATA 62,0,2,33,99,0,9

80 RESTORE 80: FOR X=64048 TO 64059 82 READ Z: POKE X,Z: NEXT X 84 DATA 17,5,1,33,125,1,205,181,3,195,18,252 89 RETURN

100 BORDER 7: PAPER 7: INK 0: CLS : POKE 23658,8: GO SUB 8

105 GO SUB 40: GO SUB 50: GO SUB 40

106 FOR X=1 TO 11: BEEP .1,X: NEXT X

107 FOR X=10 TO 1 STEP -1: BEEP .1,X: NEXT X 110 PRINT AT 2,0;"

ВВЕДИТЕ ПОЛНОЕ КОЛИЧЕСТВО ГЛАГОЛОВ, ИСКЛЮЧАЯ:

ИДТИ, ВЗЯТЬ (БРАТЬ), ПОЛОЖИТЬ (БРОСИТЬ), ПРОВЕРЯТЬ, СМОТРЕТЬ, ИНВЕНТАРЬ (И), СТОП (КОНЕЦ), СОХРАНИТЬ, ЗАГРУЗИТЬ; А ТАКЖЕ БУКВ, ЗАДАЮЩИХ НАПРАВЛЕНИЕ: С(ЕВЕР), Ю(Г). В(ОСТОК), З(АПАД), (ВВЕР)Х, (В)Н(ИЗ) - ВСЕ ЭТО УЖЕ ВВЕДЕНО С ПОМОЩЬЮ КОДОВ:"

115 PRINT TAB 8 "ИДТИ.......0"

116 PRINT TAB 8 "ВЗЯТЬ......1"

117 PRINT TAB 8 "ПОЛОЖИТЬ...2"

118 PRINT TAB 8 "ПРОВЕРИТЬ..3"

119 PRINT TAB 8 "СМОТРЕТЬ...4"

120 PRINT TAB 8 "ИНВЕНТАРЬ..5"

121 PRINT TAB 8 "КОНЕЦ......6"

122 PRINT TAB 8 "СОХРАНИТЬ..7"

123 PRINT TAB 8 "ЗАГРУЗИТЬ..8"

125 INPUT V

126 LET V=V+28

127 GO SUB 40

128 PRINT INK 7; PAPER 2; BRIGHT 1;AT 5,2; "СИМВОЛЫ ИДЕНТИФИКАЦИИ КОМАНДЫ"

129 PRINT AT 8,0;"

ВВЕДИТЕ КОЛИЧЕСТВО СИМВОЛОВ, КОТОРЫЕ СЛУЖАТ ДЛЯ СРАВНЕНИЯ ВВЕДЕННОГО ГЛАГОЛА С ОРИГИНАЛОМ."

130 PRINT INK 2;AT 13,4; "ВВЕДИТЕ ЧИСЛО ОТ 3 ДО 7"

131 INPUT VL

132 IF VL<3 OR VL>7 THEN BEEP .5,20: GO TO 127

133 LET VP=VL+1: LET VPP=VP+1

134 LET DAV=64000-(V*VP) 140 GO SUB 40

150 PRINT AT 8,0;"

ВВЕДИТЕ КОЛИЧЕСТВО ОБ'ЕКТОВ, КОТОРЫЕ БУДУТ ВХОДИТЬ В ИНВЕНТАРЬ ИГРЫ:"

155 INPUT MOB

156 IF MOB>50 THEN PRINT INK 2;AT 12,1; "ИЗВИНИТЕ, НО ЭТО СЛИШКОМ МНОГО!": BEEP .5,20: PAUSE

50: GO TO 140

160 GO SUB 40

161 PRINT INK 7; PAPER 1; BRIGHT 1;AT 5,2; "СИМВОЛЫ ИДЕНТИФИКАЦИИ ОБ'ЕКТА"

162 PRINT AT 8,0; "

ВВЕДИТЕ КОЛИЧЕСТВО СИМВОЛОВ, ПО КОТОРЫМ СУЩЕСТВИТЕЛЬНОЕ СРАВНИВАЕТСЯ С ОРИГИНАЛОМ"

163 PRINT INK 1; AT 13,4;"ВВЕДИТЕ ЧИСЛО ОТ 3 ДО 7"

164 INPUT NL

165 IF NL<3 OR NL>7 THEN BEEP .5,20: GO TO 160

166 LET NP=NL+1: LET NPP=NP+1

170 GO SUB 40

171 PRINT AT 8,0;" ВВЕДИТЕ МАКСИМАЛЬНУЮ ДЛИНУ ОПИСАНИЯ ОБ'EКTA:" 175 INPUT L

176 IF L>32 THEN PRINT INK 2;AT 12,1;"МАКСИМАЛЬНАЯ ДЛИНА - ТОЛЬКО 32!": BEEP .5,20: PAUSE 50:GO TO 170

179 LET AYAS=0

180 GO SUB 40

190 PRINT AT 8,0;"

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

ПО ХОДУ ИГРЫ, НАПРИМЕР:"' INK 1'TAB 5;"ФАКЕЛ - ГОРЯЩИЙ ФАКЕЛ"' INK 0'"ЕСЛИ ЭТО НЕ ТРЕБУЕТСЯ, ВВЕДИТЕ 0"

195 INPUT MCOB

196 IF AYAS=0 AND MCOB>7 THEN PRINT INK 2; AT 19,5;"ВЫ АБСОЛЮТНО УВЕРЕНЫ?": BEEP .5,20:

PAUSE 50: LET AYAS=1: GO TO 180 200 GO SUB 40 210 PRINT AT 8,0;"

ВВЕДИТЕ ЧИСЛО ПРОЧИХ СЛОВ, КОТОРЫЕ ПО ВАШЕМУ ЖЕЛАНИЮ ДОЛЖНЫ РАСПОЗНАВАТЬСЯ ПРОГРАММОЙ:" 215 INPUT MON 220 LET N=MOB+MON+22 225 LET DAN=DAV-(N*NP)-5 230 GO SUB 40 235 PRINT AT 8,0;"

ВВЕДИТЕ МАКСИМАЛЬНОЕ ЧИСЛО ОБ'ЕКТОВ, КОТОРЫЕ ОДНОВРЕМЕННО МОЖНО ВЗЯТЬ:" 240 INPUT MAX 245 GO SUB 40

255 PRINT AT 8,0;"ВВЕДИТЕ КОЛИЧЕСТВО ЛОКАЦИЙ:" 260 INPUT NOR 265 GO SUB 40

270 PRINT PAPER 2; INK 7; BRIGHT 1;AT 5,8; "ФАКТОР СКРОЛЛИНГА"

272 PRINT AT 8,0;"

ВЫ МОЖЕТЕ СДЕЛАТЬ ТАК, ЧТОБЫ НЕСКОЛЬКО ВЕРХНИХ СТРОК НЕ СКРОЛЛИРОВАЛИСЬ ПРИ ПЕЧАТИ НА ЭКРАНЕ ДЛИННЫХ СООБЩЕНИЙ. СКОЛЬКО СТРОК ОСТАВИТЬ НЕПОДВИЖНЫМИ, РЕШИТЕ САМИ."

273 PRINT '"ЕСЛИ ТАКОЙ ЭФФЕКТ НЕ НУЖЕН - 0" 277 INPUT SCRO

279 IF SCRO>15 THEN PRINT INK 2; AT 18,7; "ЭТО СЛИШКОМ МНОГО!": BEEP .5,20: PAUSE 50: GO TO

265

280 LET SCRO=23-SCRO 285 GO SUB 40

290 PRINT AT 8,0;"В КАКОЙ ЛОКАЦИИ НАЧИНАЕТСЯ ИГРА?" 295 INPUT BEG

330 POKE 64821,DAV-256*INT (DAV/256): POKE 64822,INT (DAV/256)

335 POKE 64860,DAN-256*INT (DAN/256): POKE 64861,INT (DAN/256)

340 POKE 64903,MCOB: POKE 64924,(MOB-MCOB): POKE 64934, MOB: POKE 54944,MOB

345 POKE 64960,(MOB+1): POKE 64972,MOB: POKE 64997,(MOB+1)

350 POKE 64982,MOB: POKE 65012,MOB: POKE 64453,SCRO

355 POKE 65072, BEG

360 POKE 64750,VL: POKE 64772,VL: POKE 64827,VL: POKE 64810,NL:POKE 64866,NL

365 GO SUB 40

370 PRINT AT 6,0; "

ЕСЛИ ВСЕ ДАННЫЕ ВЫ ВВЕЛИ КАК ПОЛОЖЕНО, НАЖМИТЕ <ENTER> И НАЧНЕТСЯ ГЕНЕРАЦИЯ СИСТЕМНОГО КОДА."

372 PRINT INK 2;AT 13,4; "ИНАЧЕ ВВЕДИТЕ <S> - STOP"

373 INPUT LINE A$

374 IF A$="S" THEN GO TO 9999 500 GO SUB 40

502 PRINT INK 2; BRIGHT 1; FLASH 1;AT 8,12; "ЖДИТЕ...";AT 10,5; " ИДЕТ ГЕНЕРАЦИЯ ДАННЫХ."

505 RESTORE 1000

506 DIM V$(V,VL)

FOR Y=1 TO V READ V$(Y) FOR X=1 TO VL

POKE (((DAV-VPP)+(Y*VP)+X)),CODE V$(Y,X)

IF CODE V$(Y,X)=32 THEN POKE (((DAV-VPP)+(Y*VP)+X)),0

NEXT X

READ Z

POKE ((DAV-1)+(Y*VP)),Z NEXT Y

POKE (DAV+(V*VP)),199 DIM O$((MOB),L) RESTORE 2000 DIM N$((MOB+NON+21),NL) IF MCOB=0 THEN GO TO 670 FOR Y=1 TO MCOB READ N$(Y) FOR X=1 TO ML

POKE (((DAN-MPP)+(Y*NP)+X)),CODE N$(Y,X)

IF CODE N$(Y,X)=32 THEN POKE (((DAN-NPP)+(Y*NP)+X)),0

NEXT X

READ Z

POKE ((DAN-1)+(Y*NP)),Z

READ B$

LET O$(y)=B$

READ B$

LET O$(Y+MOB-MCOB)=B$ NEXT Y

FOR X=0 TO ((MCOB*NP)+1)

POKE (DAN+X)+((MOB-MCOB)*NP),PEEK (DAN+X)

NEXT X

FOR Y=(MCOB+1) TO (MOB-MCOB) READ N$(Y) FOR X=1 TO NL

POKE (((DAN-NPP)+(Y*NP)+X)),CODE N$(Y,X)

IF CODE N$(Y,X)=32 THEN POKE (((DAN-NPP)+(Y*NP)+X)),0

NEXT X

READ Z

POKE ((DAN-1)+(Y*NP)),Z

READ B$

LET 0$(Y)=B$

NEXT Y

FOR Y=(MOB+1) TO (MOB+NON+21) READ N$(Y) FOR X=1 TO NL

POKE (((DAN-NPP)+(Y*NP)+X)),CODE N$(Y,X)

IF CODE N$(Y,X)=32 THEN POKE (((DAN-NPP)+(Y*NP)+X)),0

NEXT X

READ Z

POKE ((DAN-1)+(Y*NP)),Z NEXT Y

POKE (DAN+(N*NP)),199

RESTORE 3000

LET DMOV=DAN-(NOR*7)-5

LET DMOVL=DMOV-256*INT (DMOV/256): LET DMOVM=INT(DMOV/256)

POKE 65009,DMOVL: POKE 65010,DMOVM

FOR Y=DMOV TO (DMOV+(NOR*7)-1)

READ A: POKE Y,A: NEXT Y

RESTORE 4000

FOR X=65078 TO (65078+((MOB-1)*4)) STEP 4 POKE X,35: POKE X+1,62: POKE X+3,119 READ A: POKE X+2,A NEXT X

POKE 65078+(MOB*4),201 LET PBS=65078+(MOB*4)+5

LET PBSL=FBS-256*INT (PBS/256): LET PBSM=INT (PBS/256)

825 POKE 64931,PBSL: POKE 64932,PBSM

826 POKE 64941,PBSL: POKE 64942,PBSM

827 POKE 64969,PBSL: POKE 64970,PBSM

828 POKE 64979,PBSL: POKE 64980,PBSM 860 FOR X=1 TO 11: BEEP .1,X: NEXT X

865 FOR X=10 TO 1 STEP -1: BEEP .1,X: NEXT X

867 REM USE BY BASIC ==========

868 LET SAVE=DMOV-10: LET LEN=65368-SAVE

869 LET SAVEL=SAVE-256*INT (SAVE/256): LET SAVEM=INT (SAVE/256)

870 LET LENL=LEN-256*INT (LEN/256): LET LENM=INT (LEN/256)

871 RESTORE 874

872 FOR X=0 TO 9

873 READ Z: POKE (64116+X),Z: NEXT X

874 DATA SAVEL,SAVEM,MAX,MOB,LENL,LENM,PBSL,PBSM,DMOVL,DMOVM

875 GO SUB 40

885 PRINT AT 8,0;"

ПОДГОТОВЬТЕСЬ К ВЫГРУЗКЕ НА ЛЕНТУ. НАЖМИТЕ <ENTER>, КОГДА БУДЕТЕ ГОТОВЫ."

886 PRINT INK 2; AT 12,0;"

ЕСЛИ НЕ УВЕРЕНЫ, ЧТО ВСЕ ПРАВИЛЬНО, ТО ВВЕДИТЕ <S> - STOP."

887 INPUT A$

890 IF A$="S" THEN GO TO 9999 900 GO SUB 40

910 PRINT AT 8,11;"ЗАПИСЬ..." 915 SAVE "SYSTEM"CODE SAVE,LEN 920 SAVE "Objects" DATA O$() 925 PRINT AT 8,0;"

ПРЕЖДЕ, ЧЕМ БЕЙСИК-ПРОГРАММА И КОДЫ БУДУТ ЗАГРУЖЕНЫ В ПАМЯТЬ,

ДОЛЖНО БЫТЬ ВЫПОЛНЕНО:"' INK 2'TAB 10;"CLEAR ";SAVE-1 927 BEEP .5,20: PAUSE 50 930 PRINT PAPER 2; INK 7; BRIGHT 1;AT 15,0;" ОТМОТАЙТЕ ЛЕНТУ И ВЫПОЛНИТЕ ВЕРИФИКАЦИЮ " 932 BEEP .5,20: PAUSE 50 935 PRINT AT 18,0;"

НАЖМИТЕ ЛЮБУЮ КЛАВИШУ, КОГДА БУДЕТЕ ГОТОВЫ." 940 PAUSE 0 945 GO SUB 40

950 PRINT AT 8,9; "ВЕРИФИКАЦИЯ..." 955 VERIFY "system"CODE SAVE,LEN 960 VERIFY "objects" DATA O$() 965 CLS

970 GO TO 9999

999 REM ГЛАГОЛЫ DATA 0-8 ======

1000 DATA "ИДТИ",0,"СЕВЕР",0,"С",0,"ЮГ",0,"Ю",0,"ВОСТОК",0,"В",0,"НАПРАВО",0,"ЗАПАД",0,"3"

0,"НАЛЕВ0",0,"ВВЕРХ",0,"X",0,"ВНИЗ",0,"N",0,"ВЗЯТЬ",1,"БРАТЬ",1,"П0Л0ЖИТЬ",2, "БРОСИТЬ",2,"ПРОВЕРИТЬ",3,"ОСМОТРЕТЬ",3,"СМОТРЕТЬ",4,"ИНВЕНТАРЬ",5,"И",5,"СТОП",6, "КОНЕЦ ",6,"СОХРАНИТЬ",7,"ЗАГРУЗИТЬ",8 1002 REM ДАННЫЕ ДЛЯ ПРОЧИХ ГЛАГОЛОВ (КОМАНД) =================

1999 REM ОБ'ЕКТЫ, КОТОРЫЕ ИЗМЕНЯЮТ СВОЕ ОПИСАНИЕ В ХОДЕ ИГРЫ== 2019 REM ПРОЧИЕ ОБ'ЕКТЫ ========

2189 REM ПРОЧИЕ СЛОВА. РАСПОЗНАВАЕМЫЕ ПРОГРАММОЙ ==============

2190 DATA "СЕВЕР",M0B+1,"С",M0B+1,"ЮГ",M0B+2,"Ю",M0B+2,"В0СТ0К",M0B+3,"В",M0B+3,"НАПРАВ0",

M0B+3,"ЗАПАД",M0B+4,"3",M0B+4,"НАЛЕВ0",M0B+4,"ВВЕРХ",M0B+5,"Х",M0B+5,"ВНИЗ",M0B+6, "Н",M0B+6,"СМ0ТРЕТЬ" ,99,"ИНВЕНТАРЬ",99,"И",99,"СТ0П",99,"К0НЕЦ",99,"С0ХРАНИТЬ",99, "3АГРУЗИТЬ",99

2999 REM ДАННЫЕ О ВОЗМОЖНЫХ ПЕРЕМЕЩЕНИЯХ =====================

3999 REM ИСХОДНОЕ РАЗМЕЩЕНИЕ ОБ'ЕКТОВ =======================

9990 GO SUB 40: SAVE "ABS" LINE 2

9991 REM

9993 PRINT AT 8,0;"0ТМ0ТАЙТЕ ЛЕНТУ ДЛЯ ВЕРИФИКАЦИИ."

9994 BEEP .1,20: PAUSE 50

9995 PRINT AT 12,0;"НАЖМИТЕ ЛЮБУЮ КЛАВИШУ, КОГДА БУДЕТЕ ГОТОВЫ.": PAUSE 0

9996 GO SUB 40

9997 PRINT AT 8,7; "ВЕРИФИКАЦИЯ......."

9998 VERIFY "ABS"

9999 BORDER 7: PAPER 7: INK 0

Теперь дополните текст Мастер-копии строками данных для демонстрационной программы из Листинга_2 или наберите их отдельно (и сохраните на ленте). В последней случае загрузите мастер-копию, объедините ее при помощи MERGE с данными для демонстрационной игры из Листинга_2 и сохраните полученную программу командой RUN 9990. Эту выгрузку надо делать на рабочую ленту (назовем ее лента_А).

Листинг_2. Данные для демонстрационной игры. (Объединить с файлом "ABS")

1003 DATA "ОТКРЫТЬ",9,"ОТПЕРЕТЬ",Ю,"КОПАТЬ",11,"ВЫКОПАТЬ",11,"3АЖЕЧЬ",12,"ГАСИТЬ",13,

"ПОГАСИТЬ",13,"ПОДНЯТЬСЯ",14,"ЗАЛЕЗТЬ",14, "ЛЕЗТЬ",14,"СПУСТИТЬСЯ",15,"СЛЕЗТЬ",15

1005 DATA "ЗАКРЫТЬ",16,"ШВЫРНУТЬ",17,"ЗАКОПАТЬ",18,"ЗАПЕРЕТЬ",19,"ОДЕТЬ",20,"НАДЕТЬ",20, "СНЯТЬ",21

1007 DATA "ПРЫГАТЬ",22,"СПРЫГНУТЬ",22,"ЗАПРЫГНУТЬ",22,"ИСПОЛЬЗОВАТЬ",23

2000 DATA "ПЛЕД",1,"ШЕРСТЯНОЙ ПЛЕД","ПЛЕД, НАДЕТЫЙ НА ПЛЕЧИ"

2001 DATA "ФАКЕЛ",2,"МАЛЕНЬКИЙ ФАКЕЛ","ГОРЯЩИЙ ФАКЕЛ"

2020 DATA "ШКАТУЛКА",3,"ДЕРЕВЯННАЯ ШКАТУЛКА"

2021 DATA "ЛОПАТА",4,"КОРОТКАЯ ЛОПАТА"

2022 DATA "КЛЮЧ",5,"БРОНЗОВЫЙ КЛЮЧ"

2023 DATA "ЩЕПКИ",6,"ДЕРЕВЯННЫЕ ЩЕПКИ"

2024 DATA "АЛМАЗ",7,"КРУПНЫЙ АЛМA3"

2191 DATA "ДВЕРЬ",16,"БУФЕТ",17,"ЛУЖАЙКА",18,"СТУПЕНИ",19,"ЛЕСТНИЦА",20

2192 DATA "ВОРОТА",21,"КОПАТЬ",22,"ЯМУ",22,"САД",23,"ПОЛЕ",24 2194 DATA "СЕЙФ",25,"ПЯТНО",26," ПРЫГАТЬ",27

3001 DATA 1,0,3,0,0,0,0

3002 DATA 2,0,0,0,0,0,6

3003 DATA 3,1,7,0,0,0,0

3004 DATA 4,0,9,5,0,0,0

3005 DATA 5,0,10,0,4,0,0

3006 DATA 6,0,0,7,0,2,11

3007 DATA 7,3,13,8,6,0,0

3008 DATA 8,0,0,9,7,0,0

3009 DATA 9,4,0,10,8,0,0

3010 DATA 10,5,15,0,9,0,0

3011 DATA 11,0,0,0,0,6,0

3012 DATA 12,0,0,13,0,0,0

3013 DATA 13,7,0,14,12,0,0

3014 DATA 14,0,0,15,13,0,0

3015 DATA 15,10,0,0,14,0,0 4000 DATA 4,10,0,1,0,0,0,0,0

Теперь наберите загрузчик будущей демонстрационной игры - это Листинг_3 и сохраните его командой RUN 200. Эту выгрузку делаем на новую ленту (Ленту_B). Ленту назад не отматывайте.

Листинг_3. Загрузчик демонстрационной игры. Файл "INTRO".

10 CLEAR 49999: LOAD "chr"CODE 50000

20 BORDER 7: PAPER 7: INK 0: CLS : POKE 23606,80: POKE 23607,194 30 PRINT INK 1; BRIGHT 1;AT 2,6;"ДЕМОНСТРАЦИОННАЯ ИГРА"

40 PRINT AT 4,11;"СОСТАВЛЕНА..... С ИСПОЛЬЗОВАНИЕМ ПРОГРАММЫ"

50 PRINT PAPER 0; INK 6; BRIGHT 1;AT 7,3;" ADVENTURE BUILDER SYSTEM

60 PRINT AT 9,5; "T.D. FROST + ""ИНФОРКОМ......

70 PRINT PAPER 0; INK 5; BRIGHT 1;AT 12,9;" ЗАГРУЗКА... "

80 PRINT INK 1;AT 15,0;"

ЦЕЛЬ ЭТОЙ КОРОТКОЙ ПРОГРАММЫ ОЧЕНЬ ПРОСТА. ВАМ НАДО РАЗЫСКАТЬ КРУПНЫЙ АЛМАЗ И ЗАВЛАДЕТЬ ИМ." 90 PRINT AT 19,0; INK 7; 100 LOAD "adventure" 200 SAVE "INTRO" LINE 10

Сейчас наберите сам текст демонстрационной игры - Листинг_4. Точнее сказать, это не вся программа, а только первая ее часть. Вторую - мы приведем в следующем выпуске "ZX-РЕВЮ" (то будет Листинг_5). Но для упрощения отладки мы рекомендуем Вам и набирать две части программы по отдельности. Когда первая часть заработает, можно продолжить набор или догрузить вторую часть при помощи MERGE.

Листинг_4 Текст первой части демонстрационной игры. Файл "adventure".

45 LET Я$(1)="НЕ ПОЛУЧАЕТСЯ." 50 FOR X=1 TO 4

52 IF R$(X,1) = "a" THEN LET X=5: INK 6: GO TO 195 54 RANDOMIZE USR SS: PRINT INK 5;R$(X): LET R$(X)="*" 56 NEXT X 58 GO TO 195

100 BORDER 0: PAPER 0: INK 6: BRIGHT 1: CLS

103 GO SUB 7000+PEEK F*10

104 IF PEEK F=11 AND PEEK (0+9)<>99 THEN GO TO 195

105 RANDOMIZE USR 64930

109 PRINT TAB 3; PAPER 1;"A G"

110 PRINT TAB 3; PAPER 1; "A"; INK 7;" В ПОЛЕ ВАШЕГО ЗРЕНИЯ: ";INK 6;"G" 115 LET HE=0

120 FOR X=0 TO (M0B-1)

122 IF PEEK (PBS+X)=0 THEN LET X=M0B: GO TO 128

124 RANDOMIZE USR SS: PRINT TAB 3; PAPER 1; INK 6;"A"; INK 7; " ";0$(PEEK (PBS+X)); INK

6;"G": LET HE=HE+1 126 NEXT X

128 IF HE=0 THEN PRINT TAB 3;PAPER 1; INK 6;"A"; INK 7;"НЕТ НИЧЕГО ИНТЕРЕСНОГО"; INK 6;"G"

129 PRINT TAB 3; PAPER 1;"CBBBBBBBBBRBBBBBBBBBBBBBF": POKE 64453,PEEK 23689-1

195 RANDOMIZE USR SS: PRINT INK 4;"ВАШИ ДЕЙСТВИЯ?": BEEP .1,20

196 INK 6

200 RANDOMIZE USR 64459: PRINT

202 LET VB=PEEK 64114

204 LET N0=PEEK 64115

206 REM ANY SPECIALS? =========

208 IF PEEK F=11 AND PEEK (0+9)<>99 AND VB<>0 AND (VB<>12 AND VB<>13 AND VB<>14 AND VB<>6 AND VB<>5 AND VB<>7 AND VB<>6) THEN LET R$(1)="ЗДЕСЬ НЕ ОБОЙТИСЬ БЕЗ СВЕТА!": GO TO 50

228 IF VB=200 OR NO=201 THEN GO TO 45 235 GO TO 1000+VB*100 1000 IF N0>M0B+6 THEN GO TO 100 1002 LET N0=N0-M0B: POKE 64115,N0

1005 IF ((PEEK F=8 AND N0=3) OR (PEEK F=9 AND N0=4)) AND PEEK (F+4)=0 THEN LET R$(1)="ДВЕРЬ ЗАКРЫТА.": GO TO 50

1010 IF ((PEEK F=14 AND N0=3) OR (PEEK F=15 AND N0=4)) AND PEEK (F+7)=0 THEN LET

R$(1)="В0Р0ТА ЗАКРЫТЫ.": GO TO 50 1020 IF (PEEK F=7 AND PEEK (F+5)=1) OR (PEEK F=15 AND PEEK (F+6)=1) THEN CLS : PRINT AT 10,16;FLASH 1;"*": GO SUB 8800: CLS : PRINT AT 2,1; "ВЫ НЕОЖИДАННО СВАЛИЛИСЬ В ЯМУ."^ 3,1; "КОТОРУЮ САМИ ЖЕ ЗДЕСЬ ВЫКОПАЛИ" ;AT 4,1;"И СЛОМАЛИ НОГУ.": BEEP 1.2,28: PAUSE 100: BEEP .5,15: GO TO 1602 1090 RANDOMIZE USR 65005

1092 IF PEEK 64115=0 THEN LET R$(1)="ТУДА ВАМ НЕ ПРОЙТИ.": GO TO 50

1093 POKE F,PEEK 64115

1094 GO TO 100

LET R$(1)="B СЛЕДУЮЩЕМ ВЫПУСКЕ ""ZX-РЕВЮ......: GO TO 50

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

"O.K. ТЕПЕРЬ ДВЕРЬ ОТКРЫТА.": GO TO 50 IF PEEK F=14 AND NO=21 AND PEEK (F+7)=0 THEN LET Я$(1)="НЕ ОТКРЫВАЮТСЯ, ЗАКРЫТЫ ИЗНУТРИ.": GO TO 50

IF PEEK F=15 AND NO=21 AND PEEK (F+7)=0 THEN POKE (F+7),1: LET R$(1)="O.K. ТЕПЕРЬ

ВОРОТА ОТКРЫТЫ.": GO TO 50 IF (((PEEK F=8 OR PEEK F=9) AND PEEK (F+4)=1 AND NO=16) OR (((PEEK F=14 OR PEEK F=15) AND PEEK (F+7)=1) AND NO=21)) THEN LET Р$(1)="ДА ВЕДЬ И ТАК УЖЕ ОТКРЫТО!": GO TO 50

LET г$(1)="В СЛЕДУЮЩЕМ ВЫПУСКЕ ""ZX-РЕВЮ......: GO TO 50

PRINT T$ PRINT "

AВЫ НАХОДИТЕСЬ В ЧИСТОМ И АККУ-G AРАТНОМ АМБАРЕ. ФЕРМЕР, КОТОРО-G AМУ ОН ПРИНАДЛЕЖИТ, ПО-ВИДИМОМУG AЛЮБИТ СВОЕ ДЕЛО. G"

PRINT B$ RETURN PRINT T$ PRINT "

AЗАБРАВШИСЬ ПО ЛЕСТНИЦЕ НАВЕРХ,G AВЫ ПОПАЛИ КАК БЫ НА ОТКРЫТЫЙG AЧЕРДАК. СКОРЕЕ ЕГО МОЖНО ОПИ-G AСАТЬ, КАК БОЛЬШОЕ ХРАНИЛИЩЕG AНАД КОМНАТОЙ. G"

PRINT B$ RETURN PRINT T$ PRINT "

AВЫ ВЫШЛИ НА ДВОР ФЕРМЫ. НИКА-G AКИХ ЖИВОТНЫХ НЕ ВИДНО. НА СЕ-G AВЕРЕ НАХОДИТСЯ АМБАР, НА ЮГЕ -G A-ПОЛЕ. G"

PRINT B$ RETURN PRINT T$ PRINT "

AУЮТНАЯ ГОСТИННАЯ КРЕСТЬЯНСКОГОG AДОМА. ВЫ ЧУВСТВУЕТЕ НА СЕБЕG AЧЕЙ-ТО ВЗГЛЯД. G"

PRINT B$ RETURN PRINT T$ PRINT "

AКАЖЕТСЯ, ЧТО ЭТОЙ СТОЛОВОЙG AКОМНАТОЙ ДАВНО НИКТО НЕ ПОЛЬ-G AЗОВАЛСЯ. НАВЕРНОЕ, ЗДЕСЬ HИKTOG AНЕ ЖИВЕТ. G"

PRINT B$ RETURN PRINT T$ PRINT "

AКОНЮШНЯ СОВЕРШЕННО ПУСТА. HETG AДАЖЕ ХАРАКТЕРНОГО ЗАПАХА ЖИ-G AВОТНЫХ. ЛЕСТНИЦА ВЕДЕТ НА ЧEP-G AДАК, ВИДНЫ ТАКЖЕ СТУПЕНИ^ AСКРЫВАЮЩИЕСЯ ГДЕ-ТО ВНИЗУ, ВG AТЕМНОТЕ. G"

PRINT B$ RETURN PRINT T$ PRINT "

АВЫ ВЫШЛИ В ОТКРЫТОЕ ПОЛЕ. OHOG АБЫЛО НЕДАВНО ВСПАХАНО, НО НИ-G

AЧЕГ0 ПОСАЖЕНО НЕ БЫЛО. М0ЖH0G AИДТИ В ЛЮБОМ НАПРАВЛЕНИИ. G" PRINT B$ RETURN PRINT T$ PRINT "

AВЫ НАХОДИТЕСЬ У ДВЕРИ ФEPМЕP-G AСК0Г0 ДОМА. ДОМ СДЕЛАН 0ЧЕНЬG AД0БР0ТН0 И КРЕПКО, КАК БУД^ AХ0ЗЯЕВАМ БЫЛО ОТ ЧЕГО СКРЫ-G AВАТЬСЯ. G"

PRINT B$ RETURN PRINT T$ PRINT "

AПЕРЕД ВАМИ НЕБОЛЬШАЯ ПРИХ0ЖАЯ.G AВ УГЛУ СТОИТ БУФЕТ И Б0ЛЬШЕG AНИЧЕГ0 ЗДЕСЬ НЕТ. НА B0CT0КEG AКУХНЯ, НА СЕВЕРЕ - ГОСТИННАЯ. G" PRINT B$ RETURN PRINT T$ PRINT "

AКУХНЯ СВЕРКАЕТ БЕЛИЗНОЙ И ЧИ-G AСТ0Т0Й. В ВОЗДУХЕ 0ПРЕДЕЛЕНН0G AЧУВСТВУЕТСЯ ЗАПАХ ЧЕГО-ТО ПРИ-G AЯТН0Г0. G"

PRINT B$ RETURN

IF PEEK (0+9)<>99 THEN PRINT TAB 5; PAPER 7; INK 0;"ЗДЕСЬ НИЧЕГО HE ВИДНО! ": RETURN PRINT T$ PRINT "

AB ОТЛИЧИЕ ОТ БОЛЬШИНСТВА ОБЫЧ-G AНЫХ ПОГРЕБОВ, ЭТОТ - ЯВНО НЕG AИСП0ЛЬЗУЕТСЯ ДЛЯ ХРАНЕНИЯ ВСЯ-G AКИХ ЗАПАСОВ. А В УГЛУ М0ЖН0G AРАЗГЛЯДЕТЬ БОЛЬШОЙ СТАРОМОДНЫЙ AСЕЙФ СО ВСТРОЕННЫМ В НЕ^ AБР0НЗ0ВЫМ ЗАМКОМ. G"

PRINT B$ RETURN PRINT T$ PRINT "

AЭТ0 ТУПИК. МОЖНО БЫЛО СЮДА BO-G A0БЩЕ НЕ ПРИХОДИТЬ. G"

PRINT B$ RETURN PRINT T$ PRINT "

AЭТА ОЧЕНЬ УЗКАЯ ДОРОГА ВЕДЕТ CG AВ0СТ0КА НА ЗАПАД. НО, КАЖЕТСЯ,G AМ0ЖН0 ПРОЙТИ И НА СЕВЕР. G"

PRINT B$ RETURN PRINT T$ PRINT "

AД0Р0ГА УПИРАЕТСЯ В ВОРОТА, 3AG AНИМИ РАСПОЛОЖЕН ПРИУСАДЕБНЫЙG AСАД. G"

PRINT B$ RETURN PRINT T$ PRINT "

AЭТ0 ДОВОЛЬНО ПУСТЫННЫЙ САД,G A^TOM СКОРЕЕ ПОХОЖ НА ЛУЖАЙ-G

AW С НЕСКОЛЬКИМИ ЦВЕТОЧНЫМИG AКЛУМБАМИ. ЗДЕСЬ БЫЛО БЫ COBCEMG AКРАСИВО, ЕСЛИ БЫ НЕ БЕСЦВЕТНОЕG AВЫТОПТАННОЕ ПЯТНО ПЕРЕД BOPO-G AТАМИ, ВЕДУЩИМИ НА ЗАПАД. G"

7152 PRINT B$ 7159 RETURN 8800 FOR X=-5 TO 15 8802 BEEP .02,X: NEXT X 8804 FOR X=14 TO -5 STEP -1 8806 BEEP .02,X: NEXT X 8808 RETURN

9940 REM СТАРТ ИГРЫ ============

9950 LOAD "system"CODE

9955 LOAD "objects" DATA O$()

9956 LET F=64280: LET O=64379: LET SS=64440

9957 LET MAX=PEEK 64118: LET MOB=PEEK 64119

9958 LET PBS=256*PEEK 64123+PEEK 64122

9959 LET SAVE=256*PEEK 64117+PEEK 64116: LET LEN=256*PEEK 64121+PEEK 64120

9960 LET DMOV=256*PEEK 64125+PEEK 64124

9961 POKE 64130,0 9965 DIM R$(4,32)

9970 FOR X=1 TO 4: LET R$(X,1)="*": NEXT X

9975 BORDER 0: PAPER 0: INK 6: BRIGHT 1: CLS

9976 PRINT AT 8,10; "ПОДГОТОВКА..." 9980 RANDOMIZE USR 65058

9984 RESTORE 9987

9985 POKE 23675,88: POKE 23676,255: FOR X=USR "A" TO USR "A"+63

9986 READ Z: POKE X,Z: BEEP .005,20: NEXT X

9987 DATA 128,128,128,128,128,128,128,128,0,0,0,0,0,0,0,255,128,128,128,128,128,128,128,255,

255,128,128,128,128,128,128,128,255,1,1,1,1,1,1,1,1,1,1,1,1,1,1,255,1,1,1,1,1,1,1,1, 255,0,0,0,0,0,0,0

9988 LET T$="DHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHE": LET B$="CBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBF":

LET VB=1

9989 GO TO 100

9990 SAVE "adventure" LINE 9940

9991 CLS

9993 PRINT BRIGHT 1;AT 8,0;"ОТМОТАЙТЕ ЛЕНТУ ДЛЯ ВЕРИФИКАЦИИ."

9994 BEEP .1,20: PAUSE 50

9995 PRINT AT 12,0;" НАЖМИТЕ ЛЮБУЮ КЛАВИШУ, КОГДА БУДЕТЕ ГОТОВЫ.": PAUSE 0

9996 VERIFY "adventure"

9999 BORDER 7: PAPER 7: INK 0

Набрав первую часть демонстрационной программы, сохраните ее командой RUN 9990 на ленту_B (сразу же за Листингом_3), и ленту назад не отматывайте.

Пока с вводом программ достаточно, а сейчас некоторые пояснения к листингам 1-4.

Работа с листингами.

Загрузите программу с ленть^, запустите ее и в ответ на запросы программы введите: 23,4,9,4,22,2,13,2,15,0,7 (немного ниже мы дадим подробные комментарии к этим числам). Так закончится подготовка необходимых данных, программа сама укажет Вам, когда надо произвести выгрузку блоков кодов и данных - выгружаются 2 блока. Эту отгрузку надо произвести на ленту_В, (следом за листингами 3 и 4).

Теперь мы будем работать с Лентой_В. Отмотайте ее в начало и загрузите. После окончания загрузки основной Бейсик-программы демонстрационной игры (Лист_4). Она стартует со строки 9940, загружая блок кодов и данные. После этого начнется подготовка данных, о чем свидетельствует табличка на экране, а затем игра начинается.

Вы уже можете начать исследование игровой ситуации. Можете пройти по всем локациям, все посмотреть, на Вас никто не будет нападать, правда Вы не сможете делать никаких действий, кроме "ОТКРЫТЬ", но этого должно быть достаточно для того, чтобы отладить БЕЙСИК-программу (листинг_4) и удалить из нее все ошибки, допущенные при

наборе.

Головная программа ABS.

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

1. Количество прочих глаголов. (23). Эти глаголы заносятся в строки DATA 1003...1999 (Листинг_2) Например:

DATA "0ТКРЫТЬ",9,"0ТПЕРЕТЬ",10

Формат: глагол (полностью) + присвоенный ему номер. Поскольку номера с 0...по 8 уже присвоены стандартным командам, то первая пользовательская команда (глагол) начинается с номера 9. Слова синонимы, такие как ГАСИТЬ, ПОГАСИТЬ, имевшие одинаковое действие, но разное написание, вводятся порознь, но им присваивается один и тот же номер. Тем не менее, в ответ на запрос "Количество глаголов?" их надо считать как отдельные слова.

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

Основные глаголы заданы в строке 1000 Мастер-копии программы ABS (Листинг_1). Основные существительные - в строке 2190 этого же листинга.

Такие действия, как ИДТИ НА ВОСТОК, можно вводить также и ИДТИ НА В, или ИДТИ В, или ВОСТОК, или только буквой В, а также словами ИДТИ НАПРАВО или просто НАПРАВО. При помощи одного слова можно также проверить ИНВЕНТАРЬ (или просто И), ввести СТОП и другие - те, которые одновременно заданы и в строке 1000 и в строке 2190. А вот глаголы взять или ПОЛОЖИТЬ не могут использоваться отдельно, без существительного и, поэтому, они не заданы в строке 2190.

На тот случай, если Вы захотите изменить основные глаголы, заданные в Листинге_1, в строке 1000, обращаем Ваше внимание на то, что общее количество глаголов в строке 1000 отражено также в строке 126 этого листинга. Это число - 28. Если будете изменять данные в строке 1000, проконтролируйте и число в строке 126. Аналогично и для строки 2190 - полное число слов в этой строке отражено числовыми параметрами в строках 603 и 730. Это число - 21.

2. Символы идентификации команды (4). Для того, чтобы пользователю не приходилось полностью набирать длинные слова (и не дай Бог при этой сделать ошибку), программа может идентифицировать команду не по всему слову, а по нескольким первым символам. Например, вместо команды прыгать можно дать команду ПРЫГ (если установлено число 4) или ПРЫ (если установлено 3). Это число может быть задано в диапазоне от 3 до 7. Обычное число - 4 или 5. Для детей - 4, для взрослых программы посложнее, можно задать 5, так как при большом числе слов возможны ситуации, когда первые 4 буквы разных слов совпадают. Для числа 5 - это происходит значительно реже. Число 3 еще как-то приемлемо для несложных английских программ, но в русском языке существуют приставки, которые могут быть одинаковыми у разных слов и очень возможны ошибки.

3. Количество объектов (9). Это количество объектов в программе, которые могут быть инвентарем, т.е. которые пользователь может брать, переносить с места на место или как-то использовать. Подробности, как заносить список этих объектов в листинги, смотрите в комментариях к пункту 6.

4. Символа идентификации объекта (4). Это то же, что и п.2, но для второй части команды - для существительных или направления. Эти числа могут и различаться, но лучше, чтобы сокращения для глаголов и существительных делались по единым правилам, пользователь к ним проще привыкает и чаще пользуется.

5. Максимальная длина описания объекта (22). Это количество символов, которое может занимать самое длинное описание объекта (например, ПЛЕД, НАДЕТЫЙ НА ПЛЕЧИ).

6. Количество объектов, способных изменять свое описание по ходу игры (2). Этот пункт имеет отношение к объектам типа "ФАКЕЛ" - "ГОРЯЩИЙ ФАКЕЛ" и т.п. Данные на эти объекты заносятся в строки 2000 ... 2018 (см. Листинг_2 демонстрационной программы), например:

DATA "ПЛЕД",1,"ШЕРСТЯНОЙ ПЛЕД", "ПЛЕД, НАДЕТЫЙ НА ПЛЕЧИ" DATA "ФАКЕЛ",2,"МАЛЕНЬКИЙ ФАКЕЛ", "ГОРЯЩИЙ ФАКЕЛ"

Это были объекты 1 и 2, а их измененные версии будут потом названы объектами 8 и 9. Поэтому при ответе на запрос о количестве предметов, являющихся инвентарем, надо задавать число 9, хотя в строках 2000-2024 заданы только 7 предметов. Кроме строк 2000 и 2001 (объекты, которые могут изменяться), остальной инвентарь, который не может изменять свое состояние, задан в строках 2020-2188 в формате:

DATA "ШКАТУЛКА",3,"ДЕРЕВЯННАЯ ШКАТУЛКА"

7. Другие слова, распознаваемые программой (13). Эти слова заданы в строках с 2191. Первый присваиваемый им номер рассчитывается по формуле:

(количество объектов) + 7

Поэтому в демонстрационной программе первое слово дверь имеет номер 16.

8. Максимальное число объектов, которые одновременно можно взять и иметь при себе (2).

9. Общее число локаций (15).

10. Фактор скроллинга (0). Если Вы хотите, чтобы определенное количество верхних строк не скроллировалось при вводе команд, то можете до запросу задать это число. В демонстрационном примере это не используется, поэтому введен 0.

11. Стартовая локация (7). Это номер локации, в которой начинается игра.

Возможные перемещения.

Со строки 3000 (до строки 3999) в Листинге_2 находится таблица расположения локаций, она же определяет и возможность взаимных перемещений между локациями. Первое число в строке DATA - это номер локации. Всего их 15 (в данной демонстрационной программе). Их расположение и наименование для демонстрационной программы показано на плане (рис.1).

Формат задания допустимых перемещений следующий. Первая цифра в строке DATA - это номер локации. Далее идут номера других локаций, в которые можно попасть из данной, если идти в разных направлениях. Всего 6 направлений, по-порядку соответственно СЕВЕР, ЮГ, ВОСТОК, ЗАПАД, ВВЕРХ и ВНИЗ. Так, например, для 1 локации возможен только переход в 3 локацию при движении на ЮГ: DATA 1,0,3,0,0,0,0

а для 7 локации - допустимы 4 направления: DATA 7,3,13,8,6,0,0

в 3 локацию, если идти на СЕВЕР,

В 13 -//- -//- ЮГ.

В 8 -//- -//- ВОСТОК.

В 6 -//- -//- ЗАПАД

вверх вниз

конюшня

1

амбар

3

двор

7

поле

8

плед

дверь

4

гостиная h

9

прихожая -

10

5

2

чердак

столовая

6

кухня

факел

вниз

вверх

11 погреб

тупик

13

дорога

15

сад

12

14

ворота

ключ

Рис. 1

Расположение объектов.

И, наконец, в строке 4000 задается исходное расположение объектов, являющихся инвентарем. Формат записи такой. По порядку, начиная с объекта номер 1 (ПЛЕД), задаются номера локаций, в которых этот предмет находится. Если предмет в данный момент не виден, то заносится 0. Всего в строке DATA будет столько цифр, сколько задано объектов, являющихся инвентарем (для нашей демонстрационной программы - 9).

DATA 4,10,0,1,0,0,0,0,0

Это означает, что ПЛЕД расположен в 4 локации, ФАКЕЛ - в 10 локации, ШКАТУЛКА -пока не видна и т.д., для всех 9 предметов, являющихся инвентарем (включая и те, которые изменяют свое состояние в процессе игры). Если Вы захотите, чтобы вначале игры какой-нибудь объект находился у Вас в руках, то надо для него задать номер 99 - это будет соответствовать "объект взят".

Загрузчик.

Листинг_3 является загрузчиком. Его функции - переустановка RAMTOP, загрузка русского символьного набора и его активизация, а также загрузка основной Бейсик-программы демонстрационной игры (Листинг_4).

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

Автостарт программы происходит со строки 9940, где после загрузки кодового блока и блока данных, начинается задание параметров, сохраненных в кодовом блоке, задаются массивы для переменных и т.д. Затем задаются символы UDG-графики А-Н. Последние служат для изображения рамок, оконтуривающих текст. Они встречаются в тексте программы в кавычках. Весь текст за редким исключением (символы "Y" или "N") набирается по-русски, а встречающиеся символы с "А" по "Н" (например, в строке 9988, строки с 7000 и др.) - это символы UDG-графики, изображающие рамки.

Подготовка исходных данных заканчивается строкой 9989, где управление передается на начало исполнения программы - строку 100. В процессе отладки, когда Вы будете останавливать программу, вновь стартовать ее можно, подав команду GO TO 100, но не RUN 100.

(Окончание - в следующем номере)




СОДЕРЖАНИЕ:


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

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



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

Похожие статьи:
Как это было в Ленинграде - 2011 год. Настоящий ZX Spectrum
Литература - Анонс полиграфического журнала "Новая Амига".
Железо - Часы реального времени.
Срочно в номер - Продаются новые версии CI-DOS'A.
Программистам - Формат Mod файлов. Описания формата стандартных MOD файлов, используемых в General Sound.

В этот день...   21 ноября