01.04. ТОПОЛОГИИ И ТОПОГРАФИИ ЗАЗЕРКАЛЬЯ

Перейти вниз

01.04. ТОПОЛОГИИ И ТОПОГРАФИИ ЗАЗЕРКАЛЬЯ

Сообщение автор Gudleifr в Сб Дек 02, 2017 10:47 am

ГЛАВА ЧЕТВЕРТАЯ. ТОПОЛОГИИ И ТОПОГРАФИИ ЗАЗЕРКАЛЬЯ

В приключенческих играх действия игрока, видимо, сводятся к:

1. изучению правил;
2. изучению игрового мира;
3. изменению игрового мира;
4. изменению персонажа.

И самые интересные, и самые простые игры предлагают одно и то же решение: подменяют одно другим. Самое распространенное решение - применение "универсального перемещения" - перемещаясь по "учебным местам", игрок узнает правила, потом так же исследует мир, меняя его и себя путем посещения "особых мест". Это решение настолько универсально, что любая другая попытка как-то по другому перетасовать пункты 1-4 воспринимается, как жутко нетривиальная.
***

Но сейчас нас интересует другое. Как, уложив в своей голове соотношение 1-4, программист начинает этот мир "улучшать и развивать"?
***

Сначала рассмотрим сотворение миров в условиях жесткого ограничения ресурсов.
(И не будем забывать, что для создания волшебных лабириньов компьютер-то и не очень необходим - ТЕМА #62).


Последний раз редактировалось: Gudleifr (Чт Дек 07, 2017 10:20 am), всего редактировалось 2 раз(а)
avatar
Gudleifr
Admin

Сообщения : 932
Дата регистрации : 2017-03-29

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: 01.04. ТОПОЛОГИИ И ТОПОГРАФИИ ЗАЗЕРКАЛЬЯ

Сообщение автор Gudleifr в Сб Дек 02, 2017 11:00 am

ПЕЩЕРА СОКРОВИЩ / ВАСИЛИЙ ЗАХАРЧЕНКО / ТЕХНИКА-МОЛОДЕЖИ 7/87

Начнем, как обычно, с конца. Появление значков логических операций на клавиатуре МК-61 (МК-52) по сравнению с МК-54 вызвало легкое замешательство. Что они означают, посвященный читатель, может быть, и знает. А вот для чего его использовать? В "Руководстве по эксплуатации" ответа на второй вопрос нет, а ответ на первый найдет только тот, кто его уже знает. Попробуем разобраться.
Мантисса любого числа, с которым оперирует ПМК [программируемого микрокалькулятора], содержит восемь десятичных цифр, каждая из которых представлена в двоичном изображении. Что это такое? Для хранения одной цифры в ПМК предусмотрены четыре маленькие ячейки, так называемые биты. Каждая ячейка отвечает за пределенную степень двойки: первая справа - за 2 в степени 0 (то есть 1); вторая - за 2 в степени 1 (2); третья - за степень 2 (4); четвертая - за 3 (8 ). Каждый из четырех битов может быть либо "установлен" (тогда в соответствующей ячейке рисуют единицу), либо "не установлен" (в ячейке - ноль). Этим способом из комбинаций четырех нулей и единиц можно получить любую десятичную цифру.
Например: 0101 = 0*8 + 1*4 + 0*2 + 1*1 = 5, а 1001 = 1*8 + 4*0 + 0*2 + 1*1 = 9. Проницательный читатель заметит, что, скажем, комбинация 1101 = 1*8 + 1*4 + 0*2 + 1*1 = 13 не соответствует никакой десятичной цифре. Все правильно! Информационная емкость четырех битов позволяет записать 16 разных комбинаций и, следовательно, допускает 10, а 16 различных цифр. Это и лежит в основе так называемой шестнадцатеричной арифметики, которая используется в наших ПМК. Первые десять цифр (0-9) этой арифметики совпадают с десятичными, а оставшиеся (10-15) принято обозначать латинскими буквами A, B, C, D, E, F. Эти обозначения используются и как имена адресуемых регистров. На индикаторе им соответствуют символы -, L, C, Г, Е и пробел ("пусто").
Итак, для хранения одной цифры используются четыре бита, а для хранения всех восьми цифр мантиссы дридцать два. Если не учитывать первый разряд, который в логических операциях всегда принимает значение "8", то в распоряжении пользователя остается двадцать восемь битов для хранения двадцати восьми независимых единиц информации. Каждому набору "установленных" (и "неустановленных") в регистре битов будет соответствовать семиразрядное шестнадцатеричное число. А значит, в одном регистре можно закодировать конфигурацию любого лабиринта размером 4*7.
Для кодирования этой информации и дальнейшей работы с ней очень удобны логические операции. Как они действуют?
Конъюнкция (другие названия: логическое умножение, "И"; изображается перевернутой галочкой) проверяет в двух исходных числах установленные в каждой позиции биты. Если в обоих числах бит установлен, то и соответствующий бит результата будет установлен. Если же хотя бы в одном из двух чисел данный бит не установлен, то соответствующий бит результата равен нулю. Операции производятся над всеми четырьмя битами сразу. Так, конъюнкция комбинаций 0101 (5) и 1001 (9) равна 0001 (1). Это легко проверить на ПМК. Следует только помнить, что первый разряд в логических операциях не участвует, он может иметь любое значение, а после операции превращается в цифру 8. Если, скажем, логически умножить 15 на 59, на индикаторе появится 8,1. Конъюнкция 5 и 9 действительно дала единицу.
Дизъюнкция (логическое сложение, "И/ИЛИ"; изображается галочкой) также проверяет установленные биты в исходных числах. Для каждой позиции, если хотя бы в одном из чисел бит установлен, то и соответствующий бит результата будет установленным. Для тех же двоичных комбинаций 0101 и 1001 получим 1101, то есть шестнадцатеричный символ Д. Для проверки выполним на ПМК логическое сложение 15 и 19. На индикаторе увидим: 8,Г.
Исключающее ИЛИ (изображается плюсом в кружочке) - также двухместная операция. Она устанавливает бит результата только в том случае, если соответствующие биты в исходных числах не совпадают. Для наших комбинаций 0101 и 1001 это дает 1100, то есть С.
Наконец последняя логическая операция - инверсия (ИНВ). Она в отличие от предыдущих одноместная: заменяет все установленные в исходном числе биты на неустановленные, и наоборот. Инверсия 0101 дает 1010 (5 преобразуется в A), инверсия 1001 - 0110 (9 преобразуется в 6) и так далее.
Мы посмотрели, как работают логические операции на примере одного разряда. А ПМК производит их одновременно во всех семи разрядах мантиссы, со второго по восьмой. Для чего это нужно? Вероятно, эти операции предназначены для облегчения работы проектировщиков сложных электронно-вычислительных машин, конструкторов средств автоматики и телемеханики, да и просто для большинства радиолюбителей.
Почти все логические узлы средств автоматики и телемеханики, в том числе блоки управления бытовыми приборами и сложными станками, магнитофонами и ракетами, содержат логические элементы, реализованные в микросхемах, которые выполняют те же самые операции и их многочисленные комбинации. Чтобы проверить правильность работы проектируемого логического узла или отремонтировать неисправный, необходимо построить таблицы истинности, то есть определить, какой электросигнал (1 или 0) должен быть на каждом выходе устройства, если на вход подана определенная комбинация нолей и единиц. Такую таблицу построить несложно для двух-пяти элементов, а если устройство состоит из нескольких десятков, а то и сотен микросхем? Вот тут-то и уместно обратиться к помощи ПМК.
А для задач КЭИ [Клуба Электронных Игр журнала "Техника - Молодежи".- G.] логические операции - это прежде всего самый удобный способ формирования различных видеосообщений. Например, если логически сложить 1,88008 и 1,43056, а затем выделить дробную часть результата, на индикаторе появится сообщение CLOSE, которое предупредит ваших домашних, что пользование ПМК для них закрыто, так как там хранится ценная программа.
Но основное достоинство использования логических операций (в применении к ПМК) заключается в удобстве работы с закодированной в регистрах информацией. При помощи операции дизъюнкции можно очень просто установить необходимый бит. При помощи дизъюнкции и инверсии легко снять установленный бит. С помощью исключающего ИЛИ производится замена установленного бита на неустановленный и наоборот, то есть инверсия не всего числа, а заранее выбранных битов.
Наконец, с помощью операции конъюнкции легко проверяется, установлен данный бит или нет.
Хорошей иллюстрацией использования описанных принципов и приемов может служить предлагаемая вашему вниманию игра "Пещера сокровищ".
***

[Прошу прощения за избыточное цитирование, но в этих первых абзацах описаны две важные для нас вещи: во-первых, вводятся понятия ПМК-специфичной логики (и индикации), без которых совершенно невозможно понять, как работает приведенная ниже игровая программа; во,вторых, обращается внимание на большую пользу от логических операций в программировании - возможность экономии места путем упаковки данных в битовые поля.
Надо только отметить, что введение логических (битовых) переменных позволяет нам экономить не только на их хранении, но и на логических операторах в программе. Ведь очень часто целый набор IF-ов и FOR-ов можно записать как одну-две поразрядных логических операций.- G.]
***



Забудьте на время конъюнкцию и дизъюнкцию, двоичную и шестнадцатеричную арифметику, ибо в ваши руки попал старинный манускрипт с планами спрятанных сокровищ. В памяти всплыли остров сокровищ, пещера Али-Бабы... Страсть к кладоискательству целиком овладела вами, и, запасшись в дорогу ПМК, картой, водой (20 кружек - больше вам не унести), динамитными патронами - гранатами (двумя - больше у вас не нашлось), вы отправляетесь на поиски сокровищ. И пусть удача Тома Сойера вселяет в вас надежду!
Судя по рисунку, пещера представляет собой трехэтажный лабиринт. На каждом этаже его скрыты клады. Часть их спрятана в проходах, другие замурованы в стены лабиринта, и чтобы добраться до них, надо использовать гранаты. Клады, как известно, могут быть разными. Сокровища спрятаны на третьем, самом нижнем этаже. На втором этаже вы можете найти клады, в каждом из которых лежит по две гранаты. Клады самого верхнего, первого этажа - это драгоценные запасы питьевой воды (по десять кружек). Почему драгоценной? Потому что при каждом вашем действии в пещере запасы воды уменьшаются на одну кружку. Но помните: взяв клад на одном этаже, вы не мйдете других кладов ни над ним, ни под ним на других этажах. И еще - в пещере орудует разбойник (индеец Джо); он появляется, как только вы найдете клад.
Ваша задача: добраться до выхода из лабиринта и вынести оттуда как можно больше сокровищ. Проложить путь по лабиринту, не заблудиться, не сбиться в подсчете воды (она обозначена литерой E - от английского exist - существовать), гранат (литера Г) и сокровищ (литера С) вам поможет программа.



Переключатель Р-Г установлен в положение Р. В регистр 4 вводится буква Е: 1 К- ВП П4, в регистры 7 и 8 соответственно числа 97 и 0,1. Регистры С, Д и Е определяют ваши ресурсы: 20 ПЕ (запас воды), 2 ПД (запас гранат или динамита), 0 ПС (количество сокровищ на данный момент). Регистры 1, 2 и 3 содержат соответственно планы 1, 2 и 3-го этажей. Соответствующую карте схему можно получить с помощью дизъюнкции. Для первого этажа исходными являются числа 1,0080808 и 1,7062264 (результат 8,70Е2-6С), для второго - 1,808 и 1,6715401 (8,Е795401); для третьего - 1,8088088 и 1,2260335 (8,-2Е83LГ). План расположения кладов должен храниться в регистре 6. Для нашей схемы он закодирован числом "пи". Осталось записать в регистр А начальное положение: 1,0000008. Что это означает? Первая цифра (1) - номер этажа, последняя (8 ) - номер горизонтали на плане этажа, а позиция последней цифры относительно запятой (7) - номер вертикали на нем. Операция выделения дробной части позволяет получать более наглядную форму представления местоположения на этаже (8-07) - соответственно, 8-я горизонталь, 7-я вертикаль плана этажа. В дальнейшем ваши координаты в пещере будут храниться в регистре А. В регистре 9 обычно будут находиться координаты той точки, куда вы планировали переместиться, а в регистре 5 - код вашего последнего хода.
Как же ходить по лабиринту? Схема управления традиционно для многих лабиринтных игр. Для хода вперед надо нажать 8, назад - 2, влево (в сторону выхода) - 4, вправо - 6, вниз (с этажа на этаж) - 5, вверх - тоже 5, но со знаком "минус". И конечно, С/П. В ответ на вашу команду программа проверит наличие у вас воды, возможность перемещения, и, если все в порядке, вы перейдете в новую точку, координаты которой высветятся на экране. Командой XY вы можете вызвать краткую форму записи координат.
Если вы натолкнулись на препятствие или попытались выйти из лабиринта через внешнюю стену, то на экране появится "0". Команда XY даст вам возможность узнать координаты помешавшего вам препятствия. Если же в ответ на ваш ход на экране появляется ЕГГОГ, а после команды XY - Е, это означает, что вы не рассчитали запасов воды и навсегда остались в пещере.
Итак, ходить мы уже научились. А как искать клады? Для этого есть специальная команда: 0 С/П. Программа опять-таки проверит у вас наличие воды и произведет поиск клада в том месте, где вы находитесь. Если клада не окажется, то на экране возникнет ноль, а команда XY даст координаты места, где вы находитесь и где вы так неудачно провели поиск.
Если же клад найден, то программа делает промежуточный останов - на экране высвечивается общее количество воды, гранат или сокровищ (в зависимости от этажа) с учетом найденного клада. В этот момент в пещере раздаются шаги разбойника, привлеченного шумом. Что делать? Вы можете смело спрятаться (0 С/П) и сохранить все, что у вас есть. А можете вступить с разбойником в борьбу ("стрелка вверх" С/П). В результате поединка произойдет "перераспределение благ". В самом лучшем случае ваш запас (воды, гранат или сокровищ) удвоится, в самом худшем вы потеряете почти все.
Проанализировав результат схватки, машинка выдаст на индикатор буквы С, Г или Е, в зависимости от этажа. Командой XY индицируется окончательное количество сокровищ, гранат или воды.
Осталось научиться прорубать ходы... Это нужно для того, чтобы выйти из тупиковой ситуации или чтобы забрать замурованный клад. Это операция непростая. Сначала нужно заложить взрывчатку именно в ту преграду, которую вы хотите убрать. Взрывчатка будет заложена, если вы сделали "неудачный" ход, то есть наткнулись на препятствие. Сам взрыв производится командой F "пи". В ответ на эту команду программа проверит у вас наличие воды (как обычно), наличие гранат и уберет преграду с вашего пути. Если же гранат у вас не окажется, то на экране возникнет ЕГГОГ, а после команды XY появится буква Г. Чтобы привести после этого программу в рабочее состояние, достаточно нажать С/П - ПМК вновь ждет ваших указаний. Если взрыв произведен, то ответом машины на команду F "пи" будет ноль. Проделав проход, вы можете смело туда идти - путь свободен. Но учтите: попытка взорвать несуществующую преграду или внешнюю стенку лабиринта вызовет обвал в том месте, где вы находитесь. Выбраться из-под обвала можно, но для того, чтобы снова пройти через него, придется потратить гранаты.
И еще не забудьте: чтобы взять замурованный клад, вам потребуется целых четыре кружки воды (первая - чтобы заложить взрывчатку, вторая - сделать проход, третья - подойти к месту, где лежит клад, и четвертая - найти и взять его).
Теперь, когда вы научились ходить по пещере, искать и находить клады, убирать мешающие вам препятствия, давать отпор разбойнику, вы можете смело отправляться в путь. После выхода из пещеры вас будет ожидать трамвай одиннадцатого маршрута (на индикаторе появится число 11). Счастливого пути!
Представленный вариант игры не является единственным. Конфигурацию лабиринта можно задавать произвольным образом. План этажа лабиринта кодируется отдельно для восьмой горизонтали и для первой, второй, четвертой горизонталей, затем объединяется командой дизъюнкции и засылается в соответствующий регистр (1-3). Установленный бит соответствует проходу, неустановленный - препятствию. Аналогичным образом для регистра 6 кодируется план расположения кладов: "установленный" бит - клад есть, "не установленный" - клада нет. При помощи генератора случайных чисел можно получать случайные конфигурации лабиринта.
В качестве вариантов можно сделать ресурсы (вода, гранаты) неограниченными, заложив в начале игры соответственно в регистры Е и Д заведомо большое число (тысячу). Или, наоборот, не допускать разрушения лабиринта - уникального произведения природы, положив в регистр Д число "-1000". Тогда, даже найдя в кладах гранаты, вы не сумеете их использовать.
Если вы приняли твердое решение ни при каких обстоятельствах не вступать в борьбу с разбойником, то можно заменить команду 88.С/П на 88.0. Если же, наоборот,- бороться всегда, то надо вписать сюда "стрелку вверх". Промежуточного останова в этих вариантах не будет.
Наконец, игру можно использовать как головоломку для нахождения выхода из лабиринта за минимальное количество ходов, имея перед глазами план лабиринта либо методом проб и ошибок. Для приведенной схемы оптимальный путь вы проделаете за 19 шагов. Возможны и другие варианты игры. Найти их вам поможет ваша фантазия.

КРАТКОЕ ОПИСАНИЕ БЛОКОВ ПРОГРАММЫ
00-01 Подготовка к вводу хода.
02-05 Проверка остатков воды.
06-21 Расшифровка кода команды.
22-53 Ход, в том числе:
- 22-34 получение новых координат,
- 35-39 проверка на выход за пределы лабиринта,
- 40-49 проверка наличия преграды,
- 50-51 собственно ход.
54-61 Удаление препятствий, в том числе:
- 54-55 получение литеры Г,
- 56 проверка наличия гранат,
- 57-60 снятие преграды.
62-96 Поиск клада, в том числе:
- 62-66 проверка наличия клада,
- 67-69 снятие клада,
- 70-77 определение содержимого клада,
- 78-85 определение количества найденных гранат, воды или сокровищ,
- 86-94 суммирование и подведение итогов встречи с разбойником.
97-104 Подпрограмма проверки и использования ресурсов.
avatar
Gudleifr
Admin

Сообщения : 932
Дата регистрации : 2017-03-29

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: 01.04. ТОПОЛОГИИ И ТОПОГРАФИИ ЗАЗЕРКАЛЬЯ

Сообщение автор Gudleifr в Сб Дек 02, 2017 11:09 am

ПЕРЕПИШЕМ НА B

Первое, что нас интересует, как организовать ввод команд. Здесь, конечно, нет никакой работы в реальном времени, а требуется ввод одной из допустимых комбинаций. Но, вопрос удобства приводит нас к блоку, который в большинстве BASIC-программ заменяет неповоротливый INPUT:

1 C$=INKEY$: IF LEN(C$)=0 THEN 1
2 IF C$=CHR$(0)+"H" THEN R(5)=8: PRINT"ВПЕРЕД": GOTO 20
3 IF C$=CHR$(0)+"M" THEN R(5)=6: PRINT"ВПРАВО": GOTO 20
4 IF C$=CHR$(0)+"P" THEN R(5)=2: PRINT"НАЗАД": GOTO 20
5 IF C$=CHR$(0)+"K" THEN R(5)=4: PRINT"ВЛЕВО": GOTO 20
6 IF C$=CHR$(0)+"I" THEN R(5)=-5: PRINT"ВВЕРХ": GOTO 20: REM PgUp
7 IF C$=CHR$(0)+"Q" THEN R(5)=5: PRINT"ВНИЗ": GOTO 20: REM PgDn
8 IF C$="B" OR C$="b" THEN R(5)=3.1415927: PRINT"ВЗОРВАТЬ": GOTO 20
9 IF C$="F" OR C$="f" THEN R(5)=0: PRINT"ИСКАТЬ": GOTO 20

Здесь три тонкости:

1. INKEY$ не ждет, пока игрок что-то там нажмет, поэтому его приходится зацикливать, ожидая пока не будет введено что-то отличное от пустой строки. С другой стороны, если игра должна работать в режиме реального времени, такой механизм позволяет ей в данном случае сказать: "Ага, не успел! А я дальше пошла..."
ПМК не умеет вводить в режиме реального времени и ему нужно честно вводить команду и жать С/П (как в INPUT надо нажимать Enter). Правда, наши умельцы выкрутились и здесь - управлять ПМК в реальном режиме времени можно переключателем Р-Г (радианы-градусы), наблюдая результат в режиме мерцания.
А в визуальном BASIC нам надо было бы написать обработчики этих событий - "нажатий клавиш", делая вид, что мы верим, что они обрабатываются сразу, как только введены. На самом деле, цикл ожидания там тоже есть, только он спрятан хитрее.
2. "Стрелки" не являются нормальными символами и INKEY$ выдает для них двухбуквенную комбинацию CHR$(0)+буква. Подобные комбинации зависят не только от вида ЭВМ, ее Операционной Системы, но, иногда, и от языка программирования.
3. На момент игры клавиатура может быть в разных регистрах (и режимах), поэтому надо тщательно документировать, какие клавиши чем управляют. Самая смешная шутка авторов русификации IBM PC: "Yes" и "Нет" - это одна клавиша!
***

Далее мы видим, что ПМК немного умнее компьютера. 28 битов в одну переменную нашего простого BASIC хоть и влезают, но нормально обрабатываться не могут. Придется, все-таки, отвести под этажи подземелья по 7 элементов массива, что породит лишние операторы. Да и стоит ли игра в экономию свеч?
***

Все остальное вполне очевидно. Если не по приведенному коду, то по описанию. (Видно, что самые замысловатые конструкции ПМК-программы служат экономии программной памяти, а не совершенствованию игрового алгоритма. От замены на более простые и понятные операции игра только выиграет).
Неясно только, что интереснее - рисовать лабиринт на бумажке, играть по памяти, или, наоборот, дать подглядеть лабиринт на пару секунд до игры... И насколько полную статистику об игре стоит выводить на экран.
Честная BASIC-модель может дать ответ на эти вопросы.
avatar
Gudleifr
Admin

Сообщения : 932
Дата регистрации : 2017-03-29

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: 01.04. ТОПОЛОГИИ И ТОПОГРАФИИ ЗАЗЕРКАЛЬЯ

Сообщение автор Gudleifr в Сб Дек 02, 2017 11:11 am

Эта игра напомнила мне первое знакомство с "Миноискателем". Задолго до знакомства с Windows. На экран японского ПМК выводилось единственное число - число мин, соседних с данной клеткой. Само поле предлагалось рисовать игроку на бумажке.
Наличие у подобных игр полной карты кажется вполне очевидным, пока мы не вспомним о многочисленных играх (приключениях и квестах), в которых карты локаций не являются так уж необходимыми. Или их даже невозможно составить в принципе.
А, может, как-то так организовать выдачу информации о текущей локации, чтобы игрок и не задумывался о "полной карте"?

БЕСКОНЕЧНАЯ ИСТОРИЯ / ВЛАДИМИР ТАЛАЛАЕВ / ТЕХНИКА-МОЛОДЕЖИ 1/88



Все более широкое распространение получают сейчас компьютерные фильмы, в которых зритель может по ходу дела вмешиваться в развитие сюжета, либо сделанные с помощью ЭВМ. Предлагаемые программы для ПМК разработаны нами с Володей Шило по мотивам одного из них.
Страшная, всесокрушающая Пустота шаг за шагом поглощает страну Фантазию. Жители страны надеялись, что им поможет Принцесса. Но она тяжело больна, и причина болезни - все та же надвигающаяся Пустота.
И один храбрый воин (совсем еще мальчишка!) отправляется на поиски лекарства, которое излечит Принцессу.
В конце концов выясняется, что о таком средстве знает Южный Оракул. Но как к нему добраться? Отважному воину помогает Фалькор - Дракон, Приносящий Удачу. Он переносит его к самым воротам, ведущим к Южному Оракулу, заодно спасая от Гморга - чудовища, порожденного Пустотой.
Но вход к Южному Оракулу охраняет Сфинкс, который пропустит только чистого душою и смелого человека, остальных же - испепелит.
И вот Южный Оракул говорит, что нужно делать...
На этом мы пока и остановимся, ибо для программы вполне достаточно. Впрочем, добавим, что если бы Пустота сумела поглотить дворец Принцессы - то вся страна Фантазия погибла бы.
Замечу, что получившаяся у нас с Володей программа относится к так называемым маршевым: с одной стороны, это динамическая игра в масштабе времени, с другой стороны, в ней имеются "усыпляющие" своей монотонностью вашу бдительность счетные блоки-фрагменты.
В чем суть программы? Вы находитесь в самом центре страны Фантазии (во дворце Принцессы) и отправляетесь оттуда в опасное путешествие, чтобы найти средство для ее исцеления.
Вам нужно найти Южного Оракула. За каждый ход вы можете продвинуться только на одну позицию. Что же происходит вокруг? А вокруг наступает Пустота (ее роль прекрасно сыграет столь популярная нынче Тьма (команда "точка", или, как ее еще называют, "пустышка"). Впрочем, не все места в Пустоте смертельны - кое-где Тьму заменяет ЕГГОГ.

Что известно игроку?
1. Южный Оракул находится где-то на юге.
2. Подступы к нему охраняет Сфинкс.
3. Напрямую через Сфинкса вам не прорваться.
4. Если идти на север, то при удаче можно встретить Фалькора, который перенесет вас на широту Южного Оракула, минуя Сфинкса.
5. Но на севере вас поджидает Гморг, который способен сожрать вас.
6. Тьма-Пустота иногда ставит ловушки, из которых нельзя выбраться.
7. Если не успеть к Оракулу - Пустота сомкнется.
8. Если вы достигли Оракула, программа остановится: вы спасли страну Фантазию.
Имея эти данные, остается только научиться управлять движением. Делается это, конечно же, с помощью переключателя углов...
***

[Это как раз тот случай, о котором я говорил: общение с работающей программой ПМК в режиме мерцания.
К сожалению, все что в программе интересного, видно из приведенной выше "карты", остальное - обеспечение "мерцания" и выдача "сообщений".- G.]
avatar
Gudleifr
Admin

Сообщения : 932
Дата регистрации : 2017-03-29

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: 01.04. ТОПОЛОГИИ И ТОПОГРАФИИ ЗАЗЕРКАЛЬЯ

Сообщение автор Gudleifr в Сб Дек 02, 2017 11:18 am

Как же изменились запросы членов "Клуба Электронных Игр" после того, как их технические возможности резко возросли?

СТРАНА МОНСТРОВ / МИХАИЛ ПУХОВ / ТЕХНИКА-МОЛОДЕЖИ 1/90

На этот раз я входил в нее самым быстрым, но рискованным путем - по реке. Сразу же за порогами, отделяющими Страну от нормального мира, на чистом песчаном дне сверкнул первый золотой самородок. Золота в здешней реке видимо-невидимо, надо только уметь его взять. И еще надо иметь зоркий глаз и верную руку.
Метрах в сорока вверх по течению вода забурлила, и я увидел отвратительную морду Речного Змея. Он тоже заметил меня.
Сражаться с представителями местного животного мира мне не впервой. В направлении чудовищного гада полетело копье. Однако Змей, оправдывая свое родовое имя, с громоподобным плеском исчез под водой. Я видел его гигантское темное тело, стремительно приближавшееся к лодке. Когда он начал подниматься к поверхности, я бросил второе копье. Но расчет оказался неверным.
Удар пришелся по днищу. Я потерял сознание. Когда очнулся, лежал на песчаном берегу, у самой кромки воды, едва живой. Можно сказать, повезло. Перевернутую лодку быстро несло к порогам. Рядом со мной валялось весло - единственное, что у меня осталось.
С трудом я поднялся на ноги и огляделся. Кругом высились прибрежные скалы. Вдали маячила рощица хищных деревьев, из которой доносились приглушенные крики голодных чудовищ. Ни одного источника поблизости, и даже не видно оставшегося от предшественников меча или топора.
Задача, таким образом, резко усложнилась. А тут еще началась буря...
***

Говоря откровенно, администрация Клуба электронных игр даже в славную эпоху его расцвета (1985-1988) всегда тяготела в душе к рискованным странствиям, волшебным странам и всяческому колдовству. Только прежде такого рода порывы сами собой приглушались из-за довольно-таки ограниченных возможностей ПМК. Зато когда в стенах КЭИ появился компьютер, то первое, чем занялась администрация,- это разработка качественной приключенческой игры. И приобрела в этом деле кое-какой опыт, которым и собирается поделиться.
Прежде всего о названии. Игра называется "СТРАНА МОНСТРОВ", хотя можно было бы употребить, например, "СТРАНА МРАКА" или "СТРАНА СТРАХА". Все эти сочетания, помимо сходной смысловой нагрузки, обладают еще одной особенностью: их можно записать по-русски латинскими буквами! А других в распоряжении многих компьютеров просто нет. В связи с этим администрация КЭИ объявляет конкурс "ТЕКСТ", в котором могут участвовать все желающие: создать осмысленный законченный текст на русском языке (скажем, небольшой рассказ или стихотворение), который можно было бы записать при помощи знаков, общих для русского и латинского алфавитов (само слово ТЕКСТ, как нетрудно видеть, этому условию вполне удовлетворяет) .
"СТРАНА МОНСТРОВ" заселялась постепенно. Сначала это был просто квадратный лабиринт размером 20*20, по которому надо было передвигать фигурку Путника. Потом в некоторых местах появилось невидимое издали Золото, которое надо было искать. Появился Вход, открывающийся, только когда Путник отыщет все Золото, которое есть. Затем Предметы, которые можно подбирать и носить с собой, а также ситуации, в которых они небесполезны. Река, разделяющая страну пополам, хищные деревья, кровожадные и златолюбивые Чудовища и многое другое. Теперь, по единодушному мнению администрации КЭИ, помимо отдельных недостатков (о каковых за неимением места распространяться не будем), игра не лишена и ряда несомненных достоинств. Главное из них - простота и универсальность: "СТРАНУ МОНСТРОВ" можно реализовать (с мелкими вариациями) практически на любом компьютере. При желании можно обойтись и совсем без компьютера: изготовить планшет с картой местности и нужное количество карточек с описанием событий. Переставляя фишки по карте и вытаскивая карточки из перетасованной колоды, легко моделировать самые невероятные приключения, причем играть могут несколько человек. Перед началом игры всем четыремстам клеткам карты случайным образом присваиваются определенные номера. Удобны числа от 0 до 255: для хранения каждого из них достаточно одного байта, то есть одной ячейки машинной памяти. Каждое число однозначно связано с определенной ситуацией. В нее-то и попадает блуждающий по стране Путник, вступая на соответствующую клеточку.
За один ход Путник перемещается на одну соседнюю клетку в любом направлении. Он может нести любое количество Золота, а также не более четырех других Предметов. Физическую форму Путника характеризует Сила: в начале игры она равна 10 и меняется в зависимости от ситуации. Если Сила равна нулю - игра окончена.



ГЕОГРАФИЯ СТРАНЫ МОНСТРОВ. Страна, как уже говорилось,- это квадрат размером 20*20, со всех сторон огороженный неприступными Скалами. На границе имеются двое Ворот: сухопутные и водные. Играющий сам выбирает путь, которым он входит в Страну. Если по Суше, то в начале игры он выбирает еще и четыре Предмета, с которыми отправляется в странствие. Если же Путник предпочитает водный путь, то компьютер снабжает его Лодкой, Веслом и двумя Копьями. Сухопутные Врата закрываются в начале игры и открываются, лишь когда все Золото страны перекочевывает в мешок Путника. Речные Врата остаются постоянно открытыми, но их стережет Речной Змей, встреча с которым сулит мало хорошего. Змей нападает на смельчака и при входе в Страну. А вот с чем еще можно в ней встретиться.
СКАЛЫ (182-200). Вход в эти области закрыт, если у Путника нет Бомбы. При случайном ударе о Скалу теряется полпункта Силы. (Если у него нет Куртки). Если Путник оказывается в Скалах иным образом (его заваливает при Землетрясении или его туда кто-нибудь швыряет), игра заканчивается. Если Путник имеет Бомбу, Скала взрывается и пропадает.
ВОДОЕМЫ (179-181). Кроме главного Потока реки, разделяющего Страну на две части, Вода имеется на примыкающих горизонталях (Заводи) и в других местах (Озера). Различным номерам соответствуют разные виды Воды. 181 - это Подводное Золото, его можно добыть с помощью Лодки. 180 - просто Вода. 179 - Мелководье. При Засухе оно превращается в Болото (178). Чтобы проникнуть в область, занятую Водой, необходима Лодка, иначе Путник тонет.
БОЛОТО (171-178). При наводнении эти числа увеличиваются на единичку: там, где было Болото-178, появляется Мелководье. При Засухе числа уменьшаются на единичку. В других отношениях Болото не отличается от обычной Суши.
ПОТОК (середина реки). Если Путник вышел в плавание без Весла и оказался на середине реки, его подхватывает Поток. Он сносит Лодку вниз по течению, причем она может случайным образом сместиться на одну из примыкающих горизонталей, оказываясь либо в Заводи, либо на Суше, либо ударяясь о Скалы. После трех-четырех ударов подряд Лодка разбивается и Путник идет ко дну.
МАГИЧЕСКИЙ ИСТОЧНИК (112-113). Если хлебнуть его живительной влаги, Сила Путника увеличивается на пункт. При этом, правда, пропадает Карта, а могут промокнуть (и пропасть) Сапоги. Источники встречаются двух типов: 113 - на два глотка и 112 - на один. 113 превращается в 112, на месте же полностью иссякшего Источника возникает Чудовище.
ЛОВУШКА (110). Отбирает у Путника половину его Силы, если у него нет Ключа. Меч и Топор уменьшают потерю Силы. Если Ловушка обезврежена с помощью Ключа, она пропадает, а Путник получает дополнительный пункт Силы.
БАЗА (120). В любой момент Путник может организовывать Базу, в которой допускается хранение 9 любых Предметов. Нельзя иметь более одной Базы одновременно. Базу можно ликвидировать по желанию Путника вместе со всем ее содержимым. Иногда ее уничтожает Землетрясение.
СУША. Все остальные числа. При каждом переходе по Суше Путник теряет 0,01 пункта Силы (если у него нет Сапог). На Суше можно найти Предмет или встретить Обитателя Страны.

ПРЕДМЕТЫ.
ЗОЛОТО (130). Его поиски - главная цель рискованной экспедиции. В отличие от других Предметов Путник может нести любое количество Золота. Оно служит и разменной валютой для расчетов с некоторыми Обитателями Страны. Сухопутные Врата открываются, только когда все Золото собрано. Подводное Золото (181) можно добыть только с помощью Лодки.
ТОПОР (131). Повышает Силу в схватке с Чудовищем на один пункт. Уменьшает на единичку потерю Силы при освобождении из Ловушки. Позволяет срубить хищное дерево Анчар и построить Лодку. Пропадает после использования.
МЕЧ (132). Повышает на два пункта Силу в схватке с Чудовищем. Уменьшает на единичку потерю Силы при освобождении из Ловушки. Пропадает после использования.
КОПЬЕ (133). Повышает Силу в схватке на три пункта. Единственное оружие против Речного Змея. Два Копья входят в стандартный комплект снаряжения при входе в Страну по реке.
ШЛЕМ (134). Делает Путника невидимым для повстречавшегося Чудовища. Пропадает после использования.
КУРТКА (135). Позволяет сохранить Силу в Засуху, в Бурю и при столкновении со Скалой. Пропадает после использования.
САПОГИ (136). Сохраняют Силу при ходьбе. Промокают (и пропадают), когда Путник пьет из Магического Источника.
КЛЮЧ (137). Полностью обезвреживает Ловушку, давая своему обладателю дополнительный пункт Силы. Пропадает после использования.
КАРТА (138). Показывает размещение Предметов и Золота в стране. Пропадает после использования, а также в Бурю и при обнаружении Магического Источника.
БОМБА (139). Позволяет взрывать Скалы (кроме тех, что огораживают Страну). Иногда самопроизвольно взрывается, уничтожая все наличные Предметы. Естественно, исчезает после использования.
ВЕСЛО (140). Позволяет, при наличии Лодки, перемещаться в произвольном направлении по реке, даже по самой стремнине, где свирепствует Поток. Входит в стандартный комплект при входе через Речные Врата.
ЛОДКА (141). Позволяет плавать по реке и озерам и поднимать Золото со дна. Естественно, входит в стандартный комплект при входе через Речные Врата. В отличие от других Предметов Лодку нельзя найти, а можно только изготовить из дерева Анчар с помощью Топора. При транспортировке ее волоком Путник теряет полпункта Силы на каждом ходе.

ОБИТАТЕЛИ СТРАНЫ МОНСТРОВ.
ЧУДОВИЩЕ (10-109). Основной представитель здешней фауны. Остаток от деления номера на 10 - это количество Зотота, имеющегося у данного Чудовища. Умножив целую часть результата деления на 3, получаем число от 3 до 30 - это Сила Чудовища. Путник в Шлеме при встрече с Чудовищем остается незамеченным и спокойно идет дальше. В иных случаях при уклонении от схватки теряется полпункта Силы. При сражении с Чудовищем к его Силе и Силе Путника добавляются случайные числа из интервала 1-6 (будто бросаешь игральную кость). Учитывается самое действенное из наличного оружия (Копье, если оно есть, затем Меч и Топор). В случае поражения Путник может откупиться, отдав Чудовищу слиток Золота, иначе теряет пункт Силы. Если Чудовище побеждено и у него есть Золото (доставшееся в одной из предыдущих схваток), оно пытается откупиться. Если же Золота нет или Путник не желает его взять, Чудовище исчезает.
ДЕРЕВО АНЧАР (111). Исход встречи с ним зависит от наличия Топора. Если Топора нет - или Путник не желает его применить,- Сила уменьшается на пункт, а Анчар остается на месте. Если Топор имеется, возможны варианты: 1) победитель срубает Дерево и получает пункт Силы; 2) изготовляет Лодку. В обоих случаях пропадают и Анчар и Топор.
РЕЧНОЙ ЗМЕЙ. Один из них подстерегает Путника, когда тот пытается войти в Страну или выйти из нее, используя речной путь. Второй курсирует вверх-вниз по реке. Поединок выглядит так. Змей, погружаясь на случайные промежутки времени, устремляется к Лодке. Путник бросает Копья (если они у него есть). При попадании Сила увеличивается на 5 пунктов и опасность временно отступает. Если же поразить Змея не удается, он разбивает Лодку и выбрасывает Путника на берег. Сила Путника уменьшается на 5 пунктов, вдобавок есть шанс угодить в Озеро и утонуть либо разбиться о Скалы.
СКИТАЛЕЦ. Этот человек свободно разгуливает по всей стране. При встрече, если заплатить 5 слитков Золота, может переправить Путника на другой берег. Не исключены и другие платные услуги с его стороны.

