У дитинстві я грав у гру Intellivision Advanced Dungeons and Dragons: Treasure of Tarmin . 3-D графіка поставить вас в точку зору від першої особи з приголомшливим реалізмом:
Але тоді я отримав C-64. І мені вдалося намалювати сітку символів розміром 40x25, курсивши по екрану, встановивши колір клавішею Ctrl і цифрою, і поставивши символи куди хотілося (чому bash
мені це не дозволяють?) . Набір символів мав трикутні компоненти та компоненти твердого блоку. Тому я міг міркувати, як можна створити відображення своєї точки зору в сітці через цей носій.
Цього тижня я знайшов специфікацію майже трьох десятиліть у зошиті папером для зошитів про "Будівельний набір підземелля" цього тижня:
( ОНОВЛЕННЯ . Уважні читачі помітять, що це не дуже сильно тримається на нахилених частинах. Виправлені номери наведені нижче.)
Хоча скарб Тарміна грав на сітці, стіни існували лише на краях сітчастих квадратів. Дізнавшись, що таке байти, я зрозумів, що якби я зробив карту з байтів ... то кожен квадрат на карті міг би мати чотири можливі стани для кожного її краю:
- Безперешкодно
- Стіна
- Двері
- Щось ще?
Я ніколи не збирався писати це (до останньої ночі). Я думав, що іншим може бути цікаво спробувати.
Отже, ваше завдання - реалізувати лабіринт на основі символів, який реалізує мої (виправлені !!) характеристики ... але використовуючи технології 2013 року.
Вхідні дані
Оскільки специфікація не визначає візуалізацію для дверей, ми просто припустимо, що єдиними варіантами є "стіни та не стіни". Для простоти ваш вхід - це карта, що складається з рядків рядків, які виглядають так:
WN.. .N.. .N.. .N.. .N.E
W... .... .... ..S. ...E
W... .N.E W... .N.. ...E
W... .... .... .... ...E
W.S. ..S. ..S. ..S. ..SE
Це була б карта 5x5. У верхньому лівому куті (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 ▓ і 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
s, на ваш погляд, на 3, 2
обличчя півдня?