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解决网站的反爬虫策略总结
Oct 26 Python
python实现list元素按关键字相加减的方法示例
Jun 09 Python
python基础学习之如何对元组各个元素进行命名详解
Jul 12 Python
python的中异常处理机制
Aug 30 Python
使用TensorFlow实现二分类的方法示例
Feb 05 Python
PyQt5 QTableView设置某一列不可编辑的方法
Jun 25 Python
通过python改变图片特定区域的颜色详解
Jul 15 Python
Mac安装python3的方法步骤
Aug 09 Python
基于python读取.mat文件并取出信息
Dec 16 Python
在pycharm中创建django项目的示例代码
May 28 Python
Python如何在main中调用函数内的函数方式
Jun 01 Python
python常见的占位符总结及用法
Jul 02 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
php 从数据库提取二进制图片的处理代码
2009/09/09 PHP
php之curl设置超时实例
2014/11/03 PHP
浅谈php提交form表单
2015/07/01 PHP
php封装的smarty类完整实例
2016/10/19 PHP
jQuery EasyUI API 中文文档 - ComboGrid 组合表格
2011/10/13 Javascript
在javascript中对于DOM的加强
2013/04/11 Javascript
jQuery cdn使用介绍
2013/05/08 Javascript
在JavaScript中使用JSON数据
2016/02/15 Javascript
三种方式实现瀑布流布局
2017/02/10 Javascript
js代码延迟一定时间后执行一个函数的实例
2017/02/15 Javascript
详解从Node.js的child_process模块来学习父子进程之间的通信
2017/03/27 Javascript
ionic2自定义cordova插件开发以及使用(Android)
2017/06/19 Javascript
详解vue父子组件间传值(props)
2017/06/29 Javascript
详解vue 实例方法和数据
2017/10/23 Javascript
javascript+jQuery实现360开机时间显示效果
2017/11/03 jQuery
AngularJS基于http请求实现下载php生成的excel文件功能示例
2018/01/23 Javascript
原生JS实现自定义下拉单选选择框功能
2018/10/12 Javascript
Js 利用正则表达式和replace函数获取string中所有被匹配到的文本(推荐)
2018/10/28 Javascript
ES5 模拟 ES6 的 Symbol 实现私有成员功能示例
2020/05/06 Javascript
基于Electron实现桌面应用开发代码实例
2020/07/07 Javascript
如何在JS文件中获取Vue组件
2020/09/16 Javascript
关于IDEA中的.VUE文件报错 Export declarations are not supported by current JavaScript version
2020/10/17 Javascript
基于elementUI竖向表格、和并列的案例
2020/10/26 Javascript
Flask框架中密码的加盐哈希加密和验证功能的用法详解
2016/06/07 Python
python+opencv实现阈值分割
2018/12/26 Python
Python新手如何进行闭包时绑定变量操作
2020/05/29 Python
解决pyinstaller打包运行程序时出现缺少plotly库问题
2020/06/02 Python
手工制作的豪华英式沙发和沙发床:Willow & Hall
2019/05/03 全球购物
介绍一下Mysql的存储引擎
2015/02/12 面试题
现在输入n个数字,以逗号,分开;然后可选择升或者降序排序;按提交键就在另一页面显示按什么排序,结果为,提供reset
2012/11/09 面试题
大宝sod蜜广告词
2014/03/21 职场文书
维稳工作承诺书
2015/01/20 职场文书
付款证明格式范文
2015/06/19 职场文书
幼儿园老师新年寄语
2015/08/17 职场文书
SpringBoot实现quartz定时任务可视化管理功能
2021/08/30 Java/Android
草系十大最强宝可梦,纸片人上榜,榜首大家最熟悉
2022/03/18 日漫