Когда я был ребенком, я играл в игру 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
юг?Ответы:
Commodore 64 Basic
Чувак, это было весело. И тяжело. C64 Basic практически не отлаживается, вы даже не можете использовать
print
отладку, потому что экран уже взят для рендеринга подземелья. Вы знаете, что вам весело, когда вы пишете код, как55250 goto 55110
. Дейкстра убьет меня.Программа использует два цвета и диагональные символы.
Излишне говорить, что я не играл в гольф. В конце концов, это говорит о проблемах с кодом . Это 7183 байта, если вам интересно.
Это медленно - при скорости по умолчанию для визуализации сцены требуется несколько секунд. Максимальный размер карты 10 на 10, но его можно изменить, отредактировав строку 120.
Я разработал и протестировал это с помощью эмулятора VICE . Код ниже отображается в ASCII, что означает сдвиг PETSCII. Однако при вводе карты вы должны использовать PETSCII без смещения .
Скриншот:
Код:
Изображение ленты: скачать здесь .
Примеры:
источник
Я просто должен был сейчас.
Баш, 12743 символа
Пожалуйста, имейте в виду, что это первое, что я сделал,
bash
это было больше, чем просто объединение нескольких команд. Скорее всего, это можно было бы уменьшить, если бы я не жестко закодировал все стены, но это казалось проще. У него нет никакой последовательности. Байтный формат для каждого квадрата выбирается ужасным образом. Но это работает.Я даже добавил поддержку движения через клавиши со стрелками :)
Вот несколько скриншотов для примера ввода (обратите внимание, что моя карта начинается с (0 | 0)):
Кроме четвертого, все они похожи на образцы (см. Мой комментарий к ОП).Эти скриншоты были сделаны на urxvt v9.15 с поддержкой 256 цветов, вероятно, на 88-цветном терминале это выглядело бы совсем глупо, а терминалы без поддержки юникода вообще не работают. Я использовал шрифт Source Code Pro от Adobe.
источник
Вот моя версия, в Python 3. Это что-то вроде 3k символов и может стать немного меньше с небольшим усилием (есть много пустого пространства, которое можно удалить, для начала).
В настоящее время он использует в
+X/\
качестве своих символов для рисования, но он настроен для рисования с использованием символов Юникода, если у вас есть шрифт фиксированной ширины, который будет отображать их правильно. Он поддерживает использование отдельных плиток для угловых частей разноцветных стен, хотя я не использую эту функцию. Это также позволяет вам предоставлять потолочные, напольные и «отдаленные» плитки, и вы можете использовать разные, когда игрок смотрит на восток или запад против севера или юга. Увы, это никогда не выглядело очень хорошо, поэтому, вероятно, все они должны быть пустыми (или что-то твердое, например█
).Увы, в моей системе Windows 7 я ужасно пытался найти моноширинный шрифт с полным набором символов блоков (например,
▜
и▟
). Большинство из тех, что я нашел, не может быть доступно вcmd
консоли по какой-то причине (возможно, потому что они не идеально моноширинны?). Если вы думаете, что ваша консоль более функциональна, попробуйте использовать альтернативный набор символов, который я прокомментировал, в верхней части файла, который выглядит не так уж плохо даже с двумя цветами. Он заполнил потолки и полы и в основном прозрачные стены.Код:
Набор символов указывается в верхней части файла. Порядок символов:
/
со стеной под ним)В игре может быть отрисовано 15 стен по такой схеме (с
V
указанием позиции игрока и дуги обзора):Плитки, используемые 15 стенами, определены в
shapes
списке. Это список из двух кортежей. Первое значение кортежа указывает «четность» стены,0
указывая, что он должен быть нарисован теми же символами, что и стена, прямо перед символом, и1
указывая, что это должен быть альтернативный шаблон (например,+
vsX
). Второе значение представляет собой списокx,y,t
кортежей, указывающих координаты экрана и индекс плитки в один пиксель (стены, отображаемые с нечетной четностью, будут1
добавлены к каждому из этих индексов). Формы упорядочены по расстоянию, поэтому первые три представляют собой перпендикулярные стены на две плитки впереди персонажа, затем две параллельные стены на две плитки впереди и так далее.Функции:
rr
: «отрендерить» экран (печатая тайлы в буфере экрана).dw
: "рисовать стены" в предоставленном буфере экрана. При этом используется алгоритм рисования, поэтому самые дальние стены рисуются первыми и могут быть закрыты более близкими.ga
: «get area» возвращает список логических значений, указывающих, какие стены непрозрачны для данной позиции карты и облицовки.rd
: «чтение», генератор, который читает карту, получая строки. Это необходимо только потому, что консоль IDLE делает странные вещи, когда вы вставляете многострочные вводы вместо ввода по одной строке за раз.rm
: «читать карту», анализирует карту во вложенный список логических значений, индексируемыхm[y][x][d]
(сd=0
востоком иd=1
югом). Он также добавляет две строки и два столбца квадратов заполнения, чтобы избежать ошибок индекса в другом коде.cl
: «очистить» вывод (написав достаточно новых строк, чтобы прокрутить старый вид с вершины большинства консолей).gl
: "игровой цикл", где собирается вход и вызывается вышеуказанный материал.Несколько «скриншотов»:
Начальная позиция:
Глядя вдоль северной стены:
Пара снимков, соответствующих вашим примерам (обратите внимание, пустые первые строки отсекаются с помощью переполнения стека, они находятся в выходных данных программы):
И:
Вот один из странных видов на прилагаемой карте, так как стена, параллельная нашему виду, того же цвета, что и торчащая за ней перпендикулярная стена:
Вот как будет выглядеть область последнего снимка сверху:
источник