Quand j'étais enfant, je jouais au jeu Intellivision Advanced Dungeons and Dragons: Treasure of Tarmin . Les graphismes en 3D vous mettent dans une perspective à la première personne avec un réalisme choquant:
Mais ensuite, j'ai eu un C-64. Et j'ai pu dessiner sur la grille de 40x25 caractères en survolant l'écran, en définissant la couleur avec la touche Ctrl et un chiffre, et en plaçant des symboles où je voulais (pourquoi ne me bash
laisse-t-il pas faire cela?) . Le jeu de caractères avait des composants triangulaires et des composants en blocs solides. J'ai donc pu raisonner sur la façon dont on pouvait générer un rendu de sa perspective dans une grille à travers ce support.
J'ai trouvé la spécification vieille de près de trois décennies, dans du papier pour cahier à reliure spirale, sur "Dungeon Construction Set" cette semaine:
( MISE À JOUR : Les lecteurs attentifs remarqueront que cela ne tient pas tout à fait ensemble sur les pièces inclinées. Les nombres corrigés sont fournis ci-dessous.)
Bien que Treasure of Tarmin ait été joué sur une grille, les murs n'existaient que sur les bords des carrés de la grille. Ayant appris quels étaient les octets, j'ai réalisé que si je faisais la carte à partir d'octets ... alors chaque carré sur la carte pourrait avoir quatre états possibles pour chacun de ses bords:
- Dégagée
- mur
- Porte
- Autre chose?
Je n'ai jamais réussi à l'écrire (jusqu'à hier soir). J'ai pensé que ça pourrait être amusant pour les autres d'essayer.
Votre tâche consiste donc à implémenter un rendu de labyrinthe basé sur le mode caractère qui implémente mes spécifications (corrigées !!) ... mais en utilisant les technologies de 2013.
Contribution
Étant donné que la spécification ne définit pas le rendu des portes, nous supposerons simplement que les seules options sont mur et non mur. Pour plus de simplicité, votre entrée est une carte composée de lignes de chaînes qui ressemblent à ceci:
WN.. .N.. .N.. .N.. .N.E
W... .... .... ..S. ...E
W... .N.E W... .N.. ...E
W... .... .... .... ...E
W.S. ..S. ..S. ..S. ..SE
Ce serait une carte 5x5. Le coin supérieur gauche (1,1) a son ensemble de murs W
est et N
orth. Le coin inférieur droit (5,5) a son ensemble de murs extérieur S
et E
ast.
C'est beaucoup moins amusant sans navigation sur la carte. Donc au minimum, placez votre joueur à (1,1) face au nord et offrez-lui:
[F]orward, [B]ackward, turn [L]eft, turn [R]ight or [Q]uit?
À chaque étape, affichez un affichage 16x15 de la perspective à la première personne, comme défini par la spécification papier du carnet. Pour vous éviter d'avoir à compter, la taille des murs plats aux trois distances est:
14x13 (directly in front of you; e.g. wall is in same cell)
8x7 (one step away)
6x5 (two steps away)
Les dimensions limites des murs inclinés sont les suivantes:
1x15 (your direct left or right; e.g. wall is in same cell)
3x13 (one step away)
1x7 (two steps away)
Clarifications
Les cellules adjacentes peuvent ne pas être d'accord sur les murs partagés. Ainsi, le bord sud d'un carré pourrait être un mur, tandis que le bord nord du carré au sud serait dégagé. Dans la conception originale, je considérais cela comme une caractéristique: cela permet des idées intéressantes comme des portes à sens unique ... ou des murs invisibles qui n'apparaissent qu'après les avoir franchis. Pour cette simplification, suivez la même règle: pour la navigation et le rendu, faites attention uniquement à l'état du bord sur la cellule la plus proche de vous dans la direction vers laquelle vous faites face .
La vue est bien meilleure avec "l'ombrage". Donc, pour vos blocs complets, alternez soit Unicode 2593 ▓ et 2591 ░, soit utilisez
X
et+
si votre implémentation est ASCII.Les caractères triangulaires Unicode (25E2 ◢, 25E3 ◣, 25E4 ◤, 25E5 ◥) sont un peu boiteux pour dessiner cela. En plus de ne pas avoir de variantes ombrées, elles étirent souvent uniquement la largeur du caractère et non la pleine hauteur ... même dans les polices à largeur fixe. Vous pouvez dessiner des blocs entiers ou des caractères slash ou quelque chose de votre choix dans les endroits où je voulais des diagonales. Des solutions créatives intéressantes qui incorporent la couleur et utilisent ces caractères au lieu de l'ombrage sont appréciées.
Vous pouvez supposer que les murs les plus extérieurs sont définis pour délimiter la zone de jeu, vous n'avez donc pas à vous soucier de rendre quoi que ce soit en dehors du labyrinthe. Tous les murs plus éloignés de vous que la spécification sont ignorés et ne laissent qu'un espace vide.
L'ombrage du mur que vous voyez directement devant vous si vous faites face au nord à (1,1) doit être FONCÉ. Ombrage alterné sur les murs adjacents de la carte, de sorte que si tous les murs étaient présents, un mur clair ne serait jamais en contact avec un mur sombre.
Une implémentation C-64 qui fait réellement ce que je voulais à l'origine ... avec les caractères diagonaux et tout ... l'emportera sur tout autre critère d'entrée. :-)
Exemples
Pour l'exemple de carte ci-dessus ...
Au (1,3) plein sud:
/
/+
/X+
/XX+
/XXX+
+++++XXXXXX+XXX+
+++++XXXXXX+XXX+
+++++XXXXXX+XXX+
+++++XXXXXX+XXX+
+++++XXXXXX+XXX+
\XXX+
\XX+
\X+
\+
\
Au (3,2) plein sud:
/* blank line */
X /
X /+
X /++
X +++
X +++
X +++
X +++
X +++
X +++
X +++
X \++
X \+
X \
/* blank line */
À (3,2) face à l'est:
/* blank line */
/
/X
/XX
XXX
+++++XXXXXX+XXX+
+++++XXXXXX+XXX+
+++++XXXXXX+XXX+
+++++XXXXXX+XXX+
+++++XXXXXX+XXX+
XXX
\XX
\X
\
/* blank line */
À (2,3) face au nord:
/
++++++++++++++X
++++++++++++++X
++++++++++++++X
++++++++++++++X
X++++++++++++++X
X++++++++++++++X
X++++++++++++++X
X++++++++++++++X
X++++++++++++++X
++++++++++++++X
++++++++++++++X
++++++++++++++X
++++++++++++++X
\
X
s dans votre vue du 3, 2
sud?