在OpenGL中编码迷宫

时间:2018-04-04 13:10:29

标签: java algorithm opengl

目标

我的学校项目任务是在OpenGL中制作迷宫。目前我正在考虑创建迷宫的算法,我想问你这是否是一个好方法,或者我应该以不同的方式实现它。以下是我的想法,我会这样做:

算法

我的想法是,我会创建一个具有isPresent bool属性的块类。然后我会创建另一个代表地图的类。这个类有一个二维数组,比方说100x100。在阵列的每个架子上,我希望有一个墙,我会将isPresent值设置为1.

然后我会使用for循环渲染墙。我将遍历数组,isPresent值为1,我将渲染GL_QUAD。

问题

这只是我的想法,但我是初学者,所以请你告诉我它是否可用?或者你想怎么做?

1 个答案:

答案 0 :(得分:1)

您的建议应该有效,甚至可以通过仅使用评论中提到的布尔来改进。

然而这样做你将非常有限,因为封闭的1x1迷宫现在实际上需要3x3网格(所有都是墙,但是中间的)。它是可行的,但它会使你的算法设计路径更难,你基本上没有机会控制壁厚(在你的情况下,它总是像空的空间一样厚)。

为了获得一些改进,你可以拥有一个代表空片段的类,其中最多4个墙有4个布尔{​​{1}},leftClosedrightClosed,{{1} }。当然你可以做topClosed。这会产生一些数据开销,但它可以很容易地设计和提取墙壁。

基本绘图就是为每个段中的每个墙绘制一个矩形。由于有些是重复的,因此您只能绘制所有顶部和所有左侧墙壁。例外的是,最底部的行和最右边的列也需要绘制底部和右侧墙壁。 (原因是bottomClosedfloat[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意味着你要画左墙。