目标
我的学校项目任务是用 OpenGL 制作迷宫。目前我正在考虑创建迷宫的算法,我想问你这是否是一个好方法,或者我应该以不同的方式实现它。这是我的想法,我会这样做:
算法
我的想法是,我将创建一个具有 isPresent
bool 属性的 block 类。然后我将创建另一个代表 map 的类。此类将有一个二维数组,比方说 100x100。在阵列的每个架子上,我希望有一堵墙,我将 isPresent
值设置为 1。
然后我将使用 for 循环渲染墙。我会遍历数组,当 isPresent
值为 1 时,我会渲染 GL_QUAD。
问题
这只是我的想法,但是我是初学者,所以请问是否可以使用?或者您希望如何进行?
您的建议应该可行,甚至可以通过仅使用评论中提到的 boolean 值来改进。
但是这样做你会受到很大的限制,因为封闭的 1x1 迷宫现在实际上需要 3x3 的网格(除了中间的之外都是墙)。这是可行的,但它会让你的算法更难设计路径,而且你基本上没有机会控制壁厚(在你的情况下,它总是和空白一样厚)。
要进行一些改进,您可以使用一个类来表示最多 4 面墙的空段,其中包含 4 个 boolean 值 leftClosed
、rightClosed
、topClosed
,底部关闭
。当然你可以做 float[width][height][4]
。这会产生一些数据开销,但它使设计和提取墙变得非常容易。
基本绘图将是为每个段中的每面墙绘制一个矩形。由于有些是重复的,您可以只绘制所有顶墙和所有左墙。异常(exception)情况是最底部的行和最右侧的列也需要绘制底部和右侧的墙壁。 (原因是 segment[x][y].right
和 segment[x+1][y].left
是同一堵墙所以最好画只是其中之一)。
一个更高级的过程是生成“路径”。您基本上可以从任何位置开始,然后继续附加顶点数据。作为伪代码,使用如下术语:
while(currentSegment != initialSegment && currentHeading != initialHeading)
if currentSegment.blocked(currentHeading) {
currentHeading = currentHeading.turnClockwise()
} else {
currentSegment = currentSegment.stepToward(currentHeading)
}
vertexData.appendToClockwiseHeading(currentHeading, currentSegment)
}
所以基本上你从任何地方开始,当你回到你开始的地方时你就完成了。您确实需要一个标题,就像向上移动一样,对吧……blocked
方法就像 case upwards: return topClosed
一样。顺时针转动只是改变旋转方式,就像从向上
转到向右
并再次向前迈进一样。显然可以从段和标题生成顶点数据; 向上
顺时针表示您正在绘制左侧墙。