python实现的生成随机迷宫算法核心代码分享(含游戏完整代码)


Posted in Python onJuly 11, 2014

完整代码下载:http://xiazai.3water.com/201407/tools/python-migong.rar

最近研究了下迷宫的生成算法,然后做了个简单的在线迷宫游戏。游戏地址和对应的开源项目地址可以通过上面的链接找到。开源项目中没有包含服务端的代码,因为服务端的代码实在太简单了。下面将简单的介绍下随机迷宫的生成算法。一旦理解后你会发现这个算法到底有多简单。

1.将迷宫地图分成多个房间,每个房间都有四面墙。
2.让“人”从地图任意一点A出发,开始在迷宫里游荡。从A房间的1/2/3/4个方向中的任选一个方向前进。在从A房间走到B房间的过程中,推倒A/B房间之间的墙。
3.如果方向x对面的房间已经走过,则选择其他方向。如果所有方向的房间都已经走过,则退回上一个房间看是否还有可选道路。
4.走到真正无路可走时,说明已经走过了所有房间,迷宫也生成好了。

下面是该算法的python实现(核心部分)

def gen_map(self, max_x=10, max_y=10):
 """ 生成迷宫 """
 self.max_x, self.max_y = max_x, max_y # 设置地图大小
 self.mmap = [[None for j in range(self.max_y)] for i in range(self.max_x)] # 生成原始地图
 self.solution = [] # 迷宫解法
 block_stack = [Block(self, 0, 0)] # 从0,0开始生成迷宫(同时将这点作为起点),将起点放到栈里
 while block_stack:
  block = block_stack.pop() #取出当前所在的房间
  next_block = block.get_next_block() # 获取下一个要去的房间
  if next_block: # 如果成功获取下一走发,将走过的房间放回到栈里
   block_stack.append(block)
   block_stack.append(next_block)
   if next_block.x == self.max_x - 1 and next_block.y == self.max_y - 1: # 走到终点了,栈里的路径就是解法
    for o in block_stack:
     self.solution.append((o.x, o.y))
 
def get_next_block_pos(self, direction):
 """ 获取指定方向的房间号 """
 x = self.x
 y = self.y
 if direction == 0: # Top
  y -= 1
 elif direction == 1: # Right
  x += 1
 if direction == 2: # Bottom
  y += 1
 if direction == 3: # Left
  x -= 1
 return x, y
 
def get_next_block(self):
 """ 获取下一要去的房间 """
 directions = list(range(4))
 random.shuffle(directions) # 随机获取一个要去的方向
 for direction in directions:
  x, y = self.get_next_block_pos(direction)
  if x >= self.mmap.max_x or x < 0 or y >= self.mmap.max_y or y < 0: # 房间号在许可范围内
   continue
  if self.mmap.mmap[x][y]: # 如果已经走过
   continue
  self.walls[direction] = False
  return Block(self.mmap, x, y, direction)
 return None # 没找到有可用的房间

注: 由于采用该方法生成的迷宫道路的分支数量并不是太多,coffeescript版在生成迷宫的过程中增加了随机处理,对应算法也稍微复杂一点点。

Python 相关文章推荐
python 字典(dict)遍历的四种方法性能测试报告
Jun 25 Python
Python中的字典遍历备忘
Jan 17 Python
详解Python编程中time模块的使用
Nov 20 Python
详解Python编程中对Monkey Patch猴子补丁开发方式的运用
May 27 Python
python递归删除指定目录及其所有内容的方法
Jan 13 Python
Python中单、双下划线的区别总结
Dec 01 Python
Python Pandas找到缺失值的位置方法
Apr 12 Python
python中计算一个列表中连续相同的元素个数方法
Jun 29 Python
python:接口间数据传递与调用方法
Dec 17 Python
深入解析神经网络从原理到实现
Jul 26 Python
Python jieba库用法及实例解析
Nov 04 Python
Python基础教程(一)——Windows搭建开发Python开发环境
Jul 20 Python
python文件和目录操作函数小结
Jul 11 #Python
python实现的登陆Discuz!论坛通用代码分享
Jul 11 #Python
Python Socket编程入门教程
Jul 11 #Python
python使用正则搜索字符串或文件中的浮点数代码实例
Jul 11 #Python
Python实现的二维码生成小软件
Jul 11 #Python
让python同时兼容python2和python3的8个技巧分享
Jul 11 #Python
Python操作SQLite简明教程
Jul 10 #Python
You might like
深入apache host的配置详解
2013/06/09 PHP
关于ob_get_contents(),ob_end_clean(),ob_start(),的具体用法详解
2013/06/24 PHP
php实现发送微信模板消息的方法
2015/03/07 PHP
php实现连接access数据库并转txt写入的方法
2017/02/08 PHP
基于jquery的跟随屏幕滚动代码
2012/07/24 Javascript
IE8对JS通过属性和数组遍历解析不一样的地方探讨
2013/05/06 Javascript
JavaScript实现继承的4种方法总结
2014/10/16 Javascript
百度UEditor编辑器如何关闭抓取远程图片功能
2015/03/03 Javascript
无缝滚动的简单实现代码(推荐)
2016/06/07 Javascript
javascript验证手机号和实现星号(*)代替实例
2016/08/16 Javascript
jQuery自适应轮播图插件Swiper用法示例
2016/08/24 Javascript
浅谈Node.js:理解stream
2016/12/08 Javascript
vue轮播图插件vue-awesome-swiper
2017/11/27 Javascript
微信小程序switch组件使用详解
2018/01/31 Javascript
vue2.0项目实现路由跳转的方法详解
2018/06/21 Javascript
js限制input只能输入有效的数字(第一个不能是小数点)
2018/09/28 Javascript
在vue中获取微信支付code及code被占用问题的解决方法
2019/04/16 Javascript
基于Proxy的小程序状态管理实现
2019/06/14 Javascript
Vuex 模块化使用详解
2019/07/31 Javascript
jquery实现弹窗(系统提示框)效果
2019/12/10 jQuery
js实现点击选项置顶动画效果
2020/08/25 Javascript
Python os模块中的isfile()和isdir()函数均返回false问题解决方法
2015/02/04 Python
Python Pandas找到缺失值的位置方法
2018/04/12 Python
python-str,list,set间的转换实例
2018/06/27 Python
对Python3.6 IDLE常用快捷键介绍
2018/07/16 Python
pandas进行时间数据的转换和计算时间差并提取年月日
2019/07/06 Python
KLOOK客路:发现更好玩的世界,预订独一无二的旅行体验
2016/12/16 全球购物
联想中国官方商城:Lenovo China
2017/10/18 全球购物
JD Sports比利时官网:英国领先的运动鞋和运动服饰零售商
2018/10/10 全球购物
《回乡偶书》教学反思
2014/04/12 职场文书
党员学习正风肃纪思想汇报
2014/09/12 职场文书
个人授权委托书范文
2014/09/21 职场文书
学习与创新自我评价
2015/03/09 职场文书
董事长致辞
2015/07/29 职场文书
Python max函数中key的用法及原理解析
2021/06/26 Python
教你利用Nginx 服务搭建子域环境提升二维地图加载性能的步骤
2021/09/25 Servers