Ketika saya masih kecil, saya memainkan game Intellivision, Dungeons and Dragons: Treasure of Tarmin . Grafik 3-D menempatkan Anda pada sudut pandang orang pertama dengan realisme yang mengejutkan:
Tapi kemudian saya mendapat C-64. Dan saya dapat menggambar pada grid karakter 40x25 dengan mengitari layar, mengatur warna dengan tombol Ctrl dan angka, dan menempatkan simbol di mana pun saya inginkan (mengapa tidak bash
membiarkan saya melakukan itu?) . Set karakter memiliki komponen segitiga dan komponen blok padat. Jadi saya bisa memikirkan bagaimana seseorang dapat menghasilkan rendering perspektif seseorang dalam kotak melalui media itu.
Saya menemukan spek yang hampir berumur tiga dekade, di kertas notebook berbentuk spiral, tentang "Dungeon Construction Set" minggu ini:
( PEMBARUAN : Pembaca yang cermat akan melihat bahwa ini tidak cukup melekat pada bagian yang miring. Angka yang diperbaiki disediakan di bawah ini.)
Meskipun Harta Karun Tarmin dimainkan pada kotak, dinding hanya ada di tepi kotak kotak. Setelah mempelajari apa itu byte, saya menyadari bahwa jika saya membuat peta dari byte ... maka setiap kotak pada peta dapat memiliki empat status yang mungkin untuk masing-masing tepi:
- Tidak terhalang
- Dinding
- Pintu
- Sesuatu yang lain
Saya tidak pernah sempat menulisnya (sampai semalam). Saya pikir mungkin menyenangkan bagi orang lain untuk mencoba.
Jadi tugas Anda adalah mengimplementasikan penyaji maze berbasis karakter-mode yang mengimplementasikan spesifikasi (terkoreksi !!) saya ... tetapi menggunakan teknologi tahun 2013.
Memasukkan
Karena spek tidak menentukan rendering untuk pintu, kami hanya akan berasumsi bahwa satu-satunya pilihan adalah dinding dan bukan dinding. Untuk kesederhanaan, input Anda adalah peta yang terdiri dari garis-garis string yang terlihat seperti ini:
WN.. .N.. .N.. .N.. .N.E
W... .... .... ..S. ...E
W... .N.E W... .N.. ...E
W... .... .... .... ...E
W.S. ..S. ..S. ..S. ..SE
Itu akan menjadi peta 5x5. Sudut kiri atas (1,1) memiliki W
est dan N
dinding. Sudut kanan bawah (5,5) memiliki set dinding S
outh dan E
ast.
Ini jauh lebih tidak menyenangkan tanpa navigasi peta. Jadi minimal, tempatkan pemain Anda di (1,1) menghadap ke utara dan tawarkan kepada mereka:
[F]orward, [B]ackward, turn [L]eft, turn [R]ight or [Q]uit?
Pada setiap langkah, tampilkan tampilan 16x15 dari perspektif orang pertama, sebagaimana ditentukan oleh spesifikasi kertas notebook. Agar Anda tidak harus menghitung, ukuran dinding datar pada tiga jarak adalah:
14x13 (directly in front of you; e.g. wall is in same cell)
8x7 (one step away)
6x5 (two steps away)
Ukuran pembatas dinding miring adalah:
1x15 (your direct left or right; e.g. wall is in same cell)
3x13 (one step away)
1x7 (two steps away)
Klarifikasi
Sel yang berdekatan mungkin tidak setuju tentang dinding bersama. Jadi tepi selatan pada sebuah bujur sangkar mungkin adalah sebuah tembok, sedangkan tepi utara pada bujur sangkar di selatan itu tidak terhalang. Dalam desain aslinya saya menganggap ini sebagai fitur: itu memungkinkan ide-ide menarik seperti pintu satu arah ... atau dinding tak terlihat yang hanya muncul setelah Anda melewati mereka. Untuk penyederhanaan ini, ikuti aturan yang sama: untuk navigasi dan rendering, perhatikan hanya status tepi pada sel yang terdekat dengan Anda ke arah yang Anda hadapi .
Tampilannya jauh lebih baik dengan "shading". Jadi untuk blok penuh Anda, alternatifkan Unicode 2593 ▓ dan 2591 ░, atau gunakan
X
dan+
jika implementasi Anda adalah ASCII.Karakter segitiga Unicode (25E2 ◢, 25E3 ◣, 25E4 ◤, 25E ◥) agak timpang untuk menggambar ini. Selain tidak memiliki varian teduh, mereka sering hanya merentangkan lebar karakter dan tidak tinggi penuh ... bahkan dalam font lebar tetap. Anda dapat menggambar blok penuh atau memangkas karakter atau sesuatu yang Anda pilih di tempat yang saya inginkan diagonal. Solusi kreatif yang menarik yang menggabungkan warna dan menggunakan karakter-karakter ini daripada menghargai.
Anda dapat mengasumsikan dinding terluar diatur untuk mengikat area bermain, sehingga Anda tidak perlu khawatir membuat apa pun di luar labirin. Dinding yang lebih jauh dari Anda daripada spec diabaikan dan hanya meninggalkan ruang kosong.
Bayangan dinding yang Anda lihat langsung di depan Anda jika menghadap Utara di (1,1) harus DARK. Bernaung alternatif di dinding yang berdekatan di peta, sehingga jika semua dinding ada maka dinding yang terang tidak akan pernah berbatasan dengan dinding yang gelap.
Implementasi C-64 yang benar-benar melakukan apa yang awalnya saya maksudkan ... dengan karakter diagonal dan semuanya ... akan mengalahkan kriteria entri lainnya. :-)
Contohnya
Untuk peta contoh yang diberikan di atas ...
Di (1,3) menghadap ke selatan:
/
/+
/X+
/XX+
/XXX+
+++++XXXXXX+XXX+
+++++XXXXXX+XXX+
+++++XXXXXX+XXX+
+++++XXXXXX+XXX+
+++++XXXXXX+XXX+
\XXX+
\XX+
\X+
\+
\
Di (3,2) menghadap ke selatan:
/* blank line */
X /
X /+
X /++
X +++
X +++
X +++
X +++
X +++
X +++
X +++
X \++
X \+
X \
/* blank line */
Di (3,2) menghadap ke timur:
/* blank line */
/
/X
/XX
XXX
+++++XXXXXX+XXX+
+++++XXXXXX+XXX+
+++++XXXXXX+XXX+
+++++XXXXXX+XXX+
+++++XXXXXX+XXX+
XXX
\XX
\X
\
/* blank line */
Di (2,3) menghadap ke utara:
/
++++++++++++++X
++++++++++++++X
++++++++++++++X
++++++++++++++X
X++++++++++++++X
X++++++++++++++X
X++++++++++++++X
X++++++++++++++X
X++++++++++++++X
++++++++++++++X
++++++++++++++X
++++++++++++++X
++++++++++++++X
\
X
s dalam pandangan Anda 3, 2
menghadap ke selatan?