佛山市南海区桂城街道桂澜北路2号亿能国际广场2座511-B室(住所申报) 13706130838 jinnian@baidu.ag

新闻中心

游戏机制笔记:体素建筑的相邻遮挡面计数——11块建筑的暴露面(例06)

2026-10-24

用小方块搭建筑时,两个相邻方块贴住的面通常不用单独显示。逐块检查六个方向,能计算这组方块有多少个没有被邻块遮住的面,而不是直接用方块数量乘六。

下面使用一组独立练习数据,说明输入、规则、处理顺序和输出之间的关系。建议先遮住结果自己推演,再逐步对照;如果出现差异,应先定位第一处不同,并检查边界条件,不要只把最后的答案改成一样。

规则和数据

本例全部方块是单位立方体,按整数坐标放置,无重复和部分重叠。只要某个面外侧没有相邻方块就计入,因此封闭空腔内的面也算,结果不等同于仅从外界可见的外表面积。

方向0至5依次为正X、负X、正Y、负Y、正Z、负Z [(1, 1, 1), (1, 1, 2), (1, 2, 1), (2, 0, 1), (2, 1, 1), (2, 1, 2), (2, 2, 2), (2, 2, 3), (3, 1, 1), (3, 2, 1), (3, 2, 2)]

逐步推演

方块(1, 1, 1):未被邻块遮挡的方向编号[1, 3, 5],贡献3个面;其余3个面与相邻方块贴合,不再计为暴露面。

方块(1, 1, 2):未被邻块遮挡的方向编号[1, 2, 3, 4],贡献4个面;其余2个面与相邻方块贴合,不再计为暴露面。

方块(1, 2, 1):未被邻块遮挡的方向编号[0, 1, 2, 4, 5],贡献5个面;其余1个面与相邻方块贴合,不再计为暴露面。

方块(2, 0, 1):未被邻块遮挡的方向编号[0, 1, 3, 4, 5],贡献5个面;其余1个面与相邻方块贴合,不再计为暴露面。

方块(2, 1, 1):未被邻块遮挡的方向编号[2, 5],贡献2个面;其余4个面与相邻方块贴合,不再计为暴露面。

方块(2, 1, 2):未被邻块遮挡的方向编号[0, 3, 4],贡献3个面;其余3个面与相邻方块贴合,不再计为暴露面。

方块(2, 2, 2):未被邻块遮挡的方向编号[1, 2, 5],贡献3个面;其余3个面与相邻方块贴合,不再计为暴露面。

方块(2, 2, 3):未被邻块遮挡的方向编号[0, 1, 2, 3, 4],贡献5个面;其余1个面与相邻方块贴合,不再计为暴露面。

方块(3, 1, 1):未被邻块遮挡的方向编号[0, 3, 4, 5],贡献4个面;其余2个面与相邻方块贴合,不再计为暴露面。

方块(3, 2, 1):未被邻块遮挡的方向编号[0, 1, 2, 5],贡献4个面;其余2个面与相邻方块贴合,不再计为暴露面。

方块(3, 2, 2):未被邻块遮挡的方向编号[0, 2, 3, 4],贡献4个面;其余2个面与相邻方块贴合,不再计为暴露面。

共12对相邻块,暴露面为6×11-2×12=42。

如何复核与应用

给每个面一个由所在平面和位置确定的标识,相邻块的共同面会出现两次,留下只出现一次的面即可。还可用六乘方块数减二乘相邻块对数作交叉核对。

若要只求与外部空气相通的面,还需要先从包围盒外部遍历空气,封闭空腔应排除。本篇计算的是没有实体邻块的所有面,保留这个区别可以避免两个正确程序因为统计口径不同而看似矛盾。

这是一套明确限定的教学模型,实际作品可能采用其他约定。记录实验时,保留原始输入、每步状态以及规则版本;调整一个条件后重新演算,并检查起点、终点、重复输入和刚好位于边界的情况,才能知道差异来自设计还是计算。