Кроме событий, локализованных в какой-то точке, есть и происходящие одновременно во всей стране. Они задаются генератором случайных чисел, вероятность каждого - одна двухсотая.
БУРЯ. Если нет Куртки, Путник теряет пункт Силы. Теряет Карту. После Бури происходит Наводнение: река выходит из берегов, появляются новые области, заполненные Водой. Оказавшись в одной из них, Путник рискует потонуть (если нет Лодки).
ЗАСУХА. Если нет Куртки, Путник теряет пункт Силы. Река мелеет, Мелководье превращается в Болото.
ЗЕМЛЕТРЯСЕНИЕ. Местность начинает ходить ходуном. Останавливается по команде играющего. Если остался сдвиг, на местности появляются новые Скалы и Водоемы. Путник, оказавшийся в одной из таких областей, рискует жизнью.
***

В заключение несколько слов о том, как правильно задавать характерные числа. Для каждой точки карты генерируются случайные числа от 110 до 200. По границам задаются, естественно, Скалы (например, 190). На середине реки, чтобы она оставалась рекой даже в самый засушливый период, диапазон случайности резко сокращается: случайным образом генерируются Подводное Золото (181) и Вода (180). На примыкающих горизонталях сюда добавляются Болото (178), Мелководье (179) и 182 (Скалы). Число 141 (Лодка) во всех ситуациях заменяется на 111 (Анчар). Числа от 120 до 130 заменяются Золотом (130). Если выпадает 170, то, опять-таки случайно, генерируются числа от 1 до 10, затем они умножаются на 10. Так рождаются Чудовища.
При повторном присвоении номера (при взятии Предмета или Золота, расправе с Чудовищем, подрыве Скалы и т.д.) применяется тот же алгоритм, только числа 179-200 (Вода и Скалы) не допускаются. Когда иссякает Источник-112, включается уже описанный "генератор Чудовищ". После взятия Подводного Золота (181) генерируются 180 или 181.
Разумеется, возможны и иные пути. В игру "СТРАНА МОНСТРОВ" можно включать практически любые игровые блоки - никто ведь не запрещает устроить, допустим, встречу с Людоедом-шахматистом, организовать увлекательную гонку по бурной реке, ввести суточный ритм (День-Ночь), в зависимости от которого будет меняться агрессивность Чудовищ... Как видим, администрация КЭИ, никогда не делавшая тайн из своих просчетов и достижений, остается верной этому своему качеству. И надеется на помощь читателей. Требуются: новые Предметы, новые События, новые образчики флоры и фауны Страны Монстров. Ведь очень многие числа из диапазона 0-255 остались пока неиспользованными.
avatar
Gudleifr
Admin

Сообщения : 932
Дата регистрации : 2017-03-29

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: 01.04. ТОПОЛОГИИ И ТОПОГРАФИИ ЗАЗЕРКАЛЬЯ

Сообщение автор Gudleifr в Сб Дек 02, 2017 11:21 am

Т.е. мы видим, что на компьютер идей уже не осталось. Игры для ПМК были не то, что бы интереснее, но хотя бы имели правила. Здесь же... Как-то, помню, мне дали надеть шлем виртуальной реальности. И я попал в мир, как мне показалось, игры Retaliator (наверное, ее взяли за образец) - простенький ландшафт, города из кубиков, пара самолетов, где-то, вроде, поезда, танки, корабли... Крутя головой и джойстиком, я свободно перемещался по этому миру, рассматривая трехмерные модельки со всех сторон. Но, и они застыли неподвижно, и я мог только летать и смотреть...
"СТРАНА МОНСТРОВ" напомнила мне этот макет - много чего выставлено на игровой стол, но все это статично. Нужны какие-то силы, которые приведут этот мир в движение. Нужны законы, управляющие этими силами - правила игры.
Зачатки правил присутствуют: поведение речного змея, гидрография, генерация чудовищ... но только зачатки.
Некоторые названия и числа намекают на знакомство авторов с игрой TALISMAN (ТЕМА #48). Но, зачем они "размазали" его по плоскости?

ОЖИВЛЯЖ НА МОНИТОРЕ / МИХАИЛ ПУХОВ / ТЕХНИКА-МОЛОДЕЖИ 2/90

Главная проблема, с которой сталкивается самодеятельный разработчик компьютерной игры,- это получение изображений движущихся, причем движущихся достаточно правдоподобно. Не сумела уклониться от этой проблемы и администрация КЭИ, когда трудилась над своей "СТРАНОЙ МОНСТРОВ". И в ряде случаев решила ее довольно успешно, особенно в блоке "Речной Змей", о котором и пойдет речь. В распоряжении практически любого компьютера имеются средства, позволяющие перепрограммировать клавиши так, чтобы при их нажатии на экране появлялся не тот знак, который изображен на данной клавише, а тот, который удобен пользователю. В языке компьютера, на котором обычно работает администрация (это английский "Энтерпрайз-128"), для этой цели предусмотрена специальная команда, мгновенно перепрограммирующая выбранную клавишу. Как это делается на других компьютерах, в стенах КЭИ знают лишь понаслышке и надеются, что читатели сами расскажут на наших страницах о своих успехах в столь многотрудной области. В крайнем случае придется воспользоваться имеющимися знаками. Например, изображение Речного Змея, составленное из тройки (голова) и нулей (остальные элементы тела), как проверила администрация КЭИ, ведет себя на экране телевизора ничуть не менее агрессивно, чем полученное из нарисованных здесь специальных знаков. А уж такой "зверь" доступен обладателям не только компьютеров, но и программируемых микрокалькуляторов.
Чтобы полноценно отобразить на экране сцену охоты, вся его площадь не требуется, достаточно двух строк. В нижней по всей ее длине печатается знак воды, в начале верхней - фигурка охотника в лодке. Сначала поверхность воды пустынна, затем в конце строки начинает печататься слово (а как еще назвать комбинацию знаков?), изображающее Речного Змея в последовательных фазах его выныривания, а затем погружения. Как видно из рисунка, помимо значащей части, каждое такое слово включает и определенное количество пробелов слева или справа.


Специальные знаки, полезные для изображения Речного Змея и охотник в лодке.

Последнее слово каждого цикла состоит сплошь из пробелов - Змей скрылся под водой. Затем - как показывает практика, это необходимо для достижения максимального игрового эффекта - случайное число раз (скажем, в пределах от нуля до тридцати) печатается пустая строка (" "). Так гарантируется внезапность нового появления Змея, при котором его изображение смещается ближе к охотнику. При последнем выныривании Змей выходит на поверхность вплотную к лодке. Когда человек бросает копье, на каждом цикле, помимо изображения Змея, печатается удаляющееся от лодки слово " -" (пробел слева нужен для уничтожения предыдущего изображения). И мы видим на экране копье, приближающееся к резвящемуся животному. А если в какой-то момент положение двух слов (оружие и Речной Змей) совпадает - значит, мы победили! Доброй охоты (так напутствовали друг друга герои Киплинга)!


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

НОВОСТИ ИЗ СТРАНЫ МОНСТРОВ. За истекший месяц в "Стране Монстров" произошли кое-какие события. Появился новый Предмет. Это Мел (142), он позволяет ставить на карте крестики. Каждого найденного мелка хватает на пять таких крестиков. Мел похож на Золото в том отношении, что Путник может нести неограниченное его количество.
Кроме того, у некоторых Предметов появились новые функции. Бомба позволяет взрывать теперь не только Скалы, но и Ловушки, а также Дерево Анчар. Если у Путника есть Ключ, он может в любой момент вызвать Скитальца (последний теперь именуется Колдуном). После такого использования Ключ пропадает. Шлем делает Путника невидимым не только для Монстров, но и для Речного Змея.
Изменился и прейскурант услуг Колдуна (встреченного случайно или вызванного с помощью волшебного Ключа). За 8 слитков Золота Колдун лечит (повышает Силу на пункт), за 9 - переправляет на другой берег. Если Путник отказывается платить, то теряет 2 пункта Силы. Если слитков Золота меньше 8, то разгневанный Колдун отбирает у Путника все его Золото и вдобавок пункт Силы.
Вот и все новости.


Последний раз редактировалось: Gudleifr (Ср Дек 06, 2017 1:56 pm), всего редактировалось 1 раз(а)
avatar
Gudleifr
Admin

Сообщения : 932
Дата регистрации : 2017-03-29

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: 01.04. ТОПОЛОГИИ И ТОПОГРАФИИ ЗАЗЕРКАЛЬЯ

Сообщение автор Gudleifr в Сб Дек 02, 2017 11:33 am

Игра началась! Безжизненный сначала макет начинает "дышать".

СКЛАД КОПИЙ, КОТОРЫЕ СДЕЛАЛИ МЫ / АНАТОЛИЙ ВЕРШИНСКИЙ / ТЕХНИКА-МОЛОДЕЖИ 4/90

При всех достоинствах Бейсика существенный недостаток этого языка - сравнительно невысокое быстродействие написанных на нем программ. Современные версии Бейсика позволяют в ряде случаев компенсировать этот недостаток, введя в основную программу подпрограммы, записанные в машинных кодах. Особенно удобно пользоваться такими подпрограммами при обработке больших массивов однородной информации.
В компьютерных играх, в различных прикладных и демонстрационных программах весьма продуктивен способ копирования данных из одной области памяти в другую, например из видеопамяти в зарезервированный участок памяти и обратно. Это позволяет: практически мгновенно вызывать в нужную часть экрана рисунок или текст, заблаговременно помещенные в резервную память; создавать движущиеся картинки, поочередно "перерисовывая" изображение или его часть из "экрана" в "копию" и обратно и меняя при этом определенные параметры; достигать других эффектов.
В компьютерах с популярным микропроцессором Z80 удобно использовать для этого команды, по которым осуществляется пересылка блока памяти в ту или иную ее область. Так, например, по команде LDIR блок памяти, длина в байтах которого записана в регистровой паре ВС, переносится, начиная с адреса, помещенного в HL, в участок памяти с начальным адресом, загруженным в DE. При каждом такте операции число, занесенное в пару ВС, уменьшается на 1, а соответствующие адреса в HL и DE на 1 увеличиваются.



Адреса соседних ячеек видеопамяти, содержимое которых отображается на дисплее в виде элементарных участков растра, отличаются как раз на единицу. Понятно, что таким образом можно скопировать весь экран или его полоску шириной, равной количеству строк b, на всю длину строки l. Очевидно и другое: если команду блочной пересылки применять в пределах одной строки, занеся в ВС длину ее отрезка a, затем загружать в HL начальные адреса последующих отрезков и повторять операцию блочной пересылки, то можно скопировать в резервный буфер любой участок экрана размерами a*b. (ZZ ZZ - соответственно младший и старший байты адреса в шестнадцатеричной системе счисления, ЕС и ЕА - относительные адреса условного перехода для первой и второй подпрограмм, ЕВ - используется лишь во второй подпрограмме).



Возможные подпрограммы пересылки:
Из экрана в копию

LD DE, (Z2)
LD ВС, (Z3)
LDIR
LD ВС, (Z4)
ADD HL, ВС
LD А, (25)
DEC A
LD (Z5), А
JR NZ,-20
RET

Из копии в экран

LD DE, (Z1)
LD ВС, (Z3)
LDIR
LD ВС, (Z4)
EX DE, HL
ADD HL, ВС
EX DE, HL
LD A, (Z5)
DEC A
LD (Z5), A
JR NZ, -22

Коды операций

ED 5B ZZ ZZ
ED 4B ZZ ZZ
ED BO
ED 4B ZZ ZZ
EB
09
EB
3A ZZ ZZ
3D
32 ZZ ZZ
20 EC (EA)
C9

Рабочий вариант первой подпрограммы на языке IS-BASIC для компьютера Энтерпрайз имеет вид:

CODE S=HEX$("ED, 5В, 1F, 13, ED, 4B, 21, 13,
ED, B0, ED, 4B, 23, 13, 9, 3A, 25, 13,
3D, 32, 25, 13, 20, ЕС, С9")

Перед вызовом любой из этих подпрограмм необходимо задать начальные условия - с помощью оператора РОКЕ или другим способом. В определенные ячейки памяти вписываются: в первую пару, с начальным адресом Z1,- адрес начала копируемого фрагмента; во вторую, с начальным адресом Z2,- адрес "копии", то есть участка памяти, зарезервированного под копию этого фрагмента; в третью, с адресом Z3,- длина а копируемого отрезка строки; в четвертую, с адресом Z4,- приращение текущего адреса, равное l-a, где l - количество байтов в строке; и, наконец, в отдельную ячейку, с адресом Z5,- количество строк b.
Подпрограмма работает следующим образом. При ее вызове с помощью соответствующего оператора, например, CALL USR (S, Z1) в версии IS-BASIC, в HL заносится адрес Z1. Далее числами Z2 и Z3 загружаются регистровые пары DE и ВС и осуществляется блочная пересылка. Один цикл завершен, теперь нужно выйти на начальный адрес копируемого отрезка следующей строки. Приращение текущего адреса, равное l-a, загружается в ВС и складывается (по команде с кодом 9) с содержимым HL. Последующие три команды организуют счетчик заданного числа b циклов. По команде 20 осуществляется переход подпрограммы на начало нового цикла до тех пор, пока в регистре-аккумуляторе А не окажется 0, что означает: все строки числом b благополучно скопированы в резервный участок памяти. Отметим, что увеличивается на l-a лишь содержимое HL, в DE адрес изменяется по-прежнему на 1. Иными словами, в буферный участок памяти отрезки строк "укладываются" друг за дружкой без каких-либо пробелов. Это позволяет существенно сэкономить оперативную память компьютера.
Обратная операция - вызов копии на экран - от рассмотренной отличается, помимо адресов Z1 и Z2, командой с кодом ЕВ, дважды за каждый цикл осуществляющей обмен между DE и HL. Это необходимо, чтобы сложить содержимое DE и ВС, так как специальной команды для этой операции нет.


Копирование видеопамяти широко используется и в игровой программе "МОНСТЕРЛАНД" ("СТРАНА МОНСТРОВ"). Вот некоторые примеры.
Чтобы закрасить экран выбранным цветом (например, черным или белым), можно окрасить в данный цвет верхний левый байт экрана и скопировать видеопамять со сдвигом на единицу.
Копирование видеопамяти со сдвигом на число байтов в строке позволяет практически мгновенно нарисовать рамку необходимой толщины.

В системе команд отечественного 8-разрядного микропроцессора серии КР 580 отсутствуют многие команды, реализуемые Z80, в частности команда ED В0, и описанный способ копирования неприменим. Чтобы осуществить пересылку блока, организуем цикл команд, переписывающих содержимое одной последовательности ячеек памяти в другую, призвав в качестве "переписчика" регистр-аккумулятор А. Так мы сможем скопировать строку или ее отрезок. Дальнейший путь нам известен.
Приведем возможный вариант подпрограммы - в командах Ассемблера с условно обозначенными адресами и в машинных кодах с адресами для работы на Энтерпрайзе (все команды отечественного микропроцессора входят в систему команд Z80).

LHLD (Zl); MOV A,M; INX H; SHLD (Zl);
LHLD (Z2); MOV М,А; INX H; SHLD (Z2);
LDA (Z3); DCR A; STA (Z3); JNZ Z0;
LDA (Z4); STA (Z3); LHLD (Zl); XCHG;
LHLD (Z5); DAD D; SHLD (Zl); LDA (Z6);
DCR A; STA (Z6); JNZ Z0; RET

CODE S=HEX$("2A, 0, 13, 7E, 23,
22, 0, 13, 2A, 2, 13, 77, 23, 22, 2, 3, 3A,
4, 13, 3D, 32, 4, 13, C2, C9, 12, ЗА, 5, 13,
32, 4, 13, 2A, 0, 13, EВ, 2А, 6, 13, 19,
22, 0, 13, 3A, 8, 13, 3D, 32, 8, 13, С2, С9,
12, С9")



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


Чтобы дерево Анчар росло у вас на глазах (и вверх, и вширь, когда оно побеждает человека), также можно воспользоваться приемом копирования.


Он позволяет срубить дерево (при этом остается пень) или сделать из Анчара лодку.

Каждый пользователь легко перепишет эту подпрограмму для своей версии Бейсика, заменив соответствующие адреса. Поясним их.
Z1 (в рабочем варианте 0,13) - начальный адрес пары ячеек, в которых хранится адрес начала копируемого фрагмента;
Z2 (2, 13) - то же для копии;
Z3 (4, 13) - адрес ячейки, куда вписывается текущее значение a - число еще не скопированных байтов в отрезке строки и соответственно число оставшихся внутренних циклов;
Z4 (5, 13) - адрес ячейки, хранящей первоначальное значение a (для восстановления числа циклов при переходе на новую строку);
Z5 (6, 13) - начальный адрес пары ячеек, в которые в двухбайтовой форме занесено число l-a, 0;
Z6 (8, 13) - адрес ячейки с числом b копируемых строк;
Z0 (С9, 12) - адрес начала подпрограммы, на который осуществляется условный переход после завершения очередного цикла.
Подпрограмма обратного копирования - пересылки блока из буфера в видеопамять - отличается от приведенной весьма незначительно: лишь младшими байтами адресов Z1 и Z2. Меняя местами эти числа при установке начальных условий посредством РОКЕ и вызывая описанную подпрограмму, мы тем самым будем выполнять то прямую, то обратную пересылку.
Задавать начальные условия удобно с помощью стандартных функций, определяющих остаток от деления нацело и целую часть числа (в нашем случае - младший и старший байты числа при делителе 256), например: РОКЕ 4864, MOD(V,256): POKE 4865, INT(V/256), где V - начальный адрес копируемого фрагмента экрана (Z1 в рассмотренных подпрограммах). Этот адрес предлагаем вычислять также программно - посредством нестандартной функции DEF(V) по формуле V=V0+X+1XY. Здесь: V0 - адрес начала видеопамяти (экрана), X и Y - координаты начала фрагмента в сетке l*n, где l, как мы помним, число байтов в строке растра, n - количество строк экрана в графическом режиме. Как правило, в режиме среднего разрешения, а он более удобен на практике, l=40, n=200 (или 180). Варьируя начальные условия, можно достигать самых различных эффектов, используя одну универсальную подпрограмму, каковой и является описанная нами.
В заключение несколько слов о ее быстродействии. Легко подсчитать, что при копировании всего экрана количество выполненных команд превышает 100 тысяч. При тактовой частоте 1,5-2МГц и длительности элементарных операций 2-3 такта время копирования экрана не превысит 0,2сек. Если же пересылается небольшой блок памяти, скажем десятая часть площади экрана, счет идет на сотые секунды. Подпрограмма для Z80 копирует экран в буквальном смысле слова мгновенно.
avatar
Gudleifr
Admin

Сообщения : 932
Дата регистрации : 2017-03-29

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: 01.04. ТОПОЛОГИИ И ТОПОГРАФИИ ЗАЗЕРКАЛЬЯ

Сообщение автор Gudleifr в Сб Дек 02, 2017 11:49 am

Больше "СТРАНА МОНСТРОВ" в журнале не упоминалась. Однако, мы видим здесь интересную разновидность игр - игра-конструктор или игра для программиста. Имеется некоторая простая модель мира, в которую можно вставить все, что угодно ("людоеда-шахматиста").
Можно заметить, что рассмотренные нами игры делились на два ярко выраженных класса: КОНЦЕПЦИИ и КОНСТРУКТОРЫ. Например, тот же "HIGH NOON" - взята известная математическая модель и обернута в литературную форму - можно играть. Или другой пример КЭИ - "Лунолет" - в калькулятор засунули кусочек физики. Это игры-концепции, в которых многообразию идей противопоставлялась слабость компьютеров.
Игры-конструкторы делались по обратному рецепту. Бралась уже работающая модель и по мере роста возможностей компьютеров и/или разгулу фантазии программистов в нее добавлялась всякая фигня. Например, "СТРАНА МОНСТРОВ" или "ОРЕГОНСКАЯ ТРОПА"... Или эксперимент Родионова по развитию "STAR TREK" (ТЕМА #28, АБЗАЦ #167). Понятно, игры-конструкторы больше веселили программистов, чем пользователей. Последние все нос кривили: "У тебя еще в твоем "KING" нет наемников, а у Пети уже есть!"

Прошли годы...
И что мы имеем? Идеями занимаются по-прежнему самодельщики (ну, там еще, серьезные дядьки в погонах). А профессиональные игропрограммисты подняли конструкторы на небывалую высоту и давно победили пользователей: "Нет у твоего Пети 3D-движка последней версии! Так что жри, что дают!" Но и сами программисты потеряли возможность играть: "Пусть пользователь и быдло, но его надо кормить постоянно!"
И вместо игр получился "мультимедийный продукт" - набор дизайнерских решений, в котором "сама игра" - где-то "на донышке".
Старые компьютерные игры? Это игры, в которые было интересно играть самим программистам.

Вернемся к нашим "конструкторам".


Последний раз редактировалось: Gudleifr (Ср Дек 06, 2017 1:57 pm), всего редактировалось 1 раз(а)
avatar
Gudleifr
Admin

Сообщения : 932
Дата регистрации : 2017-03-29

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: 01.04. ТОПОЛОГИИ И ТОПОГРАФИИ ЗАЗЕРКАЛЬЯ

Сообщение автор Gudleifr в Вс Дек 03, 2017 12:08 pm

AKALABETH



Игра позиционируется как первая трехмерная-лабиринтовая и предшественник серии Ultima.
Что, она такая сложная? Да нет, простенькая - см. исходный код - TXT, 0.02Мб (пара вариантов листинга; который из них и насколько аутентичен, судить не берусь, многовато заплаток/дырок).

Возникает крамольный вопрос: а в какой момент игра становится большой? Только когда в нее добавляют избыточное количество картинок и мелодий? Или, все-таки, существуют какие-то жутко умные (и поэтому большие) программы? Будем искать.
***

Блоки программы (как и ранее, стрелка - GOTO, двойная - GOSUB, стрелка в конце строки - RETURN):

0 ОШИБОЧНАЯ ОБРАБОТКА ОШИБОК
1 НАЧАЛО (^^60000)
30 ГЕНЕРАЦИЯ КАРТЫ
51 РАСЧЕТ ОПОРНЫХ ТОЧЕК ЭКРАНА
68 СТАРТ (^^100, ^1000)
90 ОТЛАДОЧНАЯ ПЕЧАТЬ ОПОРНЫХ ТОЧЕК
100 ВЫДАЧА ТЕКУЩЕГО КУСКА КАРТЫ^
200 НАЧАЛО 3D-РИСОВАНИЯ
202 ВЫДАЧА 3D-ВИДА ПОДЗЕМЕЛЬЯ (^3087)
490 ВСЕ ЛИ НАРИСОВАНО?^, НЕ ВСЕ^202
500 ГЕНЕРАЦИЯ ПОДЗЕМЕЛЬЯ^ (^^2000)
1000 ВВОД И ВЫПОЛНЕНИЕ КОМАНД (^1100+КОМАНДА)
1090 РЕЗУЛЬТАТ КОМАНД
КОНЕЦ^6000 (^^4000, ^1000)
1100 КОД ВЫПОЛНЕНИЯ КОМАНД (ПОПАЛИ В ПОДЗЕМЕЛЬЕ^^500,
МАГАЗИН^^60080,60200, ДВОРЕЦ^7000, НЕ ПОЛУЧИЛОСЬ^1000, ^1090)
3087 ДОВЕСОК К 3D-РИСОВАНИЮ (^490)
4000 ГАДОСТИ ОТ ЧУДОВИЩ^
6000 КОНЕЦ (^1)
7000 ДВОРЕЦ (^1090)
60000 ИНИЦИАЛИЗАЦИЯ^ (^^60080, ^^60200)
60080 ВЫДАЧА СВОДКИ ЗАПАСОВ^
60200 МАГАЗИН^

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

Первое, что мы видим в начале игры (и конце программы - строки с 60000), три комплекта ресурсов/параметров игрока.

- Игрок свободно вводит ln - число для инициализации генератора случайных чисел, lp (1-10) - сложность игры - и pt$ ("m" или "f") - за мага или воина он играет.

- Случайно заполняемый массив c(5) (Вы, кстати, заметили, что по оператору DIM размер массива определить невозможно? Т.к. первым элементом может быть и 1-й, и нулевой, определяется оператором OPTION BASE):

60020 DATA "HIT POINTS.....","STRENGTH.......", "DEXTERITY......",
"STAMINA........","WISDOM.........","GOLD..........."
60030 DIM c$(5): FOR x = 0 TO 5: READ c$(x): NEXT
...
60050 FOR x = 0 TO 5: c(x) = INT(SQR(RND(1)) * 21 + 4): NEXT x

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

- Остальное игрок покупает в "магазине" (подпрограммы 60080 и 60200):



Здесь мы видим магазин из ОРЕГОНСКОЙ ТРОПЫ, но уже в виде ВЫБОРА команд (как и в случае с pt$, по первой букве). Более того, мы видим кусочек логики: магам (pt$="m") запрещено иметь RAPIER и BOW. Т.к. можно покупать сколько хочешь, пришлось, кроме команд видов товаров добавить команду выхода из магазина - "q". Реализация магазина "перетяжелена" не только введением ВЫБОРА команд, но и жутким смешением массивов, переменных и констант. Именно поэтому, программисты, наверное, и обрадовались изобретению ООП, позволяющего собрать все, что касается одного "объекта" в одном месте. И никто не подумал, что несовершенство и запутанность BASIC-кода - большей частью, следствие убожества встроенных редакторов тех времен.
Кстати, ООП - одна из причин роста размера программ, уж больно избыточен этот метод.

Итак, на выходе из магазина мы имеем:

ln - инициализатор случайных чисел;
lp - уровень игры;
c$(5) и c(5) - свойства игрока: имена и значения;
m$(10) - имена монстров;
pt$ - воин или маг;
w$(5), pw(5) - предметы: имена, количество. Количество FOOD меряется десятками.
***

Далее следует блок генерации массивов (со строки 30). Создаются:

- массив te%(20, 20), строки 30-50 - карта (21*21), края (ряды 0 и 20) заполняются 1 (скалы), остальной массив заполняется случайными числами - INT(RND(1)^5*4.5), причем, 3 (магазины) дополнительно разреживаются (с вероятностью .5 заполняются 0). Из формулы следует, что больше всего будет 0, меньше 1, еще меньше 2 (деревня? не используется) и, совсем редко 3 и 4 (подземелье). Случайно выбираются две точки (не крайние) - в одну записывается 5 (дворец), в другую - 3 (и последняя делается текущей - ее координаты записываются в переменные tx и ty).
- массивы xx%(10), yy%(10), pe%(10,3), cd%(10,3), ld%(10,5), ft%(10,5), la%(10,3), в строках 51-62 - разметка экрана для быстрого рисования в последующем. Элементы xx%(10) вводятся через отношение арктангенсов, а остальных массивов - выражаются через эти элементы. Обстановка подземелья состоит из предметов двух видов: обычных (стены, двери, лестницы, люки), координаты которых для всех возможных положений относительно игрока просчитываются заранее и заносятся в массивы разметки, и особых (чудовища, сундуки), которые рисуются перед игроком "с нуля", позиционируясь и масштабируясь в зависимости от расстояния.

Перед началом этого блока стоит очевидная выдача "ЖДИТЕ..." А зачем ждать? Может, можно проще?
Генерацию карты можно ускорить путем отказа от генерации ее сразу полностью. Мы видим, что нет никаких взаимозависимостей между разными частями карты. Следовательно, можно сгенерировать только тот кусочек, который видим (3*3), а потом добавлять места, куда будем заходить. Расплачиваться будем проверкой "Были ли мы уже здесь?" И потребностью писать в комментариях, что мы имели в виду. Т.е. код станет немного больше и сложнее. Зато, быстрее.
Генерацию массивов разметки экрана тоже можно упростить - их можно рассчитать раз и навсегда и хранить в виде набора констант, а формулы привести в комментариях - будет и быстрее, и короче, и понятнее. Почему так не сделано? Сначала сработало BASIC-преимущество - легкость правки "по живому" - можно было менять формулы генерации и сразу смотреть, что получается при рисовании. А потом случилась BASIC-неприятность - сложность редактирования текста программы в убогом редакторе против доводов: "и так работает", "а вдруг поломаем", "или придется еще поправить". Так что, в кодах осталась даже уже ненужная тестовая проверочная строка (90).
***

Сгенерировав карту, мы (не сразу) попадаем в процедуру рисования ее видимого кусочка - 3*3 квадратика - (со строки 100), получается что-то вроде (тут приведены все виды "ландшафтов", кроме 2 - маленького квадратика):


Косой крестик (4) - вход в подземелье, "домик" (5) - дворец, "фрактал" (1) - горы, "четырехлистник" (3) - магазин

Забегая вперед, находим генерацию массива dn%(10,10) (подпрограмма со строки 500), она проводится каждый раз заново, как только игрок тем или иным методом попадает на очередной уровень подземелья. Т.е. карта подземелья 11*11.
Начинается все со переинициализации генератора случайных чисел:

500 RANDOMIZE -ABS(ln) - tx * 10 - ty * 1000 + in * 31.4

Т.е. с одной стороны, стартовые числа для всех наборов ln (стартовый инициализатор игры), tx, ty (координаты на карте) и (in) уровень подземелья отличаются, но одно и тоже подземелье в игре будет всегда одинаковым, сколько бы раз в него не зашли.
Это полезный прием - вместо того, чтобы хранить в памяти все уровни всех подземелий, мы храним только алгоритм генерации, гарантирующий один и тот же результат для одного и того же набора координат.
Далее "обязательная часть" - обнуление центрального (9*9) квадрата и заполнение стенками (1) краев. Далее - обязательное разделение подземелья перегородками:

520 FOR x = 2 TO 8 STEP 2: FOR y = 1 TO 9: dn%(x, y) = 1: NEXT: NEXT

Затем в перегородках делаются "дырки" и заполняются объектами:

530 FOR x = 2 TO 8 STEP 2: FOR y = 1 TO 9 STEP 2
540 IF RND(1) > .95 THEN dn%(x, y) = 2
541 IF RND(1) > .95 THEN dn%(y, x) = 2
542 IF RND(1) > .6 THEN dn%(y, x) = 3
543 IF RND(1) > .6 THEN dn%(x, y) = 3
544 IF RND(1) > .6 THEN dn%(x, y) = 4
545 IF RND(1) > .6 THEN dn%(y, x) = 4
546 IF RND(1) > .97 THEN dn%(y, x) = 9
547 IF RND(1) > .97 THEN dn%(x, y) = 9
548 IF RND(1) > .94 THEN dn%(x, y) = 5
549 IF RND(1) > .94 THEN dn%(y, x) = 5
568 NEXT: NEXT

Это как раз тот случай, когда можно пересчитать "по Байесу" и отнормировать, как в "ОРЕГОНСКОЙ ТРОПЕ" (округлять буду безбожно):
Проще начать с конца: чтобы не было в ячейке в момент начала выполнения строки 548, оно с вероятностью .06+.06*.94 (помните ракеты?) меняется на 5 (золото и предметы). Это примерно 0.12, остается 0.88.
Отступаем до строки 546: вероятность 9 будет .88*(.03+.03*.97) = 0.05 и остается 0.83.
544: 4 - .83*(.4+.4*.6) = 0.53, остается 0.30.
542: 3 - .30*(.4+.4*.6) = 0.19, остается 0.11.
540: 2 (провалы) - .11*(.05+0.95*0.05) = 0.01, остается 0.10 - это 1.
Упорядочим вероятности по убыванию: 4 - 53%, 3 - 19%, 5 - 12%, 1 - 10%, 9 - 5%, 2 - 1%.
Т.е. строки 540-549 можно заменить на

540 X=RND(1)
541 IF X < .53 THEN dn%(x, y) = 4: 568
542 IF X < .72 THEN dn%(x, y) = 3: GOTO 568
543 IF X < .84 THEN dn%(x, y) = 5: GOTO 568
544 IF X < .94 THEN 568
545 IF X < .99 THEN dn%(x, y) = 9: GOTO 568
546 dn%(x, y) = 2

Может, и непонятнее, и программировать дольше, зато гораздо быстрее работает.
Конечно, если повтор строк в исходном фрагменте - это не просто ошибка.
Затем размещаем лестницы: dn%(2, 1) всегда 0, если уровень четный, то dn%(7, 3) = 7 и dn%(3, 7) = 8, а, если нечетный, то, наоборот, dn%(7, 3) = 8 и dn%(3, 7) = 7, а на первом уровне, дополнительно: dn%(1, 1) = 8 и dn%(7, 3) = 0.
После этого запускается довесок со строки 2000. Там заполняются массивы mz%(10,1) - здоровья монстров-обитателей - и ml%(10,1) - их координат. Смысл очевиден: чем глубже, тем больше монстров выставляется на поле - dn%(ml%(x,0),ml%(x,1))=x*10 (только в пустые клетки, и не в позицию игрока - px, py). И тем они живучее: mz%(x,1)=x*2+in*2*lp (lp, как помните, уровень игры). Остальные монстры (у которых x-2>in или RND(1)>.4) со своим здоровьем (mz%(x,1)=x+3+in) пропадают.
***

Рассмотрим ВЫБОР команд (строки с 1000). Как в начале главы - через INKEY$ и с распознаванием стрелочек. Однако, блок избыточно усложнен: он обслуживает два вида перемещений - по карте, и по лабиринтам. Для этого используется переменная in - глубина погружения (0 - поверхность).

1001 x$ = INKEY$: IF x$ = "" THEN 1001
1002 IF ASC(x$) = 0 THEN xq = ASC(MID$(x$, 2)) ELSE xq = 0
1030 IF xq = 72 THEN ON SGN(in) + 1 GOTO 1100, 1150
...

Сводка команд (можно видеть, что авторы подстраховались и ввели для каждой команды кучу синонимов):

[/tbody]
Командаin=0in&gt;0 - подземелье
стрелкина одну клеточку по карте (1100, 1200, 1300, 1400)движение вперед, повороты на 90 и 180град. (1150, 1250, 1350, 1450)
"g", "e", "k", "d" или Enterвойти в дворец, магазин, подземелье (1500)подняться/опуститься на один уровень по лестнице (1550)
"a", "u" или "cничего (1600)атаковать чудовище (1650)
пробелничего (1081)
"i", "z" или "y"выдача информации (1700)
"p"вкл./выкл. режима паузы - переменная pa (1086-1087)
Блоки анализа/выполнения команд нужно пропустить. Точнее, можно посмотреть, как не надо делать.
Например, механизм схватки мы уже рассматривали в "HIGN HOON". Здесь - то же самое, только, обвешанное большим количеством ненужных параметров и гораздо хуже структурированное. И с большим количеством ошибок.
Результаты приключений и использование предметов - аналогичны "СТРАНЕ МОНСТРОВ".
Все блоки сильно размазаны по коду: что-то проверяется сразу, что-то в разруливающих блоках, о чем-то, явно, вспоминают в последний момент и перепроверяют "по месту". В программировании подобных механизмов нет ничего принципиально сложного, просто надо было выделить все "что-то делающие" блоки и тщательно проверить ведущие к ним пути.
В самом жутком случае получается "прямая цепочка рассуждений" - выполнение одних условий/приказов порождает другие. В самом простом - таблица "приказы/условия-действия".
Главное, помнить важный секрет программирования (о нем мало кто знает): никогда не проверять допустимость операций внутри подпрограмм, их исполняющих. Всегда делать это только в вызывающих программах. Например, у нас есть программа деления. Она получает делитель, равный 0, и вылетает. Замечательно! Мы сразу видим, что что-то не так, и т.к. все проверки "снаружи", быстро находим кто и почему передал ноль. А если процедура сама будет проверять, не равен ли нулю делитель и действовать "разумно"? Вероятность того, что мы так и не узнаем, что у нас где-то ошибка, порождающая 0, очень велика.
Всегда делайте проверки на самом верхнем уровне программы!
***

Полный список предметов

[/tbody]
#Свойства - c(#)Рюкзак - pw(#)Карта - te%(tx,ty)=#Подземелье - dn%(x,y)=#Чудовища - dn%(x,y)=10*#
0ЗдоровьеПищаПустоПусто-
1СилаРапираСкалыСтенаSKELETON
2ТочностьТопорПустоПровалTHIEF
3УмЩитМагазинЛожная стенаGIANT RAT
4СтойкостьЛукПодземельеДверной проемORC
5ЗолотоАмулетДворецЗолото, оружиеVIPER
6--CARRION CRAWLER
7Лестница внизGREMLIN
8Лестница вверхMIMIC
9Спуск внизDAEMON
10-BALROG
Большое количество предметов не означает сложности их программной обработки: она здесь даже проще, чем в "ТРОПЕ" - все свойства предметов привязаны к перемещению игрока в занятую ими клетку, удару игрока, удару чудовища. К сожалению, понять, где здесь оригинальная задумка автора, где ошибка, а где заплатка, совершенно невозможно. Писать лучше начинать с нуля.
***

Остается только рассмотреть вопрос рисования подземелья (со строки 200).
Как говорил выше - точки обычных объектов посчитаны заранее, а особые рисуются "по месту".
Самое главное правило рисования - для каждого удаления от игрока (от 0 до 10) рассматриваются только три "кубика" подземелья - лежащий перед нами (ce) и его левый(le)/правый(ri) соседи.

202 ce = dn%(px + dx * di, py + dy * di):
le = dn%(px + dx * di + dy, py + dy * di - dx):
ri = dn%(px + dx * di - dy, py + dy * di + dx)

Здесь di - дистанция, px, py - позиция в подземелье, dx, dy - вектор "смотрения" (одно из dx/dy всегда 0, другое +/-1, иначе формула не сработает).
Как только кубик ce опознан, как "непрозрачный", все, что лежит за ним, считается невидимым (процедура рисования заканчивается).
Остальное все очевидно, никаких других "проверок видимости" и доворотов не производится. Обычные предметы имеют в своих массивах наборы точек для рисования на торцевой стене центрального и боковых стенах боковых кубиков на всех удалениях.
Вот, например, лестницы:

240 IF ce = 7 OR ce = 9 THEN
LINE (ft%(di, 0), ft%(di, 4))-(ft%(di, 2), ft%(di, 5)):
LINE -(ft%(di, 3), ft%(di, 5)):
LINE -(ft%(di, 1), ft%(di, 4)):
LINE -(ft%(di, 0), ft%(di, 4))
242 IF ce = 8 THEN
LINE (ft%(di, 0), 158 - ft%(di, 4))-(ft%(di, 2), 158 - ft%(di, 5)):
LINE -(ft%(di, 3), 158 - ft%(di, 5)):
LINE -(ft%(di, 1), 158 - ft%(di, 4)):
LINE -(ft%(di, 0), 158 - ft%(di, 4))
244 IF ce = 7 OR ce = 8 THEN ba = la%(di, 3):
TP = la%(di, 2): LX = la%(di, 0):
RX = la%(di, 1): LINE (LX, ba)-(LX, TP):
LINE (RX, TP)-(RX, ba)
246 IF ce = 7 OR ce = 8 THEN y1 = (ba * 4 + TP) / 5:
Y2 = (ba * 3 + TP * 2) / 5:
Y3 = (ba * 2 + TP * 3) / 5:
Y4 = (ba + TP * 4) / 5:
LINE (LX, y1)-(RX, y1):
LINE (LX, Y2)-(RX, Y2):
LINE (LX, Y3)-(RX, Y3):
LINE (LX, Y4)-(RX, Y4)

Особые предметы рисуются только перед игроком (масштабируясь по дистанции).
Начало блока рисование чудовищ (выбор чудовища по номеру - mc - и рисование первого - SKELETON):

265  b = 79 + yy%(di): c = 139
...
270  ON mc GOTO 300, 310, 320, 330, 340, 350, 360, 370, 380, 390
280 GOTO 490
300 LINE (c - 23 / di, b)-(c - 15 / di, b):
LINE -(c - 15 / di, b - 15 / di): LINE -(c - 8 / di, b - 30 / di):
LINE -(c + 8 / di, b - 30 / di): LINE -(c + 15 / di, b - 15 / di):
LINE -(c + 15 / di, b): LINE -(c + 23 / di, b)
301 LINE (c, b - 26 / di)-(c, b - 65 / di):
LINE (c - 2 / di + .499, b - 38 / di)-(c + 2 / di + .499, b - 38 / di):
LINE (c - 3 / di + .499, b - 45 / di)-(c + 3 / di + .499, b - 45 / di):
LINE (c - 5 / di + .499, b - 53 / di)-(c + 5 / di + .499, b - 53 / di)
302 LINE (c - 23 / di, b - 56 / di)-(c - 30 / di, b - 53 / di):
LINE -(c - 23 / di, b - 45 / di): LINE -(c - 23 / di, b - 53 / di):
LINE -(c - 8 / di, b - 38 / di)
303 LINE (c - 15 / di, b - 45 / di)-(c - 8 / di, b - 60 / di):
LINE -(c + 8 / di, b - 60 / di): LINE -(c + 15 / di, b - 45 / di):
LINE -(c + 15 / di, b - 42 / di): LINE -(c + 15 / di, b - 57 / di):
LINE (c + 12 / di, b - 45 / di)-(c + 20 / di, b - 45 / di)
304 LINE (c, b - 75 / di)-(c - 5 / di + .499, b - 80 / di):
LINE -(c - 8 / di, b - 75 / di): LINE -(c - 5 / di + .499, b - 65 / di):
LINE -(c + 5 / di + .499, b - 65 / di): LINE -(c + 5 / di + .499, b - 68 / di):
LINE -(c - 5 / di + .499, b - 68 / di): LINE -(c - 5 / di + .499, b - 65 / di)
305 LINE -(c + 5 / di + .499, b - 65 / di): LINE -(c + 8 / di, b - 75 / di):
LINE -(c + 5 / di + .499, b - 80 / di):
LINE -(c - 5 / di + .499, b - 80 / di):
PSET (c - 5 / di + .499, b - 72 / di): PSET (c + 5 / di + .499, b - 72 / di)
309 GOTO 490
...

Видно масштабирование (деление на di). Из таблиц взяты только координаты опорной точки (c,b).
Конечно, все это работает только в тех "упрощенных" подземельях, которые используются в игре.
Самое сложное, это рассчитать массивы, ограничивающие торцы кубиков (исходя из нашего чувства перспективы). А затем не запутаться, что с чем соединять.


Последний раз редактировалось: Gudleifr (Ср Дек 06, 2017 2:00 pm), всего редактировалось 1 раз(а)
avatar
Gudleifr
Admin

Сообщения : 932
Дата регистрации : 2017-03-29

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: 01.04. ТОПОЛОГИИ И ТОПОГРАФИИ ЗАЗЕРКАЛЬЯ

Сообщение автор Gudleifr в Вс Дек 03, 2017 12:11 pm

НИЧЕГО НЕ НАПОМИНАЕТ?

Посещение дворца, бонусы за убитых чудовищ, особенно - за заказанных, прокручивание крупно-квадратной карты в окошке...


"Стратегическая" карта.


Тактическая карта.

KING'S BOUNTY! Конечно, там пиксельная графика вместо каркасной и сражения на карте вместо лабиринтов...
Однако, несомненно и сходство:

- Игра разделена на "стратегическую" и "тактическую" составляющую и
- "статегические" части схожи.


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

Начнем с графики. Она тоже проста: практически все BASIC имеют процедуру PUT (BitBlit), способную печатать на экране не отдельную точку/линию, а целую картину (даже с прозрачным фоном). А больше ничего и не надо. Единственное ограничение - лишь бы места в памяти хватило, поэтому в самых простых BASIC приходится идти на вставку кодов выделения/копирования памяти, см. выше статью Вершинского.
***

Далее - тактика. Тут всего два усложнения:

- Вместо одной фишки надо двигать несколько. Но, поиграв, мы видим, что простейшей реализации - KB перебирает фишки по очереди - хватает!
- Тактика противника. И опять, в KB применен простейший алгоритм: все фишки противника способные стрелять, стреляют в ваших лучников, остальные бегут их же атаковать. Когда лучники кончаются или враг подошел вплотную, атакуется ближайшая фишка. Конечно, безусловное следование программы столь простым правилам позволяет игроку воевать почти без потерь, но реализовать что-то более эффективное значительно сложнее.

Можно, кстати, видеть, как KB еще немного упрощает себе жизнь, используя одни и те же картинки на обоих уровнях игры. Это свойство игры, поднимающее ее над обычными "конструкторами" - одинаковое применение некоторых понятий (например, магии) и методов на разных уровнях игры.
avatar
Gudleifr
Admin

Сообщения : 932
Дата регистрации : 2017-03-29

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: 01.04. ТОПОЛОГИИ И ТОПОГРАФИИ ЗАЗЕРКАЛЬЯ

Сообщение автор Gudleifr в Вс Дек 03, 2017 12:23 pm

А можно ли нарисовать спрайтовый лабиринт? Можно, и это даже проще! Лишь бы было где спрайты хранить.

ПСЕВДОТРЕХМЕРНЫЙ ВИД / К.УОЛНАМ "СЕКРЕТЫ ПРОГРАММИРОВАНИЯ ИГР НА WIN95

Вы проделали немалую работу и наконец подошли вплотную к ответу на вопрос, терзавший ваше любопытство: каким образом Aztec Adventure ухитряется создавать трехмерный вид любого места в лабиринте? Можно как угодно переделывать уровни с помощью Dungeon Designer или перемещаться внутри лабиринта - Aztec Adventure создает трехмерную картину, открывающуюся глазам вашего персонажа. Звучит совершенно невероятно, не правда ли?
Но как и любой фокус, секрет которого раскрыт, прием построения трехмерных видов оказывается до смешного простым. Хотите - верьте, хотите - нет, но не требуется никакой математики. Каждый, кто хоть раз пытался синтезировать трехмерные объекты, наверняка оценит этот факт. Забудьте о перемножении матриц, синусах и косинусах. Хотя вычисления играют важную роль в играх с плавным скроллингом (например, в авиационных имитаторах), здесь они не понадобятся.
***

ПОСМОТРИМ НА РЕШЕТКУ


Рис.13.1. Пустая решетка лабиринта

Как мы знаем, каждый уровень лабиринта в Aztec Adventure представляет собой решетку размером 32x32, изображенную на рис.13.1. На минуту представьте себе, что вы уменьшились до таких крошечных размеров, что смогли встать на один из ее квадратов. А теперь введем несколько правил, действующих в этой мини-Вселенной:

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

Предположим, что на решетке лабиринта, где вы стоите, нет никаких объектов - стен, дверей и т. д. То, что вы увидите (с учетом приведенных выше правил), изображено на рис.13.2.


Рис.13.2. Трехмерный вид решетки

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


Рис.13.3. Квадраты, находящиеся в зоне видимости

Большая черная точка на рис. 13.3 обозначает место, где вы стоите, а стрелка указывает в направлении, куда вы смотрите.
Как можно убедиться из рис.13.3, по установленным нами правилам вы никогда не сможете просматривать более 14 квадратов одновременно. Более того, раз вы всегда смотрите на север, запад, юг или восток, ваша зона видимости всегда будет выглядеть так, как на рис.13.3, как бы вы ни поворачивались на решетке (рис.13.4).


Рис.13.4. Зона видимости

Для создания псевдотрехмерного интерьера в такой упрощенной модели при любой конфигурации стен лабиринта нам понадобится всего 13 различных видов стен (стена не может находиться на том квадрате, где вы стоите, так что для 14-го квадрата изображение не требуется). На рис.13.5 показано, как выглядят базовые изображения стен (в реальной игре они нарисованы значительно более качественно).


Рис.13.5. 13 изображений, необходимых для построения любого вида стен лабиринта

Пять верхних изображений на рис.13.5 - это стены самого удаленного от точки наблюдения ряда. Во второй строке содержатся стены следующего (в порядке приближения к наблюдателю) ряда. Невысокие изображения в нижнем ряду показывают стены на квадратах, находящихся в непосредственной близости от вас, а две оставшиеся картинки (высокие и узкие) - это видимые части стен на квадратах слева и справа от вас.
Обратите внимание на то, что в графике стен учитывается их положение по отношению к точке наблюдения. У тех, что расположены слева или справа от линии взгляда, видны боковые поверхности, тогда как у стен, на которые вы смотрите прямо, видна всего одна поверхность - фронтальная. Также стоит заметить, что во фронтальной проекции стены представляют собой прямоугольники с элементами потолка и пола лабиринта и что стены, находящиеся вдали, рисуются более темными. Пол и потолок в реальной игре нарисованы гораздо более тщательно. Изображения на рис.13.5 намеренно упрощены для того, чтобы их конструкция и размещение стали более наглядными.
Как же из этих фрагментов собирается трехмерное изображение? Предположим, вы все еще стоите на решетке лабиринта, только она уже не пустая. В левом и правом концах дальнего видимого ряда находятся стены. На рис.13.6 они изображены в виде черных квадратов. При таком расположении стен для построения трехмерного вида используются фрагменты, изображенные на рис.13.7.


Рис.13.6. Две дальние стены на решетке лабиринта


Рис. 13.7. Трехмерный вид для конфигурации стен на рис.13.6

Обратите внимание на то, что на рис.13.7 стены точно совпадают с разметкой квадратов, на которых они находятся. Кроме того, они расположены слева и справа от наблюдателя, и он видит их под небольшим углом. Это означает, что видны не только фронтальные поверхности стен, но и боковые. Фрагменты стен были нарисованы с учетом этого важного свойства перспективы.
Теперь добавим за левой стеной еще одну, как показано на рис.13.8.
Новая стена целиком заполняет весь квадрат решетки и закрывает боковую поверхность стены, расположенной слева от нее. Кроме того, поскольку она видна под меньшим углом, нам открывается меньшая часть ее боковой поверхности, чем для стены слева. Как видите, при построении трехмерного изображения из фрагментов следует размещать их на решетке, начиная с внешних квадратов и постепенно продвигаясь к центру (рис.13.9).


Рис.13.8. Три стены на решетке лабиринта


Рис. 13.9. Трехмерный вид для конфигурации стен на рис.13.8

Теперь поставим в дальнем ряду решетки еще одну стену, как показано на рис.13.10. При этом получается вид, изображенный на рис.13.11.


Рис.13.10. Четыре стены на решетке лабиринта


Рис. 13.11. Трехмерный вид для конфигурации стен на рис.13.10

Новая стена, появившаяся на рис.13.11, стоит под прямым углом к наблюдателю, поэтому видна только ее фронтальная часть. Она, как и все предыдущие стены, целиком заполняет свой квадрат и закрывает ту часть стены слева, которая должна исчезнуть из поля зрения наблюдателя.
Подобно тому, как стены в каждом конкретном ряду расставляются от краев к центру, следует начинать с дальнего ряда и продвигаться к ближнему. Например, взгляните на рис.13.12, на котором появилась стена в левой части ближнего ряда. Эквивалентный трехмерный вид показан на рис.13.13.


Рис.13.12. Пять стен на решетке лабиринта


Рис. 13.13. Трехмерный вид для конфигурации стен на рис.13.12

Из рис.13.13 становится ясно, почему трехмерный вид должен строиться от дальних рядов к ближним. Если двигаться в обратном порядке, то дальние стены будут закрывать ближние, что было бы совершенно нелогично.
Попробуем еще одну конфигурацию стен, чтобы все стало окончательно понятно. Добавим стену, изображенную на рис. 13.14. Трехмерный вид, построенный для данной конфигурации, приведен на рис.13.15. Хотя новая стена закрывает собой правую стену в дальнем ряду, все равно можно увидеть проход, ведущий вглубь лабиринта.


Рис.13.14. Шесть стен на решетке лабиринта


Рис. 13.15. Трехмерный вид для конфигурации стен на рис.13.14
***

[К сожалению, автор "постеснялся" внятно изложить основные принципы такого рисования. Это в традициях буржуинского обучения - ученик должен быть уверен, что "все постиг", но должен остаться неспособным "догнать учителя".
Итак, принципы, без которых нельзя ничего нарисовать:

- Без математики никак нельзя. Решетку, подобную рис.13.2 вам "все-таки" придется рассчитать самому, как в "AKALABETH".
- Какой кубик рисовать следующим? Самый крайний из самых дальних.
- Почему треугольнички в третьем ряду можно игнорировать? Потому, что края кубиков в четвертом ряду (и полы-потолки на такой дистанции) скрываются в темноте, дымке, тумане.
- Для имитация перемещения по лабиринту нужно два набора таких кубиков - четный и нечетный. И каждый шаг их менять.
- Для облегчения поворотов можно иметь компас или рисовать ориентиры на заднике (горы, луну и т.д).
- В отличие от "AKALABETH" двери лучше размещать не на стенах, а посредине кубиков-проходов. Как чудовищ и сундуки.

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

Правда, в последнее время авторы подобных "приключений" предпочитают рисовать их в изометрии (вид на героя и лабиринт сверху-сзади-сбоку), но мы, любители солдатиков, можем такое и на столе расставить, без всяких ЭВМ-ов.- G.]
avatar
Gudleifr
Admin

Сообщения : 932
Дата регистрации : 2017-03-29

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: 01.04. ТОПОЛОГИИ И ТОПОГРАФИИ ЗАЗЕРКАЛЬЯ

Сообщение автор Gudleifr в Вс Дек 03, 2017 12:26 pm

ВЫВОДЫ

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

Во-вторых, с точки зрения игры в солдатики, это тупик. Можно сколь угодно совершенствовать построенный мир, но пожертвовать какой-то его частью, разрешив отыгрывать ее настольно, жалко. Даже в варианте многоуровневости a la KING'S BOUNTY как-то не получается.
avatar
Gudleifr
Admin

Сообщения : 932
Дата регистрации : 2017-03-29

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: 01.04. ТОПОЛОГИИ И ТОПОГРАФИИ ЗАЗЕРКАЛЬЯ

Сообщение автор Спонсируемый контент


Спонсируемый контент


Вернуться к началу Перейти вниз

Вернуться к началу


 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения