网站的暑期开发一个月 基本啥都没干 捣鼓XNA 做了一个3D的连连看

缘由是强化班的暑期实践课题,选了连连看来做。MFC太古老, 直接上XNA。平面没新意,3D才好玩。哈哈~~

这个算是自己做的最大的也是最完整的一个软件了,斗胆发到首页,要拍砖的可以把砖送给我自己拍。。。

开发环境 Visual Studio 2008 + XNA Game Studio 3.1 (顺带 3DS Max 2010 和 Adobe的一些工具)

软件命名 Zodiac  因为是十二星座风格的 

半成品软件可以去csdn下载 http://download.csdn.net/source/1495350

源代码点此下载  需要装XNA Game Studio 3.1额...

自认为做的还是很华丽丽的说~~~看看界面:

1 2

 

关于算法 平面的连连看算法没有仔细研究 直接想了下3D的算法

 

Code

 

平面和3D的规则是一样的:从一个方块按xy(z)方向不超过两个弯无障碍到达另外一个方块

整个大的连连看的定义是一个三维数组,不过由于个人喜好一般定义一维数组转换。假设一个连连看边长为N,即N*N*N大小,定义一维数组LLKBox[] boxes,长度为(N+2)*(N+2)*(N+2),这里声明的数组显示边长为N+2,可以理解为将整个连连看包裹在一个空心的方块中,以便于寻路操作。(不过也有不好的地方,就是大大的增大了数组长度。)

 

Code

 

连连看的算法基本可以分为两种:递归与非递归(貌似废话)。

简要介绍下递归思想:要使从box1到box2连通,那么从box1向xyz某一方向前进一格(暂且定义为box3),box3和box2必定要连通。如此将box1与box2连通的问题化为box3与box2连通的问题。按此递归直到box3=box1,递归完成。

采用递归方法寻路有些类似于深度优先搜索,在此使用递归虽然代码长度较短但性能不济,即使加上方向权重与自动剪枝,也不能在本质上解决性能问题,况且该方法不能解决找最短路径的问题,故在此舍弃使用。

非递归思想则是对两个方块在空间中的位置做分析,不同的情况使用不同的方法判断连通,并可以找到最短路径。

以下详细介绍非递归思想的算法。

两个方块在空间中的位置可以分为三种情况:
 

x(y z)轴方向上 X(Y Z)平行平面内 但不在一直线 空间中(不再一直线也不在一个面中)
line face 4

 

对三种情况分别作讨论

 

Code

 

 

x(y z)轴方向上  (仅对x轴方向的情况说明,y z轴方向同x轴)

示意图:
lin2

 

首先从Box1(x1, y, z)直线遍历到Box2(x2, y, z)   (图中黑色箭头表示)

若之间都为空,则两者连通且最短路即为两者的直接连线,无拐点,若不连通,进入下一个判断。

将box1,box2按照+y –y +z -z四个方向开始平移。如朝+y方向分别平移一格得到box1’(x1, y+1, z) box2’(x2, y+1, z),依次判断box1’ box2’是否为空,box1’与box1是否连通,box2’与box2是否连通,box1’与box2’是否连通,若全部满足,则已找到一条最短通路,两个拐点,若都不满足,则无通路。判断结束

 

Code

 

X(Y Z)平行平面内 但不在一直线 (仅对X平行平面的情况说明,Y Z平面同X平面)

示意图1:
 lin2e

计算得到Box1(x, y1, z1) Box2(x, y2, z2)所在矩形的另外两个顶点Box3(x, y1, z2) Box4(x, y2, z1),依次判断这两条路是否连通。若有一条路连通则找到最短路,一个拐点,若无,进入下个判断。

示意图2:
 linedsd

将某一条红色线段朝矩形内平移(分别平移y方向与z方向),分别计算两个中间节点是否为空与3条路是否连通,若都满足则找到一条通路且找到最短路,两个拐点,若无,进入下一个判断

示意图3:
lincce

将某一条红色线段朝举行外平移(+y –y +z -z方向分别平移),分别计算两个中间节点是否为空与3条路是否连通,若都满足则找到一条通路且找到最短路,两个拐点,若无,则两个方块之间无通路。判断结束。

 

Code

 

空间中(不再一直线也不在一个面中)

此种情况其实比较简单 判断方便。直接计算出Box1和Box2作为对角线定点的长方体的各个顶点和各条边,看能否找到一条通路即可。

 

Code

 

最后 Over~~~

 

            return null;
        }

 稍稍计算时间复杂度,控制在了平方范围内…还好啊…就是代码长度有点长…比较郁闷…

还有好多功能没有开发出来,比如提示之类的。提示是一件比较麻烦的事情,有空还得再想想…

 posted on 2009-07-20 02:12  步碎酒散花醉  阅读(5474)  评论(63编辑  收藏  举报