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 实现网上商城,转账,存取款等功能的信用卡系统
Jul 15 Python
Python将图片转换为字符画的方法
Jun 16 Python
Python使用tkinter库实现文本显示用户输入功能示例
May 30 Python
将Django项目部署到CentOs服务器中
Oct 18 Python
解决Django生产环境无法加载静态文件问题的解决
Apr 23 Python
用pytorch的nn.Module构造简单全链接层实例
Jan 14 Python
Python要如何实现列表排序的几种方法
Feb 21 Python
PyQt5中向单元格添加控件的方法示例
Mar 24 Python
python 字典item与iteritems的区别详解
Apr 25 Python
Python调用.net动态库实现过程解析
Jun 05 Python
python中selenium库的基本使用详解
Jul 31 Python
Python趣味挑战之教你用pygame画进度条
May 31 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静态文件生成类实例分析
2015/01/03 PHP
smarty中常用方法实例总结
2015/08/07 PHP
Smarty模板简单配置与使用方法示例
2016/05/23 PHP
PhpStorm 2020.3:新增开箱即用的PHP 8属性(推荐)
2020/10/30 PHP
window.open的功能全解析
2006/10/10 Javascript
不懂JavaScript应该怎样学
2008/04/16 Javascript
JS高级拖动技术 setCapture,releaseCapture
2011/07/31 Javascript
移动Web中图片自适应的两种JavaScript解决方法
2015/06/18 Javascript
浅谈jQuery.easyui的datebox格式化时间
2015/06/25 Javascript
微信小程序 WXDropDownMenu组件详解及实例代码
2016/10/24 Javascript
vue中渐进过渡效果实现
2016/10/27 Javascript
jstree单选功能的实现方法
2017/06/07 Javascript
纯JS实现只能输入数字的简单代码
2017/06/21 Javascript
jquery easyui如何实现格式化列
2017/07/30 jQuery
angular第三方包开发整理(小结)
2018/04/19 Javascript
vue项目实现github在线预览功能
2018/06/20 Javascript
ES6 class类链式继承,实例化及react super(props)原理详解
2020/02/15 Javascript
es6函数name属性功能与用法实例分析
2020/04/18 Javascript
在vue中使用Echarts画曲线图的示例
2020/10/03 Javascript
python实现发送和获取手机短信验证码
2016/01/15 Python
Python中%r和%s的详解及区别
2017/03/16 Python
Django进阶之CSRF的解决
2018/08/01 Python
python实现在cmd窗口显示彩色文字
2019/06/24 Python
使用python搭建服务器并实现Android端与之通信的方法
2019/06/28 Python
python实现将视频按帧读取到自定义目录
2019/12/10 Python
如何使用python切换hosts文件
2020/04/29 Python
python自定义函数def的应用详解
2020/06/03 Python
CSS3简单实现照片墙
2014/12/12 HTML / CSS
高中生自我鉴定范文
2013/10/30 职场文书
新闻专业本科生的自我评价分享
2013/11/20 职场文书
《月光启蒙》教学反思
2014/03/01 职场文书
学习礼仪心得体会
2014/09/01 职场文书
群众路线对照检查材料思想汇报怎么写
2014/09/18 职场文书
卖房授权委托书样本
2014/10/05 职场文书
骨干教师申报材料
2014/12/17 职场文书
三八红旗手主要事迹材料
2015/11/04 职场文书