python实现的生成随机迷宫算法核心代码分享(含游戏完整代码)
完整代码下载:http://xiazai.jb51.net/201407/tools/python-migong.rar
最近研究了下迷宫的生成算法,然后做了个简单的在线迷宫游戏。游戏地址和对应的开源项目地址可以通过上面的链接找到。开源项目中没有包含服务端的代码,因为服务端的代码实在太简单了。下面将简单的介绍下随机迷宫的生成算法。一旦理解后你会发现这个算法到底有多简单。
1.将迷宫地图分成多个房间,每个房间都有四面墙。
2.让“人”从地图任意一点A出发,开始在迷宫里游荡。从A房间的1/2/3/4个方向中的任选一个方向前进。在从A房间走到B房间的过程中,推倒A/B房间之间的墙。
3.如果方向x对面的房间已经走过,则选择其他方向。如果所有方向的房间都已经走过,则退回上一个房间看是否还有可选道路。
4.走到真正无路可走时,说明已经走过了所有房间,迷宫也生成好了。
下面是该算法的python实现(核心部分)
defgen_map(self,max_x=10,max_y=10): """生成迷宫""" self.max_x,self.max_y=max_x,max_y#设置地图大小 self.mmap=[[Noneforjinrange(self.max_y)]foriinrange(self.max_x)]#生成原始地图 self.solution=[]#迷宫解法 block_stack=[Block(self,0,0)]#从0,0开始生成迷宫(同时将这点作为起点),将起点放到栈里 whileblock_stack: block=block_stack.pop()#取出当前所在的房间 next_block=block.get_next_block()#获取下一个要去的房间 ifnext_block:#如果成功获取下一走发,将走过的房间放回到栈里 block_stack.append(block) block_stack.append(next_block) ifnext_block.x==self.max_x-1andnext_block.y==self.max_y-1:#走到终点了,栈里的路径就是解法 foroinblock_stack: self.solution.append((o.x,o.y)) defget_next_block_pos(self,direction): """获取指定方向的房间号""" x=self.x y=self.y ifdirection==0:#Top y-=1 elifdirection==1:#Right x+=1 ifdirection==2:#Bottom y+=1 ifdirection==3:#Left x-=1 returnx,y defget_next_block(self): """获取下一要去的房间""" directions=list(range(4)) random.shuffle(directions)#随机获取一个要去的方向 fordirectionindirections: x,y=self.get_next_block_pos(direction) ifx>=self.mmap.max_xorx<0ory>=self.mmap.max_yory<0:#房间号在许可范围内 continue ifself.mmap.mmap[x][y]:#如果已经走过 continue self.walls[direction]=False returnBlock(self.mmap,x,y,direction) returnNone#没找到有可用的房间
注:由于采用该方法生成的迷宫道路的分支数量并不是太多,coffeescript版在生成迷宫的过程中增加了随机处理,对应算法也稍微复杂一点点。