Охота на Вампуса |
Главная / ЭКВМ / Программы для ЭКВМ / Игры |
ПещераПещера в которой обитает Вампус состоит из 20 пронумерованных комнат, каждая из которых соединена тоннелями с тремя другими. В какой-то из комнат, которая выбирается случайным образом, спит Вампус. Там имеются и другие опасности. В начале игры персонаж случайным образом оказывается в одной из комнат пещеры. За ход он может выстрелить из лука или перейти в одну из трёх соседних комнат. Расположение комнат в пещере не изменяется, однако не будем лишать игроков удовольствия, приводя схему лабиринта. ОружиеИгрок имеет лук с пятью стрелами. Для убийства Вампуса достаточно и одной стрелы. Если стрела попала в Вампуса, то игрок победил и игра окончена. Стрелы у игрока не простые, а волшебные — они могут делать повороты во время полёта. Каждая стрела может пролететь от 1 до 5 соседних комнат. Путешествуя по лабиринту, игрок в ходе игры составляет представление о том, как связаны друг с другом комнаты в пещере. Стреляя, игрок должен указать номера комнат, через которые пролетит его стрела. Если он ошибётся с номерами комнат и, к примеру, укажет комнаты, не связанные общим тоннелем, то стрела начнёт летать по пещере случайным образом и может даже попасть в самого игрока. Если это произошло, то он проиграл. Игрок проигрывает и в том случае, если он истратит все 5 стрел, но так и не убьёт Вампуса. ОпасностиПопав в какую-либо комнату, игрок мог почувствовать отвратительный запах, услышать шум или почувствовать сквозняк. Источником отвратительного запаха является спящий Вампус. Запах чувствуется, если Вампус находится в какой-то из соседних комнат. Сквозняк и шум всегда доносятся из соседней комнаты, но неизвестно, из какой именно. В комнатах, откуда идёт сквозняк, находятся бездонные ямы, попав в которые, игрок погибает и, соответственно, проигрывает. Из 20 комнат в пещере две имеют ямы. В комнатах, откуда доносится шум (таких комнат в пещере тоже две), обитают гигантские летучие мыши. Если игрок зашёл в комнату к этим мышам, то они хватают его и случайным образом переносят в любую другую комнату в пещере. В том числе, не исключён вариант, что мыши перенесут игрока в комнату с ямой или сбросят его на голову Вампусу. Вампус
Проснувшись, Вампус может либо заснуть снова (с вероятностью 0,25), либо перейти спать в одну из соседних комнат. Кстати, комнаты с ямами и летучими мышами Вампусу не страшны. У него на ногах есть присоски, с помощью которых он выбирается из любой ямы, а его огромный вес не даёт гигантским летучим мышам его переносить. Если Вампус отправляется спать в комнату, где находится игрок, то игрок проигрывает, а Вампус получает обед. История игры"Охота на Вампуса" — первая в истории текстовая, а также первая приключенческая игра. Она была чрезвычайно популярна в 1970—1980-е годы. Программистам эта игра так полюбилась, что, пользуясь её размером (около 200 строк кода, половину из которых занимают вывод на экран и комментарии), они встраивали её в различные программы. Известно, что в корпоративной операционной системе R&D была системная команда "to Wumpus", запускавшая игру. "Hunt the Wumpus" — это и первая игра, в которой используется строение карты по принципу графов (в отличие от простой прямоугольной сетки как в более старых играх). В этом отношении, а также по размещению ловушек и тем остроумным сообщениям, которые используются в этой игре, она послужила прототипом для ADVENT и Zork (Zork, в частности, унаследовал от неё колонии гигантских летучих мышей). Позже появились и графические версии этой игры, отличающиеся от оригинальной другими лабиринтами и ловушками. В настоящее время версии "Hunt the Wumpus" доступны в Интернете для большинства операционных систем и устройств. Реализация на ЭКВМВ программе для ЭКВМ сохранено большинство особенностей оригинальной игры, текст которой на языке BASIC приведён ниже. Разумеется, игру можно было значительно усовершенствовать, но тогда исходный код нельзя было бы использовать для сравнения подходов. Игра выполнена с использованием графического интерфейса пользователя и может быть использована как набор типичных приёмов его использования - интересный для разбора и ознакомления, в отличие от более полезных программ.
Текст программы примера приведён ниже и снабжён комментариями. Файл программы wumpus.mkp на ЯМК - 6615 байт, КС 546075/173 Текст программы wumpus.mkl для кросс-компилятора
.CHARSET 1251
; Файл wumpus
; Текстовая игра "Охота на Вампуса"
; По мотивам "Hunt of Wumpus" [Gregory Yob, 1972]
; Пример использования графического интерфейса
; пользователя ЭКВМ ЭЛЕКТРОНИКА МК
; НПП "СЕМИКО", 2012, GPL 2+
; Версия 1.0 от 05.07.12
; Версия 1.1 от 13.07.12
; Команды языка ГИ:
TAB .EQU 96
LDX .EQU 104
LDY .EQU 105
TYPE .EQU 101
ATYPE .EQU 78
LDADR .EQU 77
SQU .EQU 89
FRAME .EQU 91
DRAWP .EQU 84
DRAWB .EQU 86
TXTP .EQU 83
TXTB .EQU 85
TXTK .EQU 87
PREXP .EQU 92
PRFORM .EQU 93
PRHEX .EQU 94
MCALL .EQU 102
RETUM .EQU 103
LCALL .EQU 112
RETUL .EQU 113
JNEZ .EQU 1
JM .EQU 56
END .EQU 255
; Регистры памяти
; R0,R1 - циклы
; R4,R5 - косвенное обращение к регистрам
; RA-RD - временное хранение данных
NK0 .EQU 21 ; левая дорога
NK1 .EQU 22 ; средняя дорога
NK2 .EQU 23 ; правая дорога
NK .EQU 24 ; номер текущей комнаты - HtW L(1)
NW .EQU 25 ; Пещера с Вампусом - HtW L(2)
NP1 .EQU 26 ; Первая пещера с пропастью - HtW L(3)
NP2 .EQU 27 ; Вторая пещера с пропастью - HtW L(4)
NB1 .EQU 28 ; Первая пещера с летучими мышами - HtW L(5)
NB2 .EQU 29 ; Вторая пещера с летучими мышами - HtW L(6)
ARR .EQU 30 ; Запас стрел - HtW A
; резервная копия данных для повтора игры - HtW M()
; регистры от 34 до 39 включительно
NKR .EQU 34 ;
NWR .EQU 35 ;
NP1R .EQU 36 ;
NP2R .EQU 37 ;
NB1R .EQU 38 ;
NB2R .EQU 39 ;
FSTR1 .EQU 41 ; значение 0 - признак наличия текста в STR1
FSTR2 .EQU 42 ; -"- STR2
FSTR3 .EQU 43 ; -"- STR3
YSTR1 .EQU 44 ; вертикальная координата текста в STR1
YSTR2 .EQU 45 ; -"- STR2
YSTR3 .EQU 46 ; -"- STR3
ARRJ9 .EQU 47 ; дальность стрельбы (HtW - J9)
ARRK .EQU 48 ; для цикла по маршруту стрелы (HtW - K)
ARRERR .EQU 49 ; 0- ошибка маршрута
ARRP1 .EQU 50 ; маршрут стрелы комната 1 (HtW - P(1)) и т.д.
ARRP2 .EQU 51
ARRP3 .EQU 52
ARRP4 .EQU 53
ARRP5 .EQU 54
STR1 .EQU 1000 ; строка 1
STR2 .EQU 1050 ; строка 2
STR3 .EQU 1100 ; строка 3
; ====================================================== Начало программы
.ORG 0
A0:
CX ; Обнулить RX и сбросить признак ввода числа
2 PP M 9010 ; Инициализировать графический экран
1 PP M 9200 ; 1 - разрешение графического интерфейса
1 PP M 9202 ; текущая форма - 1
0 PP M 9203 ; активный элемент - 0
.NUM TFORM
PP M 9201 ; главная таблица форм TFORM
A1: 64 ; Код принудительной перерисовки формы
A2: PP M 9208 ; Перерисовать форму
PP RM 9209 ; Результат выполнения формы
MA ; Сохранить в RA
P X!=0 A5 ; Перейти, если не требуется обработки
1 -
P X!=0 A4 ; Перейти, если требуется обработка
; Далее простейшая обработка ошибки интерфейса
; при этом RX содержит число от 2 до 6
; или 7 - ввод числа, который в программе не используется
A3: .NUM STRER ; Вывести "Ошибка" в строку комментариев
A31: PP M 9026
CX ENT ENT ENT ; Очистить стек
RMA
R/S ; Останов
A4: ; Обработка результата выполнения формы
.NUM TOBR ; таблица адресов обработчиков
PP M 9042 ; в R9042
PP RM 9208 ; команда для обработки
PP M 9213 ; считать из ассоциативной таблицы
P X>=0 A5 ; обработчик команды не найден - перейти к опросу
PP M 9042 ; адреса форм для обработчика команд в R9042
PP RM 9202 ; номер текущей формы
PP M 9211 ; считать из упорядоченной таблицы
P X!=0 A5 ; Адрес 0 - обработчик команды для данной формы отсутствует
; перейти к опросу клавиатуры
MA ; сохранить адрес в RA
PP RM 9208 ; код команды
33 -
P X=0 A41 ; для всех команд кроме Ввод перейти непосредственно к подпрограмме
; для команды Ввод - считать и обработать номер активного элемента
RMA
PP M 9042
PP RM 9203
PP M 9211 ; считать адрес из упорядоченной таблицы
P X!=0 A5 ; если адрес нулевой (обработчик отсутствует)
; перейти к опросу клавиатуры
MA ; иначе записать адрес подпрограммы обработчика в RA
A41: K GSB A ; и перейти к ней
P X!=0 A5 ; если RX==0 перейти к опросу клавиатуры без перерисовки
P X<0 A42 ; если RX>0 перерисовать с учётом номеров формы и элемента
CX MA ; Очистить RA перед выходом из программы
.NUM STREX
P GOTO A31
A42:
RMB ; новый номер формы (устанавливается в подпрограммах обработки)
PP M 9202
RMC ; новый номер элемента (устанавливается в подпрограммах)
PP M 9203
P GOTO A1 ; Вернуться к перерисовке формы
A5: ; Опрос клавиатуры
PP RM 9029 ; Считать код клавиши
MA ; Сохранить в RA
K NOT ; инверсия (0FFh -> 0)
P X!=0 A5 ; если нет нажатия - продолжать опрос
RMA
P GOTO A2 ; Передать код нажатой клавиши в форму
STRER: .TEXT "\nОшибка\0"
STREX: .TEXT "\nВыход из программы\0"
;======= ассоциативная таблица адресов таблиц обработчиков команд
TOBR: .DB 33 ; ввод
.DA TOBRVVOD
.DB 32 ; выход
.DA TOBRVYH
.DB 34 ; выбор вправо
.DA TOBRVYB
.DB 35 ; выбор влево
.DA TOBRVYB
.DB 36 ; выбор вверх
.DA TOBRVYB
.DB 37 ; выбор вниз
.DA TOBRVYB
.DB END
; Упорядоченные таблицы адресов подпрограмм и адресов таблиц
TOBRVYB: ; Обработка команды Выбор - адреса подпрограмм
.DA 0 ; Не требуется
.DA 0
.DA 0
.DA 0
.DA 0
.DA 0
.DA 0
.DA VYBF7
.DA 0
.DA 0
.DA 0
.DA 0
.DA 0
.DA 0
.DA 0
.DA 0
.DA 0
TOBRVYH: ; Обработка команды Выход - адреса подпрограмм
.DA 0 ; Не требуется
.DA VVODF1E3 ; Выход - для обработки нужно разрешить в форме
.DA VVODF2E0 ; Аналогично команде Ввод
.DA VVODF3E0
.DA VVODF4E0
.DA VVODF5E0
.DA VVODF6E0
.DA VVODF7E0
.DA VVODF8E0
.DA VVODF9E1 ; Отставить выстрел
.DA VVODF10E0
.DA VVODF11E0
.DA VVODF12E0
.DA VVODF13E0
.DA 0
.DA 0
.DA 0
TOBRVVOD: ; Обработка команды Ввод - адреса таблиц
.DA TVVODF0
.DA TVVODF1
.DA TVVODF2
.DA TVVODF3
.DA TVVODF4
.DA TVVODF5
.DA TVVODF6
.DA TVVODF7
.DA TVVODF8
.DA TVVODF9
.DA TVVODF10
.DA TVVODF11
.DA TVVODF12
.DA TVVODF13
.DA 0
.DA 0
.DA 0
; Адреса подпрограмм обработки команды Ввод для каждого элемента формы
TVVODF0:
.DA VVODF0E0, VVODF0E1, VVODF0E2, VVODF0E3
TVVODF1:
.DA VVODF1E0, VVODF1E1, VVODF1E2, VVODF1E3
TVVODF2:
.DA VVODF2E0
TVVODF3:
.DA VVODF3E0
TVVODF4:
.DA VVODF4E0
TVVODF5:
.DA VVODF5E0
TVVODF6:
.DA VVODF6E0, VVODF6E0, VVODF6E0, VVODF6E0, VVODF6E0 ; все одинаковы
TVVODF7:
.DA VVODF7E0, VVODF7E0, VVODF7E0, VVODF7E0, VVODF7E0 ; все одинаковы
.DA VVODF7E0, VVODF7E0, VVODF7E0, VVODF7E0, VVODF7E0
.DA VVODF7E0, VVODF7E0, VVODF7E0, VVODF7E0, VVODF7E0
.DA VVODF7E0, VVODF7E0, VVODF7E0, VVODF7E0, VVODF7E0
TVVODF8:
.DA VVODF8E0
TVVODF9:
.DA VVODF9E0, VVODF9E1
TVVODF10:
.DA VVODF10E0
TVVODF11:
.DA VVODF11E0
TVVODF12:
.DA VVODF12E0
TVVODF13:
.DA VVODF13E0
; Подпрограммы обработки команды Ввод для каждого элемента формы
VVODF0E0:
; идти влево
P RM NK0
VVODF0E0A:
P M NK
P RM NW
-
P X=0 VVODF0E0B ; перейти если координаты не совпали
; угодили к Вампусу
2 MB ; F2E0
0 MC
1
RTN ; Выход с перерисовкой
VVODF0E0B:
P RM NK
P RM NP1
-
P X!=0 VVODF0E0C ; перейти если яма1
P RM NK
P RM NP2
-
P X=0 VVODF0E0D ; перейти если не яма2
VVODF0E0C:
; угодили в яму
3 MB
0 MC
1
RTN
VVODF0E0D:
P RM NK
P RM NB1
-
P X!=0 VVODF0E0E ; перейти если мыши1
P RM NK
P RM NB2
-
P X=0 VVODF0E0F ; перейти если не мыши2
VVODF0E0E:
; угодили к мышам
4 MB
0 MC
1
RTN
VVODF0E0F:
P GSB LOCNK
P GSB PROVNK
CX MB ; оставить форму 0
PP RM 9203
MC ; сохранить направление движения
1
RTN
VVODF0E1: ; идти прямо
P RM NK1
P GOTO VVODF0E0A
VVODF0E2: ; идти вправо
P RM NK2
P GOTO VVODF0E0A
VVODF0E3: ; стрелять
6 MB ; перейти к F6E0
0 MC
1 RTN
VVODF1E0: ; начать игру
P GSB INIT
VVODF1E0A:
0 MB
1 MC
1 RTN
VVODF1E1: ; повторить
; восстановить регистры
6 M0
.NUMD NK
M4
.NUMD NKR
M5
VVODF1E1A:
KRM5
KM4
PFL0 VVODF1E1A
P GSB INIT1
P GOTO VVODF1E0A
VVODF1E2: ; правила
VVODF1E3: ; выход
1 +/-
RTN
VVODF2E0: ; попали к Вампусу
P GSB FNC ; случайное число 0-4
MA
4 -
P X=0 VVODF2E0A
; 4 - Вампус остался в этой же комнате и съел Вас
5 MB
0 MC
1 RTN
VVODF2E0A:
P RM NW
1 -
3 *
RMA + ; RA=1...3
.NUMD CAVE ; -1 для диапазона 0...2 учитывается в NUMD
+
K PRGM ; считать байт по адресу в RX
P M NW ; новая комната Вампуса
P GOTO VVODF0E0B ; перейти к проверкам на ямы и мышей
VVODF3E0: ; упали в яму
VVODF5E0: ; съедены Вампусом
VVODF10E0: ; попали в Вампуса
VVODF11E0: ; попали в себя
VVODF13E0: ; стрелы кончились
1 MB ; перейти к заставке
1 MC ; "повторить"
1 RTN
VVODF4E0:
P GSB FNA ; случайное число 1-20
P GOTO VVODF0E0A ; записать новое значение текущей комнаты
; и перепроверить полностью
VVODF6E0: PP RM 9203 ; номер выбранного элемента
1 +
P M ARRJ9 ; дальность стрельбы, HtW - J9
.NUMD STR1
M4 ; адрес STR1-1
62 KM4 ; '>' в строку
0 KM4 ; '\0' в строку
CX
P M ARRK ; начало маршрута
7 MB
P RM NK ; установить выбор на текущую комнату
1 -
MC
1 RTN
VVODF7E0: ; маршрут
P RM ARRK
2 -
P X>=0 VVODF7E0A
; проверить на возврат стрелы
.NUM ARRP1 ; начало массива
+
MA
KRMA ; номер комнаты на шаге -2
PP RM 9203
1 + ; номер выбранной комнаты
- ; (HtW строка 3100)
P X=0 VVODF7E0A ; перейти на заполнение строки маршрута
8 MB
0 MC
1 ; иначе выйти в F8
RTN
VVODF7E0A:
PP RM 9203 ; номер выбранного элемента
MA
10 -
P X<0 VVODF7E0B
; пункты 0-9
RMA 3 *
.NUM F7T1 ; в этой строке есть нужные символы
+
P GOTO VVODF7E0C
VVODF7E0B:
; пункты 10-19
3 * ; до этого RX=RA-10
.NUM F7T2 ; в этой строке есть нужные символы
+
VVODF7E0C:
PP M 9042
RM4 1 - M4 ; убрать '\0'
P RM ARRK
P X!=0 VVODF7E0D ; для первой комнаты маршрута пропустить
45
KM4
VVODF7E0D:
32 ; пробел
KM4
PP RM 9044 ; первая цифра
KM4
PP RM 9044 ; вторая цифра
KM4
32 ; пробел
KM4
CX ; '\0'
KM4
P RM ARRK
.NUM ARRP1
+
MA
PP RM 9203
1 +
KMA ; занести номер выбранной комнаты в ARRP1...ARRP5
P RM ARRK
1 +
P M ARRK
P RM ARRJ9
-
P X=0 VVODF7E0E
; последняя комната маршрута
9 MB ; перейти к F9
0 MC
1 RTN
VVODF7E0E:
7 MB
PP RM 9203
MC ; восстановить номер выбранного элемента
1 RTN
VVODF8E0: ; неверный маршрут
7 MB ; вернуться в F7
CX MC
1 RTN
VVODF9E0: ; стрелять
CX ; начать маршрут
P M ARRK
1
P M ARRERR ; флаг ошибки маршрута
P RM ARR ; уменьшить количество стрел
1 -
P M ARR
P X<0 VVODF9E0A1
; а стрелы кончились
13 MB
0 MC
1 RTN
VVODF9E0A1:
P RM ARRP1
MA
P RM NK0
MB
-
P X!=0 VVODF9E0B
RMA
P RM NK1
MC
-
P X!=0 VVODF9E0B
RMA
P RM NK2
MD
-
P X!=0 VVODF9E0B
VVODF9E0A: ; нет прохода на первом шаге
CX
P M ARRERR ; флаг ошибки маршрута
P RM NK ; Текущая комната
3 *
1 -
P GSB FNB ; Случайное число от 1 до 3
+
.NUM CAVE
+ ; адрес номера случайной соседней комнаты
P GOTO VVODF9E0C
VVODF9E0B:
P RM ARRK
.NUM ARRP1
+
VVODF9E0C:
MA ; адрес номера комнаты
KRMA ; номер комнаты
MA ; записать его в RA
P RM NW ; комната вампуса
- ; сравнить
P X=0 VVODF9E0D
; попали в Вампуса
10 MB
0 MC
1 RTN
VVODF9E0D:
RMA
P RM NK ; наша комната
-
P X=0 VVODF9E0E
; попали в себя
11 MB
0 MC
1 RTN
VVODF9E0E:
RMA
3 *
.NUM CAVE
+
PP M 9042
PP RM 9044
MB ; соседняя комната слева
PP RM 9044
MC ; соседняя комната прямо
PP RM 9044
MD ; соседняя комната справа
P RM ARRK ; следующий шаг
1 +
P M ARRK
P RM ARRJ9
-
P X=0 VVODF9E0F
; конец маршрута - промах
12 MB
0 MC
1 RTN
VVODF9E0F:
; проверить следующую комнату маршрута
P RM ARRK
MA RMB -
P X=0 VVODF9E0B ; допустимое значение - маршрут влево
RMA RMC -
P X=0 VVODF9E0B ; допустимое значение - маршрут прямо
RMA RMD -
P X=0 VVODF9E0B ; допустимое значение - маршрут направо
; неверный маршрут - выбрать одну из соседних комнат
CX
P M ARRERR ; флаг ошибки маршрута
P GSB FNB ; случайное число от 1 до 3
10 + ; номера соседних комнат лежат в RB...RD
P GOTO VVODF9E0C ; загрузить
VVODF9E1: ; отставить выстрел
P GSB LOCNK
P GSB PROVNK
0 MB ; вернуться в F0
3 MC ; к пункту стрелять
1 RTN
VVODF12E0: ; промах
; Разбудили Вампуса
P GSB FNC ; случайное число 0-4
MA
4 -
P X!=0 VVODF9E1 ; 4 - Вампус остался в той же комнате
P RM NW
1 -
3 *
RMA + ; RA=1...3
.NUMD CAVE ; -1 для диапазона 0...2 учитывается в NUMD
+
K PRGM ; считать байт по адресу в RX
P M NW ; новая комната Вампуса
P RM NK ; проверить не пришёл ли он к Вам
-
P X=0 VVODF9E1 ; если нет - перейти к F0
; Если да - он Вас съел
5 MB
0 MC
1 RTN
; Подпрограммы обработки для команды Выбор
VYBF7: ; В форме F7 много элементов
; и перемещение между ними можно сделать более рациональным
.NUM TVYBF7
PP M 9042
PP RM 9208 ; код команды
PP M 9213 ; считать адрес из ассоциативной таблицы
P X>=0 VYB7B ; этой ошибки в отлаженной программе быть не может, но...
PP RM 9203 ; номер активного элемента
+ ; получить смещение в выбранной по коду таблице
K PRGM ; считать байт из памяти программ по адресу RX
VYB7A:
MC ; новый номер элемента
7 MB ; форма 7 - она не изменяется
1 RTN ; перерисовать
VYB7B: PP RM 9203 ; при ошибке восстановить номер элемента
P GOTO VYB7A
TVYBF7:
.DB 34 ; вправо
.DA TVYBF7R
.DB 35 ; влево
.DA TVYBF7L
.DB 36 ; вверх
.DA TVYBF7U
.DB 37 ; вниз
.DA TVYBF7D
.DB END
TVYBF7L: .DB 19,0 ; далее эти таблицы пересекаются
TVYBF7R: .DB 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,0
TVYBF7U: ; поскольку в форме две строки
TVYBF7D: ; таблицы переходов вверх и вниз одинаковы
.DB 10,11,12,13,14,15,16,17,18,19
.DB 0,1,2,3,4,5,6,7,8,9
;========= Таблица переходов по пещере
CAVE: ; HtW - массив S(J,K) - строки 0068-0160
.DB 2,5,8, 1,3,10, 2,4,12, 3,5,14, 1,4,6
.DB 5,7,15, 6,8,17, 1,7,9, 8,10,18, 2,9,11
.DB 10,12,19, 3,11,13, 12,14,20, 4,13,15, 6,14,16
.DB 15,17,20, 7,16,18, 9,17,19, 11,18,20, 13,16,19
;========= Возврат псевдослучайных значений
FNA: ; от 1 до 20 (HtW строка 0170)
20
FNA1: KRAN
*
K INT
1 +
RTN
FNB: ; от 1 до 3 (HtW строка 0180)
3
P GOTO FNA1
FNC: ; от 1 до 4 (HtW строка 0190)
4
P GOTO FNA1
;========= Начальное заполнение
LOC: ; HtW 0200-0270
6 M0
.NUMD NK ; аналог HtW L()
M4
LOC1: P GSB FNA ; случайное число от 1 до 20
KM4 ; записать в переменную
PFL0 LOC1 ; цикл по R0
LOC2: ; проверка пересечений
; использован алгоритм без избыточных проверок (по сравнению с HtW)
5 M0
.NUMT NB2 ; номер регистра NB2 (последнего в массиве)
MA ; в RA
LOC3:
RM0 M1
.NUMD NK ; номер регистра NK-1
M4 ; в R4
LOC4: KRMA
KRM4
-
P X!=0 LOC ; если значения равны - повторить заполнение
; (см. HtW строка 0320)
PFL1 LOC4 ; цикл по R1
RMA 1 - MA ; декремент RA
PFL0 LOC3 ; цикл по R0
; перенести данные в энергонезависимую память для повтора игры
6 M0
.NUMD NK ; аналог HtW L()
M4
.NUMD NKR ; аналог HtW M()
M5
LOC5: 1 PP M 9047 ; 1- запись в энергонезависимую память
KRM4
KM5 ; эти данные записаны в энергонезависимую память
PFL0 LOC5 ; цикл по R0
RTN
;=======
LOCNK:
P RM NK ; номер текущей комнаты 1-20
1 -
3 *
.NUM CAVE
+
PP M 9042
PP RM 9044
P M NK0 ; номер комнаты влево
PP RM 9044
P M NK1 ; номер комнаты прямо
PP RM 9044
P M NK2 ; номер комнаты направо
RTN
;======== Перенос строки из памяти программ R9042 в [R4+1]
STRCPY: PP RM 9044
KM4
P X=0 STRCPY ; если не 0 - продолжить копирование
RTN
;======== Перенос из памяти программ в строки STR1...STR3
; последовательно, с заполнением флагов FSTR1...FSTR3
STRXCPY:
P RM FSTR1 ; проверка строки 1
P X!=0 STRXCPY1 ; есть строка - перейти
CX
P M FSTR1 ; обнулить флаг FSTR1
.NUMD STR1
M4 ; адрес в R4
P GOTO STRCPY
STRXCPY1:
P RM FSTR2 ; проверка строки 2
P X!=0 STRXCPY2 ; есть строка - перейти
CX
P M FSTR2 ; обнулить флаг FSTR2
.NUMD STR2
M4 ; адрес в R4
P GOTO STRCPY
STRXCPY2:
P RM FSTR3 ; проверка строки 1
P X!=0 STRXCPY3 ; есть строка - перейти
CX
P M FSTR3 ; обнулить флаг FSTR3
.NUMD STR3
M4 ; адрес в R4
P GOTO STRCPY
STRXCPY3:
; превышено количество строк - выйти из п/п
RTN
;========= Проверка условий и заполнение строк сообщений
; временные переменные
; RA=NK0
; RB=NK1
; RC=NK2
; RD - сравниваемое значение: NW,NP1,NP2,NB1,NB2
PROVNK:
1
P M FSTR1 ; нет строки STR1
P M FSTR2 ; нет строки STR2
P M FSTR3 ; нет строки STR3
; проверка в цикле с оператором выбора (HtW строки 2000-2120)
; заменена прямыми сравнениями - для ЯМК это оптимальнее
; Для экономии памяти перепишем данные в регистры RA-RC
P RM NK2
MC
P RM NK1
MB
P RM NK0
MA
; проверка соседства с Вампусом
P RM NW
MD -
P X!=0 PROVNK3
RMB RMD -
P X!=0 PROVNK3
RMC RMD -
P X!=0 PROVNK3
; проверка соседства с ямой
PROVNK1:
RMA
P RM NP1 ; яма1
MD -
P X!=0 PROVNK4
RMB RMD -
P X!=0 PROVNK4
RMC RMD -
P X!=0 PROVNK4
RMA
P RM NP2 ; яма2
MD -
P X!=0 PROVNK4
RMB RMD -
P X!=0 PROVNK4
RMC RMD -
P X!=0 PROVNK4
PROVNK2: ; проверка соседства с мышами
RMA
P RM NB1 ; мыши1
MD -
P X!=0 PROVNK5
RMB RMD -
P X!=0 PROVNK5
RMC RMD -
P X!=0 PROVNK5
RMA
P RM NB2 ; мыши2
MD -
P X!=0 PROVNK5
RMB RMD -
P X!=0 PROVNK5
RMC RMD -
P X!=0 PROVNK5
RTN
PROVNK3: ; Записать строку про Вампуса
.NUM TXT1
PP M 9042
P GSB STRXCPY ; записать первую строку
P GOTO PROVNK1 ; продолжить проверки других условий
PROVNK4: ; Записать строку про сквозняк
.NUM TXT2
PP M 9042
P GSB STRXCPY ; записать очередную (1 или 2) строку
P GOTO PROVNK2 ; продолжить проверки других условий
PROVNK5: ; Записать строку про мышей
.NUM TXT3
PP M 9042
P GSB STRXCPY ; записать последнюю (1, 2 или 3) строку
; оператор перехода не требуется
RTN
;========= Инициализация
INIT: P GSB LOC ; начальная инициализация лабиринта
INIT1:
5
P M ARR ; количество стрел (HtW строка 0360)
P GSB LOCNK ; заполнить номера смежных комнат
P GSB PROVNK ; заполнить строки STR1...STR2
RTN
;========= Сообщения
TXT1: .TEXT "Ощущается запах Вампуса\0"
TXT2: .TEXT "Чувствуется сквозняк\0"
TXT3: .TEXT "Летучие мыши поблизости\0"
;===== Главная таблица форм
TFORM:
.DB 0 ; текущая комната пещеры
.DA F0 ; адрес начала формы 0
.DB 1 ; заставка
.DA F1 ; адрес начала формы 1
.DB 2 ; у Вампуса
.DA F2 ; адрес начала формы 1
.DB 3 ; в яме
.DA F3 ;
.DB 4 ; у мышей
.DA F4 ;
.DB 5 ; съеден Вампусом
.DA F5 ;
.DB 6 ; дальность стрельбы
.DA F6 ;
.DB 7 ; маршрут стрелы
.DA F7 ;
.DB 8 ; возврат стрелы
.DA F8 ;
.DB 9 ; выстрел
.DA F9 ;
.DB 10 ; попали в Вампуса
.DA F10 ;
.DB 11 ; попали в себя
.DA F11 ;
.DB 12 ; промах
.DA F12 ;
.DB 13 ; стрелы закончились
.DA F13 ;
.DB 14 ; правила 1
.DA F14 ;
.DB 15 ; правила 2
.DA F15 ;
.DB 16 ; правила 3
.DA F16 ;
.DB END ; конец таблицы
;===== Форма 0 - Текущая комната пещеры
; (вывод местонахождения в HtW - строки 2130-2160)
.BASE ; смещения в таблицах и переходах указываются относительно начала формы
F0: ; Заголовок формы
.DB 3 ; максимальный номер элемента 3 (всего их 4, считая нулевой)
.DBB F0DE, F0PI, F0PO, F0PL, F0PR, F0RI, F0KM ; таблица смещений
; Примечание: расположение остальных полей структуры в пределах формы
; может быть произвольным
F0DE: ;таблица флагов действий
.DB 29,29,29,29
; В двоичном виде это 00 01 11 01 - установлены флаги "выход, ввод с обработкой, выбор"
F0PI: .DB 0,0,0,1,0,2,0,3
F0PO: .DB 1,1,1,1,1,1,1,1
F0PL: ; Таблица переходов по команде "Выбор влево"
.DB 3,0,1,2
F0PR: ; Таблица переходов по команде "Выбор вправо"
.DB 1,2,3,0
F0RI: ; основная программа экранной формы
.DB LCALL
.DA FSFONT
.DB TAB, 2, 12
.DB DRAWP, 0
.DA IFON
.DB TAB, 2, 0
.DB TXTP, 16
.DA F0T1
.DB TAB, 38, 0
.DB PREXP, 16
.DA NK
.DB TAB, 22, 8
.DB PREXP, 16
.DA NK0
.DB TAB, 63, 7
.DB PREXP, 16
.DA NK1
.DB TAB, 103, 6
.DB PREXP, 16
.DA NK2
.DB JNEZ
.DA FSTR1 ; если FSTR1==0 вывести строку STR1
.DBB F0RI1
.DB TAB, 0, 42
.DB TXTB, 16
.DA STR1
F0RI1: .DB JNEZ
.DA FSTR2 ; если FSTR2==0 вывести строку STR2
.DBB F0RI2
.DB TAB, 0, 49
.DB TXTB, 16
.DA STR2
F0RI2: .DB JNEZ
.DA FSTR3 ; если FSTR3==0 вывести строку STR3
.DBB F0RI3
.DB TAB, 0, 56
.DB TXTB, 16
.DA STR3
F0RI3: .DB END ; конец основной программы
F0KM: ; Таблица смещений программ элементов команды
; Эти программы выполняются после основной программы формы
; и указывают на точку входа для активного элемента
.DBB F0KM0, F0KM1, F0KM2, F0KM3
F0KM0: ; идти влево
.DB TAB, 22, 24
.DB DRAWP, 0
.DA IS0
.DB END
F0KM1: ; идти прямо
.DB TAB, 63, 22
.DB DRAWP, 0
.DA IS1
.DB END
F0KM2: ; идти вправо
.DB TAB, 102, 24
.DB DRAWP, 0
.DA IS2
.DB END
F0KM3: ; стрелять
.DB TAB, 0, 35
.DB TXTP, 16
.DA F0T2
.DB TAB, 96, 35
.DB PREXP, 16
.DA ARR ; вывести количество стрел
.DB END
F0T1: .TEXT "Комната\0"
F0T2: .TEXT "Стрелять, запас стрел -\0"
;===== Форма 1 - Заставка
.BASE
F1: ; Заголовок формы
.DB 3 ; максимальный номер элемента
.DBB F1DE, F1PI, F1PO, F1PL, F1PR, F1RI, F1KM ; таблица смещений
F1DE: ;таблица флагов действий
.DB 13,13,5,13 ; 13=001101, 5=000101
; Для элемента 2 - обычный ввод, без обработки
; Выход запрещён
F1PI:
F1PO: .DB 0,1,0,1,14,0,0,1
F1PL: ; Таблица переходов по команде "Выбор влево"
.DB 3,0,1,2
F1PR: ; Таблица переходов по команде "Выбор вправо"
.DB 1,2,3,0
F1RI: ; основная программа экранной формы
.DB LCALL
.DA FSFONT
.DB TAB, 0, 0
.DB DRAWP, 0
.DA IWUMPUS
.DB TAB, 40, 0
.DB TXTP, 16
.DA F1T0
.DB TAB, 54, 10
.DB TXTP, 16
.DA F1T1
.DB TAB, 54, 16
.DB TXTP, 16
.DA F1T2
.DB TAB, 54, 22
.DB TXTP, 16
.DA F1T3
.DB TAB, 54, 28
.DB TXTP, 16
.DA F1T4
.DB TAB, 79, 35
.DB TXTP, 16
.DA F1T5
.DB TAB, 72, 42
.DB TXTP, 16
.DA F1T6
.DB TAB, 76, 49
.DB TXTP, 16
.DA F1T7
.DB TAB, 78, 56
.DB TXTP, 16
.DA F1T8
.DB END ; конец основной программы
F1KM: ; Таблица смещений программ элементов команды
; Эти программы выполняются после основной программы формы
; и указывают на точку входа для активного элемента
.DBB F1KM0, F1KM1, F1KM2, F1KM3
F1KM0: .DB TAB, 56,34
.DB JM
.DBB F1KME
F1KM1: .DB TAB, 56,41
.DB JM
.DBB F1KME
F1KM2: .DB TAB, 56,48
.DB JM
.DBB F1KME
F1KM3: .DB TAB, 56,55
F1KME: .DB SQU, 3, 70, 7
.DB END
F1T0: .TEXT "Охота на Вампуса v1.1\0"
F1T1: .TEXT "по мотивам игры\0"
F1T2: .DB 34 ; кавычки
.TEXT "Hunt the Wumpus"
.DB 34,0 ; кавычки и конец строки
F1T3: .TEXT "(1972 г.), автор -\0"
F1T4: .TEXT "Gregory Yob\0"
F1T5: .TEXT "Начать\0"
F1T6: .TEXT "Повторить\0"
F1T7: .TEXT "Правила\0"
F1T8: .TEXT "Выход\0"
;===== Форма 2 - В гостях у Вампуса (HtW строка 4160)
.BASE
F2: ; Заголовок формы
.DB 0 ; максимальный номер элемента
.DBB F2DE, F2PI, F2PO, F2PL, F2PR, F2RI, F2KM ; таблица смещений
F2DE: ;таблица флагов действий
.DB 60 ; 00111100 ввод и выход с обработкой
F2PI:
F2PO: .DB 1,0
F2PL:
F2PR: .DB 0
F2RI: ; основная программа экранной формы
.DB LCALL
.DA FSFONT
.DB LCALL
.DA FSFRAME
.DB LCALL
.DA FSIWUM1
.DB TAB, 70, 20
.DB TXTP, 16
.DA F2T0
.DB TAB, 10, 40
.DB TXTP, 16
.DA F2T1
.DB END ; конец основной программы
F2KM: .DBB F2KM0
F2KM0: .DB END
F2T0: .TEXT "...ОПА!\0"
F2T1: .TEXT "Вы наткнулись на Вампуса!\0"
;======= Форма 3 - Яма (HtW строка 4230)
.BASE
F3: ; Заголовок формы
.DB 0 ; максимальный номер элемента
.DBB F3DE, F3PI, F3PO, F3PL, F3PR, F3RI, F3KM ; таблица смещений
F3DE: ;таблица флагов действий
.DB 188 ; 10111100 ввод и выход с обработкой, без очистки
F3PI:
F3PO: .DB 1,0
F3PL:
F3PR: .DB 0
F3RI: ; основная программа экранной формы
.DB LCALL
.DA FSFONT
.DB TAB, 36, 0
.DB SQU, 4,20,7 ; очистить номер комнаты
.DB TAB, 38, 0
.DB PREXP, 16 ; перерисовать номер комнаты
.DA NK
.DB LCALL
.DA FSFRAME
.DB TAB, 6, 9
.DB DRAWP, 0
.DA IPIT
.DB TAB, 64, 20
.DB TXTP, 16
.DA F3T0
.DB TAB, 52, 40
.DB TXTP, 16
.DA F3T1
.DB END ; конец основной программы
F3KM: .DBB F3KM0
F3KM0: .DB END
F3T0: .TEXT "А-А-А-А....\0"
F3T1: .TEXT "Вы упали в яму\0"
;======= Форма 4 - Мыши (HtW строка 4280)
.BASE
F4: ; Заголовок формы
.DB 0 ; максимальный номер элемента
.DBB F4DE, F4PI, F4PO, F4PL, F4PR, F4RI, F4KM ; таблица смещений
F4DE: ;таблица флагов действий
.DB 188 ; 188=10111100 ввод и выход с обработкой, без очистки
F4PI:
F4PO: .DB 1,0
F4PL:
F4PR: .DB 0
F4RI: ; основная программа экранной формы
.DB LCALL
.DA FSFONT
.DB TAB, 36, 0
.DB SQU, 4,20,7 ; очистить номер комнаты
.DB TAB, 38, 0
.DB PREXP, 16 ; перерисовать номер комнаты
.DA NK
.DB LCALL
.DA FSFRAME
.DB TAB, 6, 9
.DB DRAWP, 0
.DA IBAT
.DB TAB, 64, 12
.DB TXTP, 16
.DA F4T0
.DB TAB, 64, 20
.DB TXTP, 16
.DA F4T1
.DB TAB, 18, 32
.DB TXTP, 16
.DA F4T2
.DB TAB, 18, 40
.DB TXTP, 16
.DA F4T3
.DB TAB, 32, 48
.DB TXTP, 16
.DA F4T4
.DB END ; конец основной программы
F4KM: .DBB F4KM0
F4KM0: .DB END
F4T0: .TEXT "ЦАП!\0"
F4T1: .TEXT "Вас схватили\0"
F4T2: .TEXT "гигантские летучие мыши\0"
F4T3: .TEXT "и затащили\0"
F4T4: .TEXT "непонятно куда\0"
;======= Форма 5 - Схватил Вампус (HtW строка 3420)
.BASE
F5: ; Заголовок формы
.DB 0 ; максимальный номер элемента
.DBB F5DE, F5PI, F5PO, F5PL, F5PR, F5RI, F5KM ; таблица смещений
F5DE: ;таблица флагов действий
.DB 60 ; 00111100 ввод и выход с обработкой
F5PI:
F5PO: .DB 1,0
F5PL:
F5PR: .DB 0
F5RI: ; основная программа экранной формы
.DB LCALL
.DA FSFONT
.DB LCALL
.DA FSFRAME
.DB LCALL
.DA FSIMM
.DB TAB, 40, 20
.DB TXTP, 16
.DA F5T0
.DB TAB, 30, 30
.DB TXTP, 16
.DA F5T1
.DB TAB, 20, 40
.DB TXTP, 16
.DA F5T2
.DB END ; конец основной программы
F5KM: .DBB F5KM0
F5KM0: .DB END
F5T0: .TEXT "ШМЯК-ШМЯК...\0"
F5T1: .TEXT "НЯМ-НЯМ-НЯМ...\0"
F5T2: .TEXT "Вампус Вас поймал!\0"
;======= Форма 6 - дальность полёта стрелы (HtW строки 3040-3060)
.BASE
F6: ; Заголовок формы
.DB 4 ; максимальный номер элемента
.DBB F6DE, F6PI, F6PO, F6PL, F6PR, F6RI, F6KM ; таблица смещений
F6DE: ;таблица флагов действий
.DB 189,189,189,189,189 ; 10111101 выбор, ввод и выход с обработкой, без очистки
F6PI:
F6PO: .DB 1,0,1,0,1,0,1,0,1,0
F6PL: .DB 0,0,1,2,3 ; нет цикла: из 0 в 0
F6PR: .DB 1,2,3,4,4 ; нет цикла: из 4 в 4
F6RI: ; основная программа экранной формы
.DB LCALL
.DA FSFONT
.DB LCALL
.DA FSFRAME
.DB TAB, 12, 10
.DB TXTP, 16
.DA F6T0
.DB END ; конец основной программы
F6KM: .DBB F6KM0, F6KM1, F6KM2, F6KM3, F6KM4
F6KM0: .DB MCALL
.DBB F6S0
.DB TAB, 40, 44
.DB TXTP, 16
.DA F6T1
.DB END
F6KM1: .DB MCALL
.DBB F6S1
.DB TAB, 40, 44
.DB TXTP, 16
.DA F6T2
.DB END
F6KM2: .DB MCALL
.DBB F6S2
.DB TAB, 40, 44
.DB TXTP, 16
.DA F6T3
.DB END
F6KM3: .DB MCALL
.DBB F6S3
.DB TAB, 40, 44
.DB TXTP, 16
.DA F6T4
.DB END
F6KM4: .DB MCALL
.DBB F6S4
.DB TAB, 40, 44
.DB TXTP, 16
.DA F6T5
.DB END
F6S4: .DB TAB, 80,20
.DB SQU, 0,8,20
F6S3: .DB TAB, 70,20
.DB SQU, 0,8,20
F6S2: .DB TAB, 60,20
.DB SQU, 0,8,20
F6S1: .DB TAB, 50,20
.DB SQU, 0,8,20
F6S0: .DB TAB, 40,20
.DB SQU, 0,8,20
.DB RETUM
F6T0: .TEXT "Дальность полёта стрелы\0"
F6T1: .TEXT "Одна комната\0"
F6T2: .TEXT "Две комнаты\0"
F6T3: .TEXT "Три комнаты\0"
F6T4: .TEXT "Четыре комнаты\0"
F6T5: .TEXT "Пять комнат\0"
;======= Форма 7 - маршрут стрелы (HtW строки 3027-3115)
.BASE
F7: ; Заголовок формы
.DB 19 ; максимальный номер элемента
.DBB F7DE, F7PI, F7PO, F7PL, F7PR, F7RI, F7KM ; таблица смещений
F7DE: ;таблица флагов действий - обязательна
.DB 191,191,191,191,191 ; 10111111 выбор, ввод и выход с обработкой, без очистки
.DB 191,191,191,191,191
.DB 191,191,191,191,191
.DB 191,191,191,191,191
F7PI: ; Таблицы отсутствуют для уменьшения размеров формы
F7PO: ; Поскольку обработка всех команд
F7PL: ; выполняется отдельно (см. флаги действий)
F7PR: ; С тем же успехом можно было указать смещение 0 в заголовке
F7RI: ; основная программа экранной формы
.DB LCALL
.DA FSFONT
.DB LCALL
.DA FSFRAME
.DB TAB, 36, 10
.DB TXTP, 16
.DA F7T0
.DB TAB, 10, 20
.DB TXTB, 16
.DA STR1
.DB TAB, 10, 34
.DB TXTP, 16
.DA F7T1
.DB TAB, 10, 44
.DB TXTP, 16
.DA F7T2
.DB END ; конец основной программы
F7KM: .DBB F7KM0, F7KM1, F7KM2, F7KM3, F7KM4
.DBB F7KM5, F7KM6, F7KM7, F7KM8, F7KM9
.DBB F7KM10, F7KM11, F7KM12, F7KM13, F7KM14
.DBB F7KM15, F7KM16, F7KM17, F7KM18, F7KM19
F7KM0: .DB TAB, 9, 33
.DB JM
.DBB F7KME
F7KM1: .DB TAB, 20, 33
.DB JM
.DBB F7KME
F7KM2: .DB TAB, 31, 33
.DB JM
.DBB F7KME
F7KM3: .DB TAB, 42, 33
.DB JM
.DBB F7KME
F7KM4: .DB TAB, 53, 33
.DB JM
.DBB F7KME
F7KM5: .DB TAB, 64, 33
.DB JM
.DBB F7KME
F7KM6: .DB TAB, 75, 33
.DB JM
.DBB F7KME
F7KM7: .DB TAB, 86, 33
.DB JM
.DBB F7KME
F7KM8: .DB TAB, 97, 33
.DB JM
.DBB F7KME
F7KM9: .DB TAB, 108, 33
.DB JM
.DBB F7KME
F7KM10:.DB TAB, 9, 43
.DB JM
.DBB F7KME
F7KM11: .DB TAB, 20, 43
.DB JM
.DBB F7KME
F7KM12: .DB TAB, 31, 43
.DB JM
.DBB F7KME
F7KM13: .DB TAB, 42, 43
.DB JM
.DBB F7KME
F7KM14: .DB TAB, 53, 43
.DB JM
.DBB F7KME
F7KM15: .DB TAB, 64, 43
.DB JM
.DBB F7KME
F7KM16: .DB TAB, 75, 43
.DB JM
.DBB F7KME
F7KM17: .DB TAB, 86, 43
.DB JM
.DBB F7KME
F7KM18: .DB TAB, 97, 43
.DB JM
.DBB F7KME
F7KM19: .DB TAB, 108, 43
F7KME: .DB SQU, 3,9,7
.DB END
F7T0: .TEXT "Маршрут стрелы\0"
F7T1: ; строка от 1 до 10 с пробелами шириной в цифру
.DB 31,49,32,31,50,32,31,51,32,31,52,32,31,53,32
.DB 31,54,32,31,55,32,31,56,32,31,57,32,49,48,0
F7T2: .TEXT "11 12 13 14 15 16 17 18 19 20\0"
;======= Форма 8 - Возврат стрелы недопустим (HtW строка 3105)
.BASE
F8: ; Заголовок формы
.DB 0 ; максимальный номер элемента
.DBB F8DE, F8PI, F8PO, F8PL, F8PR, F8RI, F8KM ; таблица смещений
F8DE: ;таблица флагов действий
.DB 188 ; 10111100 ввод и выход с обработкой, без очистки
F8PI:
F8PO: .DB 1,0
F8PL:
F8PR: .DB 0
F8RI: ; основная программа экранной формы
.DB LCALL
.DA FSFONT
.DB TAB, 5,26 ; рамка меньшего размера
.DB SQU, 4,118,30 ; атрибут 4 = NOT (белый прямоугольник)
.DB TAB, 6,27
.DB FRAME, 0,116,28 ; атрибут 0 - замена (рамка)
.DB TAB, 8, 30
.DB TXTP, 16
.DA F8T0
.DB TAB, 8, 38
.DB TXTP, 16
.DA F8T1
.DB END ; конец основной программы
F8KM: .DBB F8KM0
F8KM0: .DB END
F8T0: .TEXT "Так стрелы не летают\0"
F8T1: .TEXT "Измените маршрут\0"
;======= Форма 9 - Выстрел
.BASE
F9: ; Заголовок формы
.DB 1 ; максимальный номер элемента
.DBB F9DE, F9PI, F9PO, F9PL, F9PR, F9RI, F9KM ; таблица смещений
F9DE: ;таблица флагов действий
.DB 189,189 ; 10111101 выбор,ввод и выход с обработкой, без очистки
F9PI:
F9PO: .DB 1,0,1,0
F9PL:
F9PR: .DB 1,0
F9RI: ; основная программа экранной формы
.DB LCALL
.DA FSFONT
.DB LCALL
.DA FSFRAME
.DB TAB, 6, 10
.DB TXTP, 16
.DA F9T0
.DB TAB, 6, 20
.DB TXTB, 16
.DA STR1 ; маршрут
.DB TAB, 6, 30
.DB TXTP, 16
.DA F9T1
.DB TAB, 56, 30
.DB PREXP, 16
.DA ARR
.DB TAB, 47, 40
.DB TXTP, 16
.DA F9T2
.DB TAB, 44, 48
.DB TXTP, 16
.DA F9T3
.DB END ; конец основной программы
F9KM: .DBB F9KM0,F9KM1
F9KM0: .DB TAB, 26, 39
.DB JM
.DBB F9KME
F9KM1: .DB TAB, 26, 47
F9KME: .DB SQU, 3, 76, 7
.DB END
F9T0: .TEXT "Маршрут:\0"
F9T1: .TEXT "Запас стрел:\0"
F9T2: .TEXT "Стрелять\0"
F9T3: .TEXT "Отставить\0"
;======= Форма 10 - Попали в Вампуса (HtW строка 3310)
.BASE
F10: ; Заголовок формы
.DB 0 ; максимальный номер элемента
.DBB F10DE, F10PI, F10PO, F10PL, F10PR, F10RI, F10KM ; таблица смещений
F10DE: ;таблица флагов действий
.DB 60 ; 00111100 ввод и выход с обработкой
F10PI:
F10PO: .DB 1,0
F10PL:
F10PR: .DB 0
F10RI: ; основная программа экранной формы
.DB LCALL
.DA FSFONT
.DB LCALL
.DA FSFRAME
.DB LCALL
.DA FSIWUM1
.DB JNEZ
.DA ARRERR
.DBB F10RI1
.DB TAB, 40, 20
.DB TXTP, 16
.DA F10T2
F10RI1:
.DB TAB, 60, 30
.DB TXTP, 16
.DA F10T0
.DB TAB, 10, 40
.DB TXTP, 16
.DA F10T1
.DB END ; конец основной программы
F10KM: .DBB F10KM0
F10KM0: .DB END
F10T0: .TEXT "ТАК ТОЧНО!\0"
F10T1: .TEXT "Вы пристрелили Вампуса!\0"
F10T2: .TEXT "Ошибка маршрута\0"
;======= Форма 11 - Попали в себя (HtW строка 3350)
.BASE
F11: ; Заголовок формы
.DB 0 ; максимальный номер элемента
.DBB F11DE, F11PI, F11PO, F11PL, F11PR, F11RI, F11KM ; таблица смещений
F11DE: ;таблица флагов действий
.DB 60 ; 00111100 ввод и выход с обработкой
F11PI:
F11PO: .DB 1,0
F11PL:
F11PR: .DB 0
F11RI: ; основная программа экранной формы
.DB LCALL
.DA FSFONT
.DB LCALL
.DA FSFRAME
.DB LCALL
.DA FSIMM
.DB JNEZ
.DA ARRERR
.DBB F11RI1
.DB TAB, 40, 20
.DB TXTP, 16
.DA F10T2
F11RI1:
.DB TAB, 60, 30
.DB TXTP, 16
.DA F11T0
.DB TAB, 10, 40
.DB TXTP, 16
.DA F11T1
.DB END ; конец основной программы
F11KM: .DBB F11KM0
F11KM0: .DB END
F11T0: .TEXT "ОХ!\0"
F11T1: .TEXT "Стрела попала в Вас\0"
;======= Форма 12 - Промах (HtW строка 3220)
.BASE
F12: ; Заголовок формы
.DB 0 ; максимальный номер элемента
.DBB F12DE, F12PI, F12PO, F12PL, F12PR, F12RI, F12KM ; таблица смещений
F12DE: ;таблица флагов действий
.DB 60 ; 00111100 ввод и выход с обработкой
F12PI:
F12PO: .DB 1,0
F12PL:
F12PR: .DB 0
F12RI: ; основная программа экранной формы
.DB LCALL
.DA FSFONT
.DB LCALL
.DA FSFRAME
.DB LCALL
.DA FSIWUM1
.DB JNEZ
.DA ARRERR
.DBB F12RI1
.DB TAB, 40, 20
.DB TXTP, 16
.DA F10T2
F12RI1:
.DB TAB, 60, 30
.DB TXTP, 16
.DA F12T0
.DB TAB, 10, 40
.DB TXTP, 16
.DA F12T1
.DB END ; конец основной программы
F12KM: .DBB F12KM0
F12KM0: .DB END
F12T0: .TEXT "Промах...\0"
F12T1: .TEXT "Вампус проснулся\0"
;======= Форма 13 - Нет стрел
.BASE
F13: ; Заголовок формы
.DB 0 ; максимальный номер элемента
.DBB F13DE, F13PI, F13PO, F13PL, F13PR, F13RI, F13KM ; таблица смещений
F13DE: ;таблица флагов действий
.DB 60 ; 00111100 ввод и выход с обработкой
F13PI:
F13PO: .DB 1,0
F13PL:
F13PR: .DB 0
F13RI: ; основная программа экранной формы
.DB LCALL
.DA FSFONT
.DB LCALL
.DA FSFRAME
.DB LCALL
.DA FSIMM
.DB TAB, 6, 30
.DB TXTP, 16
.DA F13T0
.DB TAB, 6, 40
.DB TXTP, 16
.DA F13T1
.DB END ; конец основной программы
F13KM: .DBB F13KM0
F13KM0: .DB END
F13T0: .TEXT "А нечем стрелять\0"
F13T1: .TEXT "Стрелы закончились\0"
;======= Форма 14 - Правила 1
.BASE
F14: ; Заголовок формы
.DB 0 ; максимальный номер элемента
.DBB F14DE, F14PI, F14PO, F14PL, F14PR, F14RI, F14KM ; таблица смещений
F14DE: ;таблица флагов действий
.DB 20 ; 00010100 разрешён ввод и выход
F14PI: .DB 15,0 ; Ввод - F15E0
F14PO: .DB 1,2 ; Выход - перейти в F1E2 обычным образом
F14PL:
F14PR: .DB 0
F14RI: ; основная программа экранной формы
.DB TAB, 0,2
.DB TXTP, 16
.DA F14T0
.DB TAB, 0,8
.DB TXTP, 16
.DA F14T1
.DB TAB, 0,14
.DB TXTP, 16
.DA F14T2
.DB TAB, 0,20
.DB TXTP, 16
.DA F14T3
.DB TAB, 0,26
.DB TXTP, 16
.DA F14T4
.DB TAB, 0,32
.DB TXTP, 16
.DA F14T5
.DB TAB, 0,38
.DB TXTP, 16
.DA F14T6
.DB TAB, 0,44
.DB TXTP, 16
.DA F14T7
.DB TAB, 0,50
.DB TXTP, 16
.DA F14T8
.DB TAB, 0,56
.DB TXTP, 16
.DA F14T9
.DB END ; конец основной программы
F14KM: .DBB F14KM0
F14KM0: .DB END
F14T0: .TEXT "Вампус - монстр, обитающий в\0"
F14T1: .TEXT "пещерах. Питается людьми.\0"
F14T2: .TEXT "Изрядно воняет, большую часть\0"
F14T3: .TEXT "времени проводит в спячке.\0"
F14T4: .TEXT "Цель игры - пристрелить его.\0"
F14T5: .TEXT "Но в запасе всего пять стрел.\0"
F14T6: .TEXT "В пещере есть опасные ямы.\0"
F14T7: .TEXT "Из которых дует сквозняк.\0"
F14T8: .TEXT "Есть и летучие мыши,\0"
F14T9: .TEXT "которые могут утащить Вас.\0"
;======= Форма 15 - Правила 2
.BASE
F15: ; Заголовок формы
.DB 0 ; максимальный номер элемента
.DBB F15DE, F15PI, F15PO, F15PL, F15PR, F15RI, F15KM ; таблица смещений
F15DE: ;таблица флагов действий
.DB 20 ; 00010100 разрешён ввод и выход
F15PI: .DB 16,0 ; Ввод - F16E0
F15PO: .DB 1,2 ; Выход - перейти в F1E2 обычным образом
F15PL:
F15PR: .DB 0
F15RI: ; основная программа экранной формы
.DB TAB, 0,2
.DB TXTP, 16
.DA F15T0
.DB TAB, 0,8
.DB TXTP, 16
.DA F15T1
.DB TAB, 0,14
.DB TXTP, 16
.DA F15T2
.DB TAB, 0,20
.DB TXTP, 16
.DA F15T3
.DB TAB, 0,26
.DB TXTP, 16
.DA F15T4
.DB TAB, 0,32
.DB TXTP, 16
.DA F15T5
.DB TAB, 0,38
.DB TXTP, 16
.DA F15T6
.DB TAB, 0,44
.DB TXTP, 16
.DA F15T7
.DB TAB, 0,50
.DB TXTP, 16
.DA F15T8
.DB TAB, 0,56
.DB TXTP, 16
.DA F15T9
.DB END ; конец основной программы
F15KM: .DBB F15KM0
F15KM0: .DB END
F15T0: .TEXT "Запах, сквозняк и шум\0"
F15T1: .TEXT "исходят из соседних комнат.\0"
F15T2: .TEXT "Из какой точно - неизвестно.\0"
F15T3: .TEXT "Выбор идти или стрелять - \0"
F15T4: .TEXT "кнопками Выбора.\0"
F15T5: .TEXT "Стрела пролетает от 1 до 5\0"
F15T6: .TEXT "комнат. Маршрут указывается\0"
F15T7: .TEXT "перед выстрелом. При ошибке\0"
F15T8: .TEXT "стрела улетает в сторону\0"
F15T9: .TEXT "и может попасть в Вас.\0"
;======= Форма 16 - Правила 3
.BASE
F16: ; Заголовок формы
.DB 0 ; максимальный номер элемента
.DBB F16DE, F16PI, F16PO, F16PL, F16PR, F16RI, F16KM ; таблица смещений
F16DE: ;таблица флагов действий
.DB 20 ; 00010100 разрешён ввод и выход
F16PI:
F16PO: .DB 1,2 ; Выход - перейти в F1E2 обычным образом
F16PL:
F16PR: .DB 0
F16RI: ; основная программа экранной формы
.DB TAB, 0,2
.DB TXTP, 16
.DA F16T0
.DB TAB, 0,8
.DB TXTP, 16
.DA F16T1
.DB TAB, 0,14
.DB TXTP, 16
.DA F16T2
.DB TAB, 0,20
.DB TXTP, 16
.DA F16T3
.DB TAB, 0,26
.DB TXTP, 16
.DA F16T4
.DB TAB, 0,32
.DB TXTP, 16
.DA F16T5
.DB TAB, 0,44
.DB TXTP, 16
.DA F16T6
.DB TAB, 0,50
.DB TXTP, 16
.DA F16T7
.DB TAB, 0,56
.DB TXTP, 16
.DA F16T8
.DB END ; конец основной программы
F16KM: .DBB F16KM0
F16KM0: .DB END
F16T0: .TEXT "После каждого выстрела Вампус\0"
F16T1: .TEXT "пробуждается и способен\0"
F16T2: .TEXT "переползти в другую комнату,\0"
F16T3: .TEXT "включая Вашу. На него можно\0"
F16T4: .TEXT "и наткнуться, тогда он Вас\0"
F16T5: .TEXT "съест с вероятностью 25%.\0"
F16T6: .TEXT "В остальном интерфейс игры\0"
F16T7: .TEXT "интуитивно понятен.\0"
F16T8: .TEXT "Ни пуха, ни пера!\0"
;========== Подпрограммы экранных форм
FSFONT: ; установка шрифта 5
.DB TYPE, 254 ; шрифт пользователя
.DB ATYPE
.DA FONT5
.DB RETUL
FSFRAME: ; вывод рамки
.DB TAB, 3,6
.DB SQU, 4,122,52 ; атрибут 4 = NOT (белый прямоугольник)
.DB TAB, 4,7
.DB FRAME, 0,120,50 ; атрибут 0 - замена (рамка)
.DB RETUL
FSIMM: ; вывод рисунка IMM
.DB TAB, 8, 10
.DB DRAWP,0
.DA IMM
.DB RETUL
FSIWUM1: ; вывод рисунка IWUM1
.DB TAB, 8, 10
.DB DRAWP, 0
.DA IWUM1
.DB RETUL
;===================================================================
IFON:
.DB 80h, 14h
.DB 0, 0, 0
.DB 0, 0, 8
.DB 0, 80h, 8
.DB 0, 10h, 8
.DB 40h, 2, 9
.DB 40h, 26h, 9
.DB 40h, 0C4h, 0Fh
.DB 0C8h, 70h, 0Ah
.DB 30h, 0DCh, 0Fh
.DB 0, 77h, 0
.DB 0A0h, 1Dh, 4
.DB 90h, 66h, 3
.DB 0ECh, 0B7h, 1
.DB 20h, 73h, 0
.DB 0F0h, 1Fh, 0
.DB 0D0h, 3, 0
.DB 0F8h, 5, 0
.DB 0E8h, 2, 0
.DB 0FCh, 0, 0
.DB 0F4h, 1, 0
.DB 7Ch, 1, 0
.DB 0D4h, 0, 0
.DB 09Ch, 0, 0
.DB 94h, 0, 0
.DB 74h, 1, 0
.DB 5Ch, 1, 0
.DB 0D4h, 2, 0
.DB 0D4h, 2, 0
.DB 0BCh, 6, 0
.DB 0A8h, 0Dh, 0
.DB 68h, 9, 0
.DB 78h, 12h, 0
.DB 0D0h, 6Eh, 0
.DB 0B0h, 4Ch, 0
.DB 0ACh, 0DBh, 1
.DB 64h, 23h, 1
.DB 0C0h, 16h, 3
.DB 88h, 3Fh, 6
.DB 90h, 66h, 0
.DB 0A0h, 0DCh, 0Fh
.DB 10h, 70h, 0Ah
.DB 50h, 0C0h, 0Fh
.DB 50h, 1Eh, 8
.DB 0D0h, 0D5h, 0Dh
.DB 50h, 24h, 0Bh
.DB 50h, 34h, 8
.DB 80h, 0D5h, 0Fh
.DB 80h, 78h, 9
.DB 20h, 0A8h, 0Fh
.DB 10h, 0EFh, 0
.DB 18h, 39h, 5
.DB 88h, 4Fh, 2
.DB 0E0h, 62h, 1
.DB 0A0h, 09Bh, 0
.DB 0F0h, 0CCh, 0
.DB 50h, 26h, 0
.DB 58h, 1Bh, 0
.DB 68h, 0Ch, 0
.DB 0BCh, 6, 0
.DB 14h, 1, 0
.DB 0F4h, 1, 0
.DB 0FCh, 0, 0
.DB 74h, 0, 0
.DB 0F4h, 0, 0
.DB 74h, 0, 0
.DB 0FCh, 0, 0
.DB 74h, 1, 0
.DB 0F4h, 0, 0
.DB 34h, 3, 0
.DB 0BCh, 6, 0
.DB 28h, 1Dh, 0
.DB 78h, 35h, 0
.DB 0D2h, 0EEh, 0
.DB 90h, 98h, 0
.DB 0F0h, 0B5h, 1
.DB 44h, 63h, 3
.DB 0C0h, 0AEh, 4
.DB 88h, 8Bh, 0Dh
.DB 70h, 7Ah, 0
.DB 40h, 0CEh, 0Fh
.DB 0D8h, 38h, 9
.DB 8Ch, 0E0h, 0Fh
.DB 4, 9, 8
.DB 0Ch, 39h, 0Bh
.DB 18h, 0A0h, 9
.DB 40h, 2Ch, 8
.DB 38h, 86h, 0Fh
.DB 0, 0F3h, 0Ah
.DB 44h, 09Ch, 0Fh
.DB 26h, 0F7h, 0
.DB 32h, 1Dh, 4
.DB 0D2h, 85h, 2
.DB 42h, 77h, 1
.DB 0E0h, 0A1h, 0
.DB 0B0h, 0F4h, 0
.DB 0DAh, 34h, 0
.DB 68h, 2Dh, 0
.DB 39h, 15h, 0
.DB 0ABh, 1Ah, 0
.DB 0BDh, 9, 0
.DB 95h, 5, 0
.DB 0DFh, 5, 0
.DB 0D4h, 6, 0
.DB 54h, 2, 0
.DB 54h, 1, 0
.DB 0DCh, 1, 0
.DB 94h, 2, 0
.DB 0FEh, 2, 0
.DB 0F6h, 1, 0
.DB 0FEh, 3, 0
.DB 0E8h, 1, 0
.DB 0E9h, 7, 0
.DB 0FEh, 0Bh, 0
.DB 92h, 0Fh, 0
.DB 0F6h, 17h, 0
.DB 44h, 0FFh, 0
.DB 0C4h, 46h, 3
.DB 90h, 1Dh, 0Eh
.DB 30h, 77h, 0
.DB 24h, 0DCh, 0Fh
.DB 84h, 71h, 9
.DB 16h, 0C3h, 0Fh
.DB 2, 0DEh, 9
.DB 0, 8, 0Bh
.DB 20h, 6Bh, 9
.DB 0, 4Ah, 0Bh
.DB 40h, 50h, 0Ah
.DB 0, 0, 8
IS0:
.DB 0Ah, 10h
.DB 1Fh, 0
.DB 0FEh, 7
.DB 0FCh, 3
.DB 0F8h, 1
.DB 0F8h, 3
.DB 0F0h, 7
.DB 60h, 1Eh
.DB 40h, 0FCh
.DB 40h, 0F0h
.DB 0, 0E0h
IS1:
.DB 6, 10h
.DB 0C0h, 1
.DB 0F8h, 0
.DB 0FFh, 0FFh
.DB 0FBh, 0FFh
.DB 0F8h, 0
.DB 0C0h, 1
IS2:
.DB 0Ah, 10h
.DB 0, 0E0h
.DB 0, 0F0h
.DB 40h, 78h
.DB 60h, 1Eh
.DB 0F0h, 0Fh
.DB 0F0h, 3
.DB 0F8h, 1
.DB 0FCh, 7
.DB 0FEh, 3
.DB 1Fh, 0
IWUMPUS:
.DB 32h, 40h
.DB 0, 0, 0, 0, 0, 0, 0, 0
.DB 0, 0, 1, 0, 0, 0, 0, 0
.DB 0, 80h, 2, 40h, 0, 0, 20h, 0
.DB 0, 40h, 2, 0, 0, 0, 0, 0
.DB 0, 7Eh, 4, 20h, 0, 0, 10h, 10h
.DB 0, 1, 2, 10h, 0, 0, 0, 8
.DB 0, 0DDh, 2, 0, 0, 0, 8, 0
.DB 0C0h, 2, 1, 8, 0, 0, 4, 2
.DB 40h, 1, 0, 0, 0, 0, 0, 0
.DB 0A0h, 0, 0, 0, 0, 0, 1, 0
.DB 50h, 0, 0, 5Ch, 2, 0, 80h, 0
.DB 50h, 0, 0, 0AAh, 0BFh, 27h, 0, 0
.DB 48h, 0, 0A0h, 5Fh, 0F3h, 1Dh, 0, 0
.DB 48h, 0E0h, 0F2h, 0B6h, 19h, 50h, 80h, 0Fh
.DB 48h, 0B0h, 0D7h, 1Bh, 8, 78h, 40h, 19h
.DB 48h, 09Fh, 5Ah, 0Ch, 0, 70h, 40h, 16h
.DB 0C8h, 4, 68h, 3, 0, 0C0h, 81h, 28h
.DB 0C8h, 0CCh, 50h, 0, 0C0h, 67h, 80h, 29h
.DB 8, 94h, 71h, 44h, 0, 88h, 55h, 29h
.DB 8, 09Ch, 4, 84h, 1, 0C0h, 34h, 20h
.DB 8, 0D8h, 68h, 88h, 0, 0C5h, 0Fh, 2Bh
.DB 8, 6Ah, 0E8h, 0Bh, 1, 0Fh, 80h, 26h
.DB 10h, 8Ah, 9, 1Bh, 1, 0Bh, 70h, 18h
.DB 20h, 64h, 0CAh, 11h, 1, 16h, 0Eh, 0
.DB 0C0h, 0C6h, 80h, 3Fh, 7Eh, 0F6h, 1, 80h
.DB 80h, 0C5h, 0F0h, 2Ch, 21h, 46h, 0, 0C0h
.DB 0, 64h, 17h, 22h, 0C1h, 8, 2, 40h
.DB 0, 0Ch, 5, 3, 81h, 88h, 18h, 40h
.DB 0, 0F0h, 4, 33h, 0C1h, 0Ch, 0C0h, 20h
.DB 0, 0, 88h, 91h, 80h, 8, 41h, 21h
.DB 0, 0, 88h, 90h, 0C0h, 88h, 40h, 22h
.DB 0, 0, 88h, 48h, 80h, 78h, 0F4h, 12h
.DB 0, 0, 88h, 48h, 80h, 68h, 0A3h, 12h
.DB 0, 0, 4Ch, 44h, 80h, 82h, 09Dh, 0Ah
.DB 0, 0, 44h, 44h, 10h, 17h, 0, 0Ah
.DB 0, 0, 22h, 2Fh, 10h, 0E8h, 8Eh, 0Ah
.DB 0, 0, 63h, 21h, 10h, 0, 89h, 6
.DB 0, 80h, 0B3h, 3Eh, 24h, 40h, 0D0h, 2
.DB 0, 80h, 19h, 23h, 24h, 20h, 0A0h, 2
.DB 0, 40h, 0Ch, 35h, 28h, 10h, 78h, 3Dh
.DB 0, 40h, 2, 2Bh, 68h, 34h, 48h, 1
.DB 0, 20h, 1, 1Ch, 48h, 36h, 8, 80h
.DB 0, 0B8h, 1, 0, 48h, 4Ah, 0F8h, 8Fh
.DB 0, 0ACh, 1, 0, 88h, 4Ah, 4, 40h
.DB 0, 0DCh, 0, 0, 90h, 61h, 4, 40h
.DB 0, 8Ah, 0, 0, 10h, 0DFh, 4, 40h
.DB 0, 8Ah, 1, 0, 10h, 80h, 4, 80h
.DB 0, 0D2h, 0, 0, 30h, 80h, 2, 20h
.DB 0, 7Ch, 0, 0, 0F0h, 0FFh, 2, 20h
.DB 0, 0, 0, 0, 90h, 0, 3, 0
IPIT:
.DB 2Ch, 20h
.DB 0, 0, 1Eh, 0
.DB 0, 0C0h, 0Bh, 0
.DB 0, 0F8h, 27h, 0
.DB 0F8h, 0BFh, 24h, 0
.DB 0F8h, 5Fh, 43h, 0
.DB 0D0h, 0A9h, 0F1h, 0
.DB 38h, 0B7h, 0F8h, 7
.DB 3Ch, 0, 0F8h, 7
.DB 47h, 78h, 0ECh, 7
.DB 0BCh, 48h, 0D2h, 0Fh
.DB 40h, 49h, 0AEh, 0Fh
.DB 80h, 4Ah, 7Eh, 0Fh
.DB 0, 0C8h, 0F3h, 0Fh
.DB 0C0h, 48h, 0AAh, 1Fh
.DB 0, 48h, 52h, 1Fh
.DB 80h, 48h, 92h, 1Eh
.DB 0, 49h, 42h, 3Fh
.DB 0, 78h, 8Ch, 3Fh
.DB 0, 1, 0E4h, 3Fh
.DB 0, 0, 0C4h, 7Fh
.DB 0, 0, 0F4h, 0FFh
.DB 0, 4, 0E6h, 0FFh
.DB 0, 1, 0E2h, 7Fh
.DB 0, 0, 0BAh, 7Fh
.DB 0, 81h, 0C2h, 7Fh
.DB 0, 80h, 0F2h, 1Fh
.DB 0, 40h, 0C6h, 1Fh
.DB 80h, 0C0h, 84h, 0
.DB 0, 40h, 0FDh, 0
.DB 80h, 0E0h, 7Ch, 0
.DB 0, 0B8h, 78h, 20h
.DB 80h, 0Fh, 30h, 10h
.DB 0E0h, 67h, 0, 28h
.DB 0FCh, 95h, 3, 1Ch
.DB 28h, 0, 0, 7
.DB 0A0h, 0, 82h, 1
.DB 40h, 1, 80h, 0
.DB 0, 7Eh, 82h, 3
.DB 0, 40h, 0, 6
.DB 0, 80h, 0Ch, 4
.DB 0, 80h, 0C4h, 7
.DB 0, 0, 41h, 0
.DB 0, 0, 73h, 0
.DB 0, 0, 30h, 0
IBAT:
.DB 32h, 17h
.DB 0, 0, 40h
.DB 0, 0, 60h
.DB 0, 0, 30h
.DB 0, 0, 3Ch
.DB 0, 20h, 1Fh
.DB 0, 3Ch, 0Dh
.DB 0, 0B4h, 0Fh
.DB 0, 09Ch, 6
.DB 0, 0F4h, 7
.DB 0, 6Ah, 0Eh
.DB 0, 0F7h, 3
.DB 0, 55h, 1
.DB 80h, 0B3h, 1
.DB 80h, 0FAh, 1
.DB 80h, 0E9h, 0
.DB 80h, 0ACh, 0
.DB 80h, 2Dh, 0
.DB 0C0h, 34h, 0
.DB 7Ch, 1Ch, 0
.DB 94h, 1Dh, 0
.DB 58h, 0Ah, 0
.DB 0D0h, 0Bh, 0
.DB 90h, 5, 0
.DB 8, 0Eh, 0
.DB 67h, 0Bh, 0
.DB 0DFh, 0Fh, 0
.DB 0F0h, 8, 0
.DB 0, 5, 0
.DB 80h, 5, 0
.DB 0, 5, 0
.DB 0, 3, 0
.DB 0, 0Dh, 0
.DB 0, 5, 0
.DB 0, 5, 0
.DB 0, 7, 0
.DB 80h, 2, 0
.DB 80h, 0Dh, 0
.DB 80h, 1Ah, 0
.DB 80h, 7, 0
.DB 80h, 2, 0
.DB 80h, 7, 0
.DB 80h, 4, 0
.DB 80h, 0Ah, 0
.DB 0C0h, 1Ch, 0
.DB 40h, 5, 0
.DB 40h, 6, 0
.DB 40h, 4, 0
.DB 40h, 2, 0
.DB 0C0h, 7, 0
.DB 40h, 0, 0
IMM:
.DB 0Dh, 0Fh
.DB 80h, 21h
.DB 80h, 61h
.DB 2Eh, 33h
.DB 6Dh, 1Bh
.DB 59h, 0Ch
.DB 4Dh, 6
.DB 2Dh, 3
.DB 09Ah, 5
.DB 0C0h, 5
.DB 0E0h, 8
.DB 70h, 18h
.DB 70h, 38h
.DB 30h, 18h
IWUM1:
.DB 17h, 1Ch
.DB 0, 0, 0, 0
.DB 0, 0, 0Eh, 0
.DB 0, 24h, 1Fh, 0
.DB 80h, 24h, 0Eh, 0
.DB 20h, 0D9h, 8Fh, 7
.DB 50h, 0DEh, 0C3h, 1
.DB 0E8h, 7Ah, 0E1h, 0Fh
.DB 4Ch, 0E3h, 0F1h, 0
.DB 18h, 0AAh, 0F3h, 7
.DB 4Ch, 0B0h, 0F7h, 0
.DB 0CEh, 23h, 0BFh, 3
.DB 1Eh, 0E6h, 1Eh, 0
.DB 8, 51h, 0Eh, 0
.DB 1Fh, 0D6h, 1Eh, 0
.DB 0C8h, 91h, 3, 0
.DB 5Eh, 0A0h, 0, 0
.DB 0Ch, 0F8h, 3Bh, 0
.DB 64h, 0EDh, 3Fh, 0
.DB 3Ah, 53h, 1Fh, 0
.DB 64h, 57h, 1Ch, 0
.DB 0A0h, 12h, 0Ch, 0
.DB 50h, 3, 0, 0
.DB 0, 0, 0, 0
;============================= Шрифт 5
; Шрифт 5 - дополненный char31
.BASE
FONT5: .DB 5 ; высота шрифта
.DB 31,3
.DWB CHAR31
.DB 32,2
.DWB CHAR32
; 48-57 цифры
.DB 48,3
.DWB CHAR48
.DB 49,3
.DWB CHAR49
.DB 50,3
.DWB CHAR50
.DB 51,3
.DWB CHAR51
.DB 52,3
.DWB CHAR52
.DB 53,3
.DWB CHAR53
.DB 54,3
.DWB CHAR54
.DB 55,3
.DWB CHAR55
.DB 56,3
.DWB CHAR56
.DB 57,3
.DWB CHAR57
; русские буквы
.DB 128,3
.DWB CHAR128
.DB 160,3
.DWB CHAR128
.DB 129,3
.DWB CHAR129
.DB 161,3
.DWB CHAR129
.DB 130,4
.DWB CHAR130
.DB 162,4
.DWB CHAR130
.DB 131,3
.DWB CHAR131
.DB 163,3
.DWB CHAR131
.DB 132,5
.DWB CHAR132
.DB 164,5
.DWB CHAR132
.DB 133,3
.DWB CHAR133
.DB 165,3
.DWB CHAR133
.DB 134,5
.DWB CHAR134
.DB 166,5
.DWB CHAR134
.DB 135,3
.DWB CHAR135
.DB 167,3
.DWB CHAR135
.DB 136,4
.DWB CHAR136
.DB 168,4
.DWB CHAR136
.DB 137,5
.DWB CHAR137
.DB 169,5
.DWB CHAR137
.DB 138,4
.DWB CHAR138
.DB 170,4
.DWB CHAR138
.DB 139,4
.DWB CHAR139
.DB 171,4
.DWB CHAR139
.DB 140,5
.DWB CHAR140
.DB 172,5
.DWB CHAR140
.DB 141,3
.DWB CHAR141
.DB 173,3
.DWB CHAR141
.DB 142,4
.DWB CHAR142
.DB 174,4
.DWB CHAR142
.DB 143,3
.DWB CHAR143
.DB 175,3
.DWB CHAR143
.DB 144,3
.DWB CHAR144
.DB 224,3
.DWB CHAR144
.DB 145,3
.DWB CHAR145
.DB 225,3
.DWB CHAR145
.DB 146,3
.DWB CHAR146
.DB 226,3
.DWB CHAR146
.DB 147,3
.DWB CHAR147
.DB 227,3
.DWB CHAR147
.DB 148,5
.DWB CHAR148
.DB 228,5
.DWB CHAR148
.DB 149,3
.DWB CHAR149
.DB 229,3
.DWB CHAR149
.DB 150,4
.DWB CHAR150
.DB 230,4
.DWB CHAR150
.DB 151,4
.DWB CHAR151
.DB 231,4
.DWB CHAR151
.DB 152,5
.DWB CHAR152
.DB 232,5
.DWB CHAR152
.DB 153,6
.DWB CHAR153
.DB 233,6
.DWB CHAR153
.DB 154,4
.DWB CHAR154
.DB 234,4
.DWB CHAR154
.DB 155,5
.DWB CHAR155
.DB 235,5
.DWB CHAR155
.DB 156,3
.DWB CHAR156
.DB 236,3
.DWB CHAR156
.DB 157,3
.DWB CHAR157
.DB 237,3
.DWB CHAR157
.DB 158,5
.DWB CHAR158
.DB 238,5
.DWB CHAR158
.DB 159,4
.DWB CHAR159
.DB 239,4
.DWB CHAR159
.DB 240,5
.DWB CHAR240
.DB 241,5
.DWB CHAR240
; латинские буквы
.DB 65,3
.DWB CHAR128
.DB 97,3
.DWB CHAR128
.DB 66,4
.DWB CHAR130
.DB 98,4
.DWB CHAR130
.DB 67,3
.DWB CHAR145
.DB 99,3
.DWB CHAR145
.DB 68,4
.DWB CHAR68
.DB 100,4
.DWB CHAR68
.DB 69,3
.DWB CHAR133
.DB 101,3
.DWB CHAR133
.DB 70,3
.DWB CHAR70
.DB 102,3
.DWB CHAR70
.DB 71,3
.DWB CHAR71
.DB 103,3
.DWB CHAR71
.DB 72,3
.DWB CHAR141
.DB 104,3
.DWB CHAR141
.DB 73,3
.DWB CHAR73
.DB 105,3
.DWB CHAR73
.DB 74,4
.DWB CHAR74
.DB 106,4
.DWB CHAR74
.DB 75,4
.DWB CHAR138
.DB 107,4
.DWB CHAR138
.DB 76,3
.DWB CHAR76
.DB 108,3
.DWB CHAR76
.DB 77,5
.DWB CHAR140
.DB 109,5
.DWB CHAR140
.DB 78,4
.DWB CHAR78
.DB 110,4
.DWB CHAR78
.DB 79,4
.DWB CHAR142
.DB 111,4
.DWB CHAR142
.DB 80,3
.DWB CHAR144
.DB 112,3
.DWB CHAR144
.DB 81,5
.DWB CHAR81
.DB 113,5
.DWB CHAR81
.DB 82,4
.DWB CHAR82
.DB 114,4
.DWB CHAR82
.DB 83,4
.DWB CHAR83
.DB 115,4
.DWB CHAR83
.DB 84,3
.DWB CHAR146
.DB 116,3
.DWB CHAR146
.DB 85,4
.DWB CHAR85
.DB 117,4
.DWB CHAR85
.DB 86,5
.DWB CHAR86
.DB 118,5
.DWB CHAR86
.DB 87,5
.DWB CHAR87
.DB 119,5
.DWB CHAR87
.DB 88,3
.DWB CHAR149
.DB 120,3
.DWB CHAR149
.DB 89,3
.DWB CHAR147
.DB 121,3
.DWB CHAR147
.DB 90,4
.DWB CHAR90
.DB 122,4
.DWB CHAR90
; 33-47
.DB 33,1
.DWB CHAR33
.DB 34,3
.DWB CHAR34
.DB 35,5
.DWB CHAR35
.DB 36,5
.DWB CHAR36
.DB 37,5
.DWB CHAR37
.DB 38,5
.DWB CHAR38
.DB 39,1
.DWB CHAR39
.DB 40,2
.DWB CHAR40
.DB 41,2
.DWB CHAR41
.DB 42,3
.DWB CHAR42
.DB 43,3
.DWB CHAR43
.DB 44,2
.DWB CHAR44
.DB 45,3
.DWB CHAR45
.DB 46,1
.DWB CHAR46
.DB 47,5
.DWB CHAR47
; 58-64, 91-96
.DB 58,1
.DWB CHAR58
.DB 59,2
.DWB CHAR59
.DB 60,3
.DWB CHAR60
.DB 61,3
.DWB CHAR61
.DB 62,3
.DWB CHAR62
.DB 63,3
.DWB CHAR63
.DB 64,4
.DWB CHAR64
; 91-96
.DB 91,2
.DWB CHAR91
.DB 92,5
.DWB CHAR92
.DB 93,2
.DWB CHAR93
.DB 94,3
.DWB CHAR94
.DB 95,3
.DWB CHAR95
.DB 96,2
.DWB CHAR96
; 123-127
.DB 123,3
.DWB CHAR123
.DB 124,1
.DWB CHAR124
.DB 125,3
.DWB CHAR125
.DB 126,4
.DWB CHAR126
.DB 127,5
.DWB CHAR127
.DB 255
CHAR31: .DB 0
CHAR32: .DB 0,0
CHAR33: .DB 17h
CHAR34: .DB 3,0,3
CHAR35: .DB 0Ah,1Fh,0Ah,1Fh,0Ah
CHAR36: .DB 17h,15h,1Fh,15h,1Dh
CHAR37: .DB 13h,0Bh,4,1Ah,19h
CHAR38: .DB 1Ch,13h,17h,8,14h
CHAR39: .DB 3
CHAR40: .DB 0Eh,11h
CHAR41: .DB 11h,0Eh
CHAR42: .DB 0Ah,4,0Ah
CHAR43: .DB 4,0Eh,4
CHAR44: .DB 10h,8
CHAR45: .DB 4,4,4
CHAR46: .DB 10h
CHAR47: .DB 10h,8,4,2,1
CHAR48: .DB 1Fh,11h,1Fh
CHAR49: .DB 12h,1Fh,10h
CHAR50: .DB 19h,15h,13h
CHAR51: .DB 11h,15h,1Fh
CHAR52: .DB 7,4,1Fh
CHAR53: .DB 17h,15h,1Dh
CHAR54: .DB 1Eh,15h,1Dh
CHAR55: .DB 1,1Dh,3
CHAR56: .DB 1Bh,15h,1Bh
CHAR57: .DB 17h,15h,0Fh
CHAR58: .DB 0Ah
CHAR59: .DB 10h,0Ah
CHAR60: .DB 4,0Ah,11h
CHAR61: .DB 0Ah,0Ah,0Ah
CHAR62: .DB 11h,0Ah,4
CHAR63: .DB 1,15h,3
CHAR64: .DB 0Eh,11h,17h,17h
CHAR91: .DB 1Fh,11h
CHAR92: .DB 1,2,4,8,10h
CHAR93: .DB 11h,1Fh
CHAR94: .DB 2,1,2
CHAR95: .DB 10h,10h,10h
CHAR96: .DB 1,2
CHAR123: .DB 4,1Bh,11h
CHAR124: .DB 1Fh
CHAR125: .DB 11h,1Bh,4
CHAR126: .DB 2,1,2,1
CHAR127: .DB 1Ch,12h,11h,12h,1Ch
CHAR128: .DB 1Eh,9,1Eh
CHAR129: .DB 1Fh,15h,1Dh
CHAR130: .DB 1Fh,15h,15h,0Ah
CHAR131: .DB 1Fh,1,1
CHAR132: .DB 10h,1Eh,11h,1Fh,10h
CHAR133: .DB 1Fh,15h,11h
CHAR134: .DB 1Bh,4,1Fh,4,1Bh
CHAR135: .DB 11h,15h,1Bh
CHAR136: .DB 1Fh,8,4,1Fh
CHAR137: .DB 1Fh,10h,9,4,1Fh
CHAR138: .DB 1Fh,4,0Ah,11h
CHAR139: .DB 10h,1Eh,1,1Fh
CHAR140: .DB 1Fh,2,4,2,1Fh
CHAR141: .DB 1Fh,4,1Fh
CHAR142: .DB 0Eh,11h,11h,0Eh
CHAR143: .DB 1Fh,1,1Fh
CHAR144: .DB 1Fh,5,7
CHAR145: .DB 1Fh,11h,11h
CHAR146: .DB 1,1Fh,1
CHAR147: .DB 17h,14h,1Fh
CHAR148: .DB 7,5,1Fh,5,7
CHAR149: .DB 1Bh,4,1Bh
CHAR150: .DB 1Fh,10h,1Fh,10h
CHAR151: .DB 3,4,4,1Fh
CHAR152: .DB 1Fh,10h,1Fh,10h,1Fh
CHAR153: .DB 1Fh,10h,1Fh,10h,1Fh,10h
CHAR154: .DB 1,1Fh,14h,1Ch
CHAR155: .DB 1Fh,14h,1Ch,0,1Fh
CHAR156: .DB 1Fh,14h,1Ch
CHAR157: .DB 11h,15h,0Eh
CHAR158: .DB 1Fh,4,0Eh,11h,0Eh
CHAR159: .DB 16h,0Dh,5,1Fh
CHAR240: .DB 1Eh,17h,16h,17h,12h
CHAR68: .DB 11h,1Fh,11h,0Eh
CHAR70: .DB 1Fh,5,1
CHAR71: .DB 0Eh,11h,19h
CHAR73: .DB 11h,1Fh,11h
CHAR74: .DB 8,11h,1Fh,1
CHAR76: .DB 1Fh,10h,10h
CHAR78: .DB 1Fh,2,4,1Fh
CHAR81: .DB 0Eh,11h,19h,0Eh,10h
CHAR82: .DB 1Fh,5,0Dh,16h
CHAR83: .DB 12h,15h,15h,9
CHAR85: .DB 0Fh,10h,10h,0Fh
CHAR86: .DB 7,8,10h,8,7
CHAR87: .DB 0Fh,10h,8,10h,0Fh
CHAR90: .DB 19h,15h,15h,13h
.END
Текст игры на языке BASICВ ряде мест вышеприведённой программы ЭКВМ даются ссылки на этот листинг. При сравнении размеров программ не следует забывать, что игра для ЭКВМ включает графические изображения, встроенный шрифт и систему меню. А приведённая ниже оригинальная программа имеет текстовый диалоговый интерфейс. PROGRAM LISTING 0010 REM- HUNT THE WUMPUS 0015 REM: BY GREGORY YOB 0020 PRINT "INSTRUCTIONS (Y-N)"; 0030 INPUT I$ 0040 IF I$="N" THEN 52 0050 GOSUB 1000 0052 REM- ANNOUNCE WUMPUSII FOR ALL AFICIONADOS ... ADDED BY DAVE 0054 PRINT 0056 PRINT " ATTENTION ALL WUMPUS LOVERS!!!" 0058 PRINT " THERE ARE NOW TWO ADDITIONS TO THE WUMPUS FAMILY"; 0060 PRINT " OF PROGRAMS." 0062 PRINT 0064 PRINT " WUMP2: SOME DIFFERENT CAVE ARRANGEMENTS" 0066 PRINT " WUMP3: DIFFERENT HAZARDS" 0067 PRINT 0068 REM- SET UP CAVE (DODECAHEDRAL NODE LIST) 0070 DIM S(20,3) 0080 FOR J=1 TO 20 0090 FOR K=1 TO 3 0100 READ S(J,K) 0110 NEXT K 0120 NEXT J 0130 DATA 2,5,8,1,3,10,2,4,12,3,5,14,1,4,6 0140 DATA 5,7,15,6,8,17,1,7,9,8,10,18,2,9,11 0150 DATA 10,12,19,3,11,13,12,14,20,4,13,15,6,14,16 0160 DATA 15,17,20,7,16,18,9,17,19,11,18,20,13,16,19 0170 DEF FNA(X)=INT(20*RND(0))+1 0180 DEF FNB(X)=INT(3*RND(0))+1 0190 DEF FNC(X)=INT(4*RND(0))+1 0200 REM-LOCATE L ARRAY ITEMS 0210 REM-1-YOU,2-WUMPUS,3&4-PITS,5&6-BATS 0220 DIM L(6) 0230 DIM M(6) 0240 FOR J=1 TO 6 0250 L(J)=FNA(0) 0260 M(J)=L(J) 0270 NEXT J 0280 REM-CHECK FOR CROSSOVERS (IE L(1)=L(2),ETC) 0290 FOR J=1 TO 6 0300 FOR K=J TO 6 0310 IF J=K THEN 330 0320 IF L(J)=L(K) THEN 240 0330 NEXT K 0340 NEXT J 0350 REM-SET# ARROWS 0360 A=5 0365 L=L(1) 0370 REM-RUN THE GAME 0375 PRINT "HUNT THE WUMPUS" 0380 REM-HAZARD WARNINGS & LOCATION 0390 GOSUB 2000 0400 REM-MOVE OR SHOOT 0410 GOSUB 2500 0420 GOTO O OF 440,480 0430 REM-SHOOT 0440 GOSUB 3000 0450 IF F=0 THEN 390 0460 GOTO 500 0470 REM-MOVE 0480 GOSUB 4000 0490 IF F=0 THEN 390 0500 IF F>0 THEN 550 0510 REM-LOSE 0520 PRINT "HA HA HA - YOU LOSE!" 0530 GOTO 560 0540 REM-WIN 0550 PRINT "HEE HEE HEE - THE WUMPUS'LL GETCHA NEXT TIME!!" 0560 FOR J=1 TO 6 0570 L(J)=M(J) 0580 NEXT J 0590 PRINT "SAME SET-UP (Y-N)"; 0600 INPUT I$ 0610 IF I$#"Y" THEN 240 0620 GOTO 360 1000 REM-INSTRUCTIONS 1010 PRINT "WELCOME TO 'HUNT THE WUMPUS'" 1020 PRINT " THE WUMPUS LIVES IN A CAVE OF 20 ROOMS. EACH ROOM" 1030 PRINT "HAS 3 TUNNELS LEADING TO OTHER ROOMS. (LOOK AT A" 1040 PRINT "DODECAHEDRON TO SEE HOW THIS WORKS-IF YOU DON'T KNOW" 1050 PRINT "WHAT A DODECAHEDRON IS, ASK SOMEONE)" 1060 PRINT 1070 PRINT " HAZARDS:" 1080 PRINT " BOTTOMLESS PITS - TWO ROOMS HAVE BOTTOMLESS PITS IN THEM" 1090 PRINT " IF YOU GO THERE, YOU FALL INTO THE PIT (& LOSE!)" 1100 PRINT " SUPER BATS - TWO OTHER ROOMS HAVE SUPER BATS. IF YOU" 1110 PRINT " GO THERE, A BAT GRABS YOU AND TAKES YOU TO SOME OTHER" 1120 PRINT " ROOM AT RANDOM. (WHICH MIGHT BE TROUBLESOME)" 1130 PRINT 1140 PRINT " WUMPUS:" 1150 PRINT " THE WUMPUS IS NOT BOTHERED BY THE HAZARDS (HE HAS SUCKER" 1160 PRINT " FEET AND IS TOO BIG FOR A BAT TO LIFT). USUALLY" 1170 PRINT " HE IS ASLEEP. TWO THINGS WAKE HIM UP: YOUR ENTERING" 1180 PRINT " HIS ROOM OR YOUR SHOOTING AN ARROW." 1190 PRINT " IF THE WUMPUS WAKES, HE MOVES (P=.75) ONE ROOM" 1200 PRINT " OR STAYS STILL (P=.25). AFTER THAT, IF HE IS WHERE YOU" 1210 PRINT " ARE, HE EATS YOU UP (& YOU LOSE!)" 1220 PRINT 1230 PRINT " YOU:" 1240 PRINT " EACH TURN YOU MAY MOVE OR SHOOT A CROOKED ARROW" 1250 PRINT " MOVING: YOU CAN GO ONE ROOM (THRU ONE TUNNEL)" 1260 PRINT " ARROWS: YOU HAVE 5 ARROWS. YOU LOSE WHEN YOU RUN OUT." 1270 PRINT " EACH ARROW CAN GO FROM 1 TO 5 ROOMS. YOU AIM BY TELLING" 1280 PRINT " THE COMPUTER THE ROOM#S YOU WANT THE ARROW TO GO TO." 1290 PRINT " IF THE ARROW CAN'T GO THAT WAY (IE NO TUNNEL) IT MOVES" 1300 PRINT " AT RAMDOM TO THE NEXT ROOM." 1310 PRINT " IF THE ARROW HITS THE WUMPUS, YOU WIN." 1320 PRINT " IF THE ARROW HITS YOU, YOU LOSE." 1330 PRINT 1340 PRINT " WARNINGS:" 1350 PRINT " WHEN YOU ARE ONE ROOM AWAY FROM WUMPUS OR HAZARD," 1360 PRINT " THE COMPUTER SAYS:" 1370 PRINT " WUMPUS- 'I SMELL A WUMPUS'" 1380 PRINT " BAT - 'BATS NEARBY'" 1390 PRINT " PIT - 'I FEEL A DRAFT'" 1400 PRINT "" 1410 RETURN 2000 REM-PRINT LOCATION & HAZARD WARNINGS 2010 PRINT 2020 FOR J=2 TO 6 2030 FOR K=1 TO 3 2040 IF S(L(1),K)#L(J) THEN 2110 2050 GOTO J-1 OF 2060,2080,2080,2100,2100 2060 PRINT "I SMELL A WUMPUS!" 2070 GOTO 2110 2080 PRINT "I FEEL A DRAFT" 2090 GOTO 2110 2100 PRINT "BATS NEARBY!" 2110 NEXT K 2120 NEXT J 2130 PRINT "YOU ARE IN ROOM "L(1) 2140 PRINT "TUNNELS LEAD TO "S(L,1);S(L,2);S(L,3) 2150 PRINT 2160 RETURN 2500 REM-CHOOSE OPTION 2510 PRINT "SHOOT OR MOVE (S-M)"; 2520 INPUT I$ 2530 IF I$#"S" THEN 2560 2540 O=1 2550 RETURN 2560 IF I$#"M" THEN 2510 2570 O=2 2580 RETURN 3000 REM-ARROW ROUTINE 3010 F=0 3020 REM-PATH OF ARROW 3030 DIM P(5) 3040 PRINT "NO. OF ROOMS(1-5)"; 3050 INPUT J9 3060 IF J9<1 OR J9>5 THEN 3040 3070 FOR K=1 TO J9 3080 PRINT "ROOM #"; 3090 INPUT P(K) 3095 IF K <= 2 THEN 3115 3100 IF P(K) <> P(K-2) THEN 3115 3105 PRINT "ARROWS AREN'T THAT CROOKED - TRY ANOTHER ROOM" 3110 GOTO 3080 3115 NEXT K 3120 REM-SHOOT ARROW 3130 L=L(1) 3140 FOR K=1 TO J9 3150 FOR K1=1 TO 3 3160 IF S(L,K1)=P(K) THEN 3295 3170 NEXT K1 3180 REM-NO TUNNEL FOR ARROW 3190 L=S(L,FNB(1)) 3200 GOTO 3300 3210 NEXT K 3220 PRINT "MISSED" 3225 L=L(1) 3230 REM-MOVE WUMPUS 3240 GOSUB 3370 3250 REM-AMMO CHECK 3255 A=A-1 3260 IF A>0 THEN 3280 3270 F=-1 3280 RETURN 3290 REM-SEE IF ARROW IS AT L(1) OR L(2) 3295 L=P(K) 3300 IF L#L(2) THEN 3340 3310 PRINT "AHA! YOU GOT THE WUMPUS!" 3320 F=1 3330 RETURN! 3340 IF L#L(1) THEN 3210 3350 PRINT "OUCH! ARROW GOT YOU!" 3360 GOTO 3270 3370 REM-MOVE WUMPUS ROUTINE 3380 K=FNC(0) 3390 IF K=4 THEN 3410 3400 L(2)=S(L(2),K) 3410 IF L(2)#L THEN 3440 3420 PRINT "TSK TSK TSK- WUMPUS GOT YOU!" 3430 F=-1 3440 RETURN 4000 REM- MOVE ROUTINE 4010 F=0 4020 PRINT "WHERE TO"; 4030 INPUT L 4040 IF L<1 OR L>20 THEN 4020 4050 FOR K=1 TO 3 4060 REM- CHECK IF LEGAL MOVE 4070 IF S(L(1),K)=L THEN 4130 4080 NEXT K 4090 IF L=L(1) THEN 4130 4100 PRINT "NOT POSSIBLE -"; 4110 GOTO 4020 4120 REM-CHECK FOR HAZARDS 4130 L(1)=L 4140 REM-WUMPUS 4150 IF L#L(2) THEN 4220 4160 PRINT "...OOPS! BUMPED A WUMPUS!" 4170 REM-MOVE WUMPUS 4180 GOSUB 3380 4190 IF F=0 THEN 4220 4200 RETURN 4210 REM-PIT 4220 IF L#L(3) AND L#L(4) THEN 4270 4230 PRINT "YYYIIIIEEEE . . . FELL IN PIT" 4240 F=-1 4250 RETURN 4260 REM-BATS 4270 IF L#L(5) AND L#L(6) THEN 4310 4280 PRINT "ZAP--SUPER BAT SNATCH! ELSEWHEREVILLE FOR YOU!" 4290 L=FNA(1) 4300 GOTO 4130 4310 RETURN 5000 END Использованы материалы "Википедии" и страницы "Hunt The Wumpus" (BASIC computer game, genesis of Wumpus, history), The Best of Creative Computing Vol. 1 (1976). |
||||||||||||||||||||
|
НПП "СЕМИКО" (383) 271-01-25 (многоканальный) |