子供の頃、私はIntellivisionゲームAdvanced Dungeons and Dragons:Treasure of Tarminをプレイしました。3Dグラフィックスにより、衝撃的なリアリズムを備えた、一人称視点の視点が得られます。
しかし、その後、C-64を手に入れました。そして、画面の周りにカーソルを移動し、Ctrlキーと数字で色を設定し、好きな場所に記号を配置することで、40x25の文字グリッドに描画することができました(なぜそうさせないのbash
ですか?)。文字セットには、三角形のコンポーネントとソリッドブロックのコンポーネントがありました。だから私は、その媒体を介してグリッドに自分の視点のレンダリングを生成する方法を推論することができました。
今週、「ダンジョンコンストラクションセット」について、スパイラルバインドされたノート用紙で、約3年前の仕様を見つけました。
(更新:注意深く読んでいる人は、これが傾斜部分で完全には結びつかないことに気付くでしょう。修正された数値を以下に示します。)
Treasure of Tarminはグリッド上でプレイされましたが、壁はグリッドの正方形の端にのみ存在していました。バイトが何であるかを学んだ後、バイトでマップを作成すると、マップ上の各正方形がそのエッジごとに4つの可能な状態を持つことができることに気付きました。
- 遮るものがない
- 壁
- ドア
- 他に何か?
(昨夜まで)私はそれを書くことはできませんでした。他の人が試すのは楽しいかもしれないと思った。
したがって、あなたのタスクは、私の(修正された!!)仕様を実装する文字モードベースの迷路レンダラーを実装することですが、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
estおよびN
orthの壁セットがあります。右下隅(5,5)には、S
外側とE
外側の壁が設定されています。
これは、マップナビゲーションがないとかなり面白くありません。したがって、少なくとも、プレーヤーを北向きの(1,1)に置き、提供します。
[F]orward, [B]ackward, turn [L]eft, turn [R]ight or [Q]uit?
各ステップで、ノートブックの紙の仕様で定義されているように、一人称視点の16x15ディスプレイを出力します。数える必要がないように、3つの距離にある平らな壁のサイズは次のとおりです。
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░を交互に使用するか、実装がASCIIの場合に使用
X
し+
ます。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
視点での2つの列について説明してください3, 2
。