Als Kind habe ich das Intellivision-Spiel Advanced Dungeons and Dragons: Treasure of Tarmin gespielt . Die 3-D-Grafik versetzt Sie in eine Perspektive aus der ersten Person mit schockierendem Realismus:
Aber dann habe ich einen C-64 bekommen. Und ich konnte auf dem 40x25-Zeichenraster zeichnen, indem ich über den Bildschirm flog, die Farbe mit der Strg-Taste und einer Ziffer einstellte und Symbole an einer beliebigen Stelle platzierte (warum bash
ließ ich das nicht zu?) . Der Zeichensatz hatte dreieckige Komponenten und feste Blockkomponenten. So konnte ich überlegen, wie man durch dieses Medium eine Darstellung seiner Perspektive in einem Raster erzeugen könnte.
Ich habe diese Woche die fast drei Jahrzehnte alte Spezifikation über "Dungeon Construction Set" in spiralgebundenem Notizbuchpapier gefunden:
( UPDATE : Vorsichtige Leser werden bemerken, dass dies bei den schrägen Teilen nicht ganz zusammenhält. Die korrigierten Zahlen sind unten angegeben.)
Obwohl Treasure of Tarmin auf einem Gitter gespielt wurde, existierten die Wände nur an den Rändern von Gitterfeldern. Nachdem ich gelernt hatte, was Bytes sind, wurde mir klar, dass jedes Quadrat auf der Karte vier mögliche Zustände für jeden seiner Ränder haben könnte, wenn ich die Karte aus Bytes zusammensetze:
- Ungehindert
- Mauer
- Tür
- Etwas anderes?
Ich bin nie dazu gekommen, es zu schreiben (bis letzte Nacht). Ich dachte, es könnte Spaß machen, wenn andere es versuchen.
Ihre Aufgabe ist es also, einen auf dem Zeichenmodus basierenden Labyrinth-Renderer zu implementieren, der meine (korrigierte !!) Spezifikation implementiert, aber die Technologien von 2013 verwendet.
Eingang
Da die Spezifikation kein Rendering für Türen definiert, gehen wir einfach davon aus, dass die einzigen Optionen Wand-und-nicht-Wand sind. Der Einfachheit halber handelt es sich bei Ihrer Eingabe um eine Karte, die aus folgenden Zeichenfolgen besteht:
WN.. .N.. .N.. .N.. .N.E
W... .... .... ..S. ...E
W... .N.E W... .N.. ...E
W... .... .... .... ...E
W.S. ..S. ..S. ..S. ..SE
Das wäre eine 5x5 Karte. In der oberen linken Ecke (1,1) ist die W
est- und N
orth-Wand eingestellt. In der unteren rechten Ecke (5,5) ist die S
äußere und die äußere E
Wand festgelegt.
Ohne Kartennavigation macht das deutlich weniger Spaß. Stellen Sie Ihren Player also mindestens auf (1,1) nach Norden und bieten Sie ihm Folgendes an:
[F]orward, [B]ackward, turn [L]eft, turn [R]ight or [Q]uit?
Geben Sie bei jedem Schritt eine 16x15-Anzeige der Perspektive der ersten Person aus, wie in der Notebook-Papierspezifikation definiert. Damit Sie nicht zählen müssen, sind die Abmessungen der flachen Wände in den drei Abständen wie folgt:
14x13 (directly in front of you; e.g. wall is in same cell)
8x7 (one step away)
6x5 (two steps away)
Die Begrenzungsgrößen der schrägen Wände sind:
1x15 (your direct left or right; e.g. wall is in same cell)
3x13 (one step away)
1x7 (two steps away)
Klarstellungen
Benachbarte Zellen stimmen möglicherweise nicht mit geteilten Wänden überein. Die Südkante eines Quadrats könnte also eine Mauer sein, während die Nordkante des Quadrats südlich davon frei wäre. Im ursprünglichen Design betrachtete ich dies als ein Merkmal: Es ermöglicht interessante Ideen wie Einweg-Türen ... oder unsichtbare Wände, die erst erscheinen, nachdem Sie sie passiert haben. Befolgen Sie für diese Vereinfachung die gleiche Regel: Achten Sie beim Navigieren und Rendern nur auf den Kantenstatus in der Zelle , die Ihnen in der Blickrichtung am nächsten liegt .
Die Ansicht ist mit "Schattierung" viel besser. Wechseln Sie also für Ihre vollständigen Blöcke entweder Unicode 2593 ▓ und 2591 ░ oder verwenden Sie
X
und,+
wenn Ihre Implementierung ASCII ist.Unicode-Dreieck-Zeichen (25E2 ◢, 25E3 ◣, 25E4 ◤, 25E5 ◥) sind zum Zeichnen etwas lahm. Abgesehen davon, dass sie keine schattierten Varianten haben, strecken sie oft nur die Breite des Zeichens und nicht die volle Höhe ... selbst bei Schriften mit fester Breite. Sie können ganze Blöcke oder Schrägstriche oder etwas von Ihrer Wahl an den Stellen zeichnen, an denen ich Diagonalen haben wollte. Interessante kreative Lösungen, die Farbe einbeziehen und diese Zeichen anstelle von Schattierungen verwenden, werden geschätzt.
Sie können davon ausgehen, dass die äußersten Wände den Spielbereich begrenzen, sodass Sie sich nicht darum kümmern müssen, etwas außerhalb des Labyrinths zu rendern. Alle Wände, die weiter von Ihnen entfernt sind als die Spezifikation, werden ignoriert und lassen nur leeren Raum.
Die Schattierung der Wand, die Sie direkt vor sich sehen, wenn Sie bei (1,1) nach Norden blicken, sollte DUNKEL sein. Alternative Schattierung benachbarter Wände auf der Karte, sodass eine helle Wand niemals an eine dunkle Wand stoßen würde, wenn alle Wände vorhanden wären.
Eine C-64-Implementierung, die tatsächlich das tut, was ich ursprünglich beabsichtigt hatte ... mit den diagonalen Zeichen und allem ... wird jedes andere Eingabekriterium übertreffen. :-)
Beispiele
Für die oben angegebene Beispielkarte ...
Bei (1,3) nach Süden:
/
/+
/X+
/XX+
/XXX+
+++++XXXXXX+XXX+
+++++XXXXXX+XXX+
+++++XXXXXX+XXX+
+++++XXXXXX+XXX+
+++++XXXXXX+XXX+
\XXX+
\XX+
\X+
\+
\
Bei (3,2) nach Süden:
/* blank line */
X /
X /+
X /++
X +++
X +++
X +++
X +++
X +++
X +++
X +++
X \++
X \+
X \
/* blank line */
Bei (3,2) nach Osten:
/* blank line */
/
/X
/XX
XXX
+++++XXXXXX+XXX+
+++++XXXXXX+XXX+
+++++XXXXXX+XXX+
+++++XXXXXX+XXX+
+++++XXXXXX+XXX+
XXX
\XX
\X
\
/* blank line */
Bei (2,3) nach Norden:
/
++++++++++++++X
++++++++++++++X
++++++++++++++X
++++++++++++++X
X++++++++++++++X
X++++++++++++++X
X++++++++++++++X
X++++++++++++++X
X++++++++++++++X
++++++++++++++X
++++++++++++++X
++++++++++++++X
++++++++++++++X
\
X
s aus Ihrer Sicht 3, 2
nach Süden erklären ?