小时候,我玩了Intellivision游戏Advanced Dungeons and Dragons:Tarmin of Tarmin。3D图形使您以令人震惊的真实感进入第一人称视角:
但是后来我得到了一架C-64。然后,我可以通过在屏幕上游标,使用Ctrl键和数字设置颜色以及将符号放置在所需的任何位置上来绘制40x25字符网格(为什么bash
不让我这样做呢?)。字符集具有三角形成分和实心块成分。因此,我能够推理出如何通过该媒介在网格中生成一个人的视角的渲染。
我在本周的螺旋装订笔记本纸中找到了将近三十年的规格,关于“地下城建筑套装”:
(更新:细心的读者会注意到,这在倾斜的部分上并不能完全解决。下面提供了更正的数字。)
尽管Tarmin of Tarmin是在网格上播放的,但墙壁仅存在于网格正方形的边缘。了解了字节是多少之后,我意识到,如果我用字节来制作地图,那么地图上的每个方块的每个边缘可能都有四个可能的状态:
- 通畅
- 壁
- 门
- 还有吗?
我从来没有去写它(直到昨晚)。我认为其他人尝试可能会很有趣。
因此,您的任务是实现一个基于字符模式的迷宫渲染器,该渲染器实现我的(更正!)规范...但是使用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
ast墙固定。
如果没有地图导航,则乐趣会大大减少。因此,至少要将您的玩家放在(1,1)朝北的位置,并为他们提供:
[F]orward, [B]ackward, turn [L]eft, turn [R]ight or [Q]uit?
在每个步骤中,输出笔记本电脑规格所定义的第一人称视角的16x15显示。为了使您不必计数,三个距离处的平坦墙的大小为:
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░,或使用
X
和+
如果你的实现是ASCII。Unicode三角形字符(25E2◢,25E3◣,25E4 E,25E5◥)在绘制时有点la脚。除了没有任何阴影变体以外,它们通常仅拉伸字符的宽度而不拉伸整个高度...即使在固定宽度的字体中也是如此。您可以在我想要的对角线位置绘制完整的方块或斜线字符或您选择的内容。有趣的创意解决方案,融合了颜色并使用这些字符而不是底纹,因此受到赞赏。
您可以假设最外墙设置为游戏区域的边界,因此您不必担心在迷宫之外渲染任何东西。任何比规格离您更远的墙都将被忽略,仅留下空白区域。
如果在(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
的角度解释的两列3, 2
吗?