目标
我的学校项目任务是在OpenGL中制作迷宫。目前我正在考虑创建迷宫的算法,我想问你这是否是一个好方法,或者我应该以不同的方式实现它。以下是我的想法,我会这样做:
算法
我的想法是,我会创建一个具有isPresent
bool属性的块类。然后我会创建另一个代表地图的类。这个类有一个二维数组,比方说100x100。在阵列的每个架子上,我希望有一个墙,我会将isPresent
值设置为1.
然后我会使用for循环渲染墙。我将遍历数组,isPresent
值为1,我将渲染GL_QUAD。
问题
这只是我的想法,但我是初学者,所以请你告诉我它是否可用?或者你想怎么做?
答案 0 :(得分:1)
您的建议应该有效,甚至可以通过仅使用评论中提到的布尔来改进。
然而这样做你将非常有限,因为封闭的1x1迷宫现在实际上需要3x3网格(所有都是墙,但是中间的)。它是可行的,但它会使你的算法设计路径更难,你基本上没有机会控制壁厚(在你的情况下,它总是像空的空间一样厚)。
为了获得一些改进,你可以拥有一个代表空片段的类,其中最多4个墙有4个布尔{{1}},leftClosed
,rightClosed
,{{1} }。当然你可以做topClosed
。这会产生一些数据开销,但它可以很容易地设计和提取墙壁。
基本绘图就是为每个段中的每个墙绘制一个矩形。由于有些是重复的,因此您只能绘制所有顶部和所有左侧墙壁。例外的是,最底部的行和最右边的列也需要绘制底部和右侧墙壁。 (原因是bottomClosed
与float[width][height][4]
是同一墙,因此最好只绘制其中一个。)
更高级的程序正在生成"路径"。你基本上从任何位置开始,只是继续追加顶点数据。作为伪代码的术语如下:
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
一样,向前迈出的步伐也很简单。顶点数据显然可以从段和标题生成;顺时针方向upwards
意味着你要画左墙。