Quando ero un bambino, ho giocato al gioco Intellivision Advanced Dungeons and Dragons: Treasure of Tarmin . La grafica 3D ti mette in una prospettiva in prima persona con un realismo scioccante:
Ma poi ho ottenuto un C-64. E sono stato in grado di disegnare sulla griglia di caratteri 40x25 scorrendo il cursore sullo schermo, impostando il colore con il tasto Ctrl e una cifra e mettendo i simboli dove volevo (perché non bash
me lo permette?) . Il set di caratteri aveva componenti triangolari e componenti a blocchi solidi. Così sono stato in grado di ragionare su come si potrebbe generare un rendering della propria prospettiva in una griglia attraverso quel mezzo.
Ho trovato le specifiche di quasi tre decenni, in un quaderno rilegato a spirale, su "Dungeon Construction Set" questa settimana:
( AGGIORNAMENTO : I lettori attenti noteranno che questo non si adatta perfettamente alle parti inclinate. I numeri corretti sono forniti di seguito.)
Sebbene Treasure of Tarmin fosse giocato su una griglia, le pareti esistevano solo sui bordi dei quadrati della griglia. Dopo aver appreso cosa fossero i byte, mi sono reso conto che se avessi creato la mappa da byte ... allora ogni quadrato sulla mappa avrebbe potuto avere quattro stati possibili per ciascuno dei suoi bordi:
- Sgomberata
- Parete
- Porta
- Qualcos'altro?
Non sono mai andato in giro a scriverlo (fino a ieri sera). Ho pensato che potrebbe essere divertente per gli altri provare.
Quindi il tuo compito è quello di implementare un render labirinto basato sulla modalità personaggio che implementa le mie specifiche (corrette !!) ... ma usando le tecnologie del 2013.
Ingresso
Poiché le specifiche non definiscono il rendering per le porte, supponiamo che le uniche opzioni siano wall-and-not-wall. Per semplicità, il tuo input è una mappa composta da linee di stringhe che assomigliano a questo:
WN.. .N.. .N.. .N.. .N.E
W... .... .... ..S. ...E
W... .N.E W... .N.. ...E
W... .... .... .... ...E
W.S. ..S. ..S. ..S. ..SE
Sarebbe una mappa 5x5. L'angolo in alto a sinistra (1,1) ha la sua parete W
est e N
orto. L'angolo in basso a destra (5,5) ha la sua parete esterna S
e E
astuta.
Questo è molto meno divertente senza la navigazione della mappa. Quindi almeno metti il tuo giocatore a (1,1) rivolto a nord e offri:
[F]orward, [B]ackward, turn [L]eft, turn [R]ight or [Q]uit?
Ad ogni passaggio, produrre un display 16x15 della prospettiva in prima persona, come definito dalle specifiche della carta per notebook. Per evitare di dover contare, le dimensioni delle pareti piane alle tre distanze sono:
14x13 (directly in front of you; e.g. wall is in same cell)
8x7 (one step away)
6x5 (two steps away)
Le dimensioni del contorno delle pareti inclinate sono:
1x15 (your direct left or right; e.g. wall is in same cell)
3x13 (one step away)
1x7 (two steps away)
chiarimenti
Le celle adiacenti possono non essere d'accordo sulle pareti condivise. Quindi il bordo sud su una piazza potrebbe essere un muro, mentre il bordo nord sulla piazza a sud di esso sarebbe libero. Nel design originale l'ho considerato una caratteristica: permette idee interessanti come porte a senso unico ... o pareti invisibili che appaiono solo dopo che le hai attraversate. Per questa semplificazione, segui la stessa regola: per la navigazione e il rendering, presta attenzione solo allo stato del bordo sulla cella più vicina a te nella direzione in cui sei rivolto .
La vista è molto migliore con "ombreggiatura". Quindi, per i tuoi blocchi completi, alternare Unicode 2593 ▓ e 2591 ░ oppure utilizzare
X
e+
se l'implementazione è ASCII.I caratteri del triangolo Unicode (25E2 ◢, 25E3 ◣, 25E4 ◤, 25E5 ◥) sono un po 'zoppi per disegnare questo. Oltre a non avere varianti sfumate, spesso allungano solo la larghezza del personaggio e non l'intera altezza ... anche in caratteri a larghezza fissa. Puoi disegnare blocchi pieni o caratteri di taglio o qualcosa di tua scelta nei punti in cui volevo le diagonali. Interessanti soluzioni creative che incorporano il colore e usano questi personaggi anziché apprezzare l'ombreggiatura.
Puoi presumere che le pareti più esterne siano impostate per delimitare l'area di gioco, quindi non devi preoccuparti di rendere nulla al di fuori del labirinto. Qualsiasi muro più lontano di te rispetto alle specifiche viene ignorato e lascia spazio vuoto.
L'ombreggiatura del muro che vedi di fronte a te se rivolta a nord a (1,1) dovrebbe essere SCURO. Ombreggiatura alternata sui muri adiacenti nella mappa, in modo tale che se tutti i muri fossero presenti, un muro chiaro non confuterebbe mai un muro scuro.
Un'implementazione C-64 che in realtà fa quello che inizialmente intendevo ... con i personaggi diagonali e tutti ... supererà qualsiasi altro criterio di ingresso. :-)
Esempi
Per la mappa di esempio fornita sopra ...
A (1,3) esposto a sud:
/
/+
/X+
/XX+
/XXX+
+++++XXXXXX+XXX+
+++++XXXXXX+XXX+
+++++XXXXXX+XXX+
+++++XXXXXX+XXX+
+++++XXXXXX+XXX+
\XXX+
\XX+
\X+
\+
\
A (3,2) esposto a sud:
/* blank line */
X /
X /+
X /++
X +++
X +++
X +++
X +++
X +++
X +++
X +++
X \++
X \+
X \
/* blank line */
A (3,2) rivolto a est:
/* blank line */
/
/X
/XX
XXX
+++++XXXXXX+XXX+
+++++XXXXXX+XXX+
+++++XXXXXX+XXX+
+++++XXXXXX+XXX+
+++++XXXXXX+XXX+
XXX
\XX
\X
\
/* blank line */
A (2,3) rivolto a nord:
/
++++++++++++++X
++++++++++++++X
++++++++++++++X
++++++++++++++X
X++++++++++++++X
X++++++++++++++X
X++++++++++++++X
X++++++++++++++X
X++++++++++++++X
++++++++++++++X
++++++++++++++X
++++++++++++++X
++++++++++++++X
\
X
s nella tua vista di 3, 2
fronte a sud?