Когда я был ребенком, я играл в игру Intellivision Advanced Dungeons and Dragons: Treasure of Tarmin . Трехмерная графика дает вам вид от первого лица с шокирующим реализмом:
Но потом я получил C-64. И я смог рисовать на сетке 40x25 символов, курсируя по экрану, устанавливая цвет с помощью клавиши Ctrl и цифры, и помещая символы в любое место, где я хотел (почему я не bash
позволяю это делать?) . Набор символов имел треугольные компоненты и компоненты сплошного блока. Таким образом, я смог обдумать, как можно генерировать рендеринг своей перспективы в сетке через эту среду.
На этой неделе я нашел спецификацию, почти три десятилетия, в спиральной бумаге для тетрадей о Dungeon Construction Set:
( ОБНОВЛЕНИЕ : Внимательные читатели заметят, что на наклонных частях это не совсем так. Исправленные цифры приведены ниже.)
Хотя Сокровища Тармина игрались на сетке, стены существовали только по краям квадратов сетки. Узнав, что такое байты, я понял, что если я сделаю карту из байтов ... тогда у каждого квадрата на карте может быть четыре возможных состояния для каждого из ее ребер:
- свободный
- стена
- Дверь
- Что-то другое?
Я никогда не удосужился написать его (до прошлой ночи). Я думал, что это может быть весело для других, чтобы попробовать.
Таким образом, ваша задача - реализовать основанный на символьном режиме рендеринг лабиринтов, который реализует мою (исправленную !!) спецификацию ... но с использованием технологий 2013 года.
вход
Поскольку спецификация не определяет рендеринг для дверей, мы просто предполагаем, что единственными вариантами являются «стена и не стена». Для простоты ваш ввод - это карта, состоящая из строк строк, которые выглядят так:
WN.. .N.. .N.. .N.. .N.E
W... .... .... ..S. ...E
W... .N.E W... .N.. ...E
W... .... .... .... ...E
W.S. ..S. ..S. ..S. ..SE
Это была бы карта 5х5. Верхний левый угол (1,1) имеет наборы восточной W
и N
правой стен. Нижний правый угол (5,5) имеет свои S
наружные и наружные E
стенки.
Это значительно менее весело без навигации по карте. Поэтому, как минимум, поместите своего игрока в (1,1) на север и предложите им:
[F]orward, [B]ackward, turn [L]eft, turn [R]ight or [Q]uit?
На каждом шаге выведите изображение 16x15 с видом от первого лица, как определено в спецификации бумаги для ноутбука. Чтобы вам не приходилось считать, размеры плоских стен на трех расстояниях:
14x13 (directly in front of you; e.g. wall is in same cell)
8x7 (one step away)
6x5 (two steps away)
Ограничивающие размеры наклонных стен:
1x15 (your direct left or right; e.g. wall is in same cell)
3x13 (one step away)
1x7 (two steps away)
Разъяснения
Соседние клетки могут не соглашаться по поводу общих стен. Таким образом, южный край на квадрате может быть стеной, в то время как северный край на квадрате к югу от него будет беспрепятственным. В оригинальном дизайне я считал, что это особенность: он допускает интересные идеи, такие как односторонние двери ... или невидимые стены, которые появляются только после того, как вы прошли через них. Для этого упрощения следуйте тому же правилу: для навигации и рендеринга обращайте внимание только на состояние ребра в ближайшей к вам ячейке в направлении, в котором вы находитесь .
Вид намного лучше с "затенением". Так что для ваших полных блоков чередуйте либо Unicode 2593 25 и 2591 ░, либо используйте
X
и,+
если ваша реализация ASCII.Треугольные символы Unicode (25E2 ◢, 25E3 ◣, 25E4 ◤, 25E5 ◥) немного отстойные для рисования этого. Помимо отсутствия заштрихованных вариантов, они часто растягивают только ширину символа, а не полную высоту ... даже в шрифтах фиксированной ширины. Вы можете рисовать полные блоки или косые черты или что-то по вашему выбору в местах, где я хотел диагонали. Ценится интересные креативные решения, которые включают цвет и используют эти символы вместо затенения.
Вы можете предположить, что внешние стены ограничены игровой зоной, поэтому вам не нужно беспокоиться о рендеринге вне лабиринта. Любые стены дальше от вас, чем спецификация, игнорируются и просто оставляют пустое пространство.
Затенение стены, которую вы видите прямо перед собой, если смотреть на север в точке (1,1), должно быть ТЕМНЫМ. Поочередное затенение смежных стен на карте, так что если бы присутствовали все стены, то светлая стена никогда не упиралась бы в темную стену.
Реализация C-64, которая на самом деле делает то, что я изначально задумал ... с диагональными символами и всем ... превзойдет любой другой критерий входа. :-)
Примеры
Для примера карты, приведенной выше ...
На (1,3) с видом на юг:
/
/+
/X+
/XX+
/XXX+
+++++XXXXXX+XXX+
+++++XXXXXX+XXX+
+++++XXXXXX+XXX+
+++++XXXXXX+XXX+
+++++XXXXXX+XXX+
\XXX+
\XX+
\X+
\+
\
На (3,2) на юг:
/* blank line */
X /
X /+
X /++
X +++
X +++
X +++
X +++
X +++
X +++
X +++
X \++
X \+
X \
/* blank line */
На (3,2) лицом к востоку:
/* blank line */
/
/X
/XX
XXX
+++++XXXXXX+XXX+
+++++XXXXXX+XXX+
+++++XXXXXX+XXX+
+++++XXXXXX+XXX+
+++++XXXXXX+XXX+
XXX
\XX
\X
\
/* blank line */
В (2,3) на север:
/
++++++++++++++X
++++++++++++++X
++++++++++++++X
++++++++++++++X
X++++++++++++++X
X++++++++++++++X
X++++++++++++++X
X++++++++++++++X
X++++++++++++++X
++++++++++++++X
++++++++++++++X
++++++++++++++X
++++++++++++++X
\
X
с вашей точки зрения на 3, 2
юг?