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读取ini文件、操作mysql、发送邮件实例
Jan 01 Python
python排序方法实例分析
Apr 30 Python
[原创]教女朋友学Python3(二)简单的输入输出及内置函数查看
Nov 30 Python
对python自动生成接口测试的示例讲解
Nov 30 Python
Python使用LDAP做用户认证的方法
Jun 20 Python
anaconda如何查看并管理python环境
Jul 05 Python
pandas如何处理缺失值
Jul 31 Python
python 并发编程 非阻塞IO模型原理解析
Aug 20 Python
python脚本实现mp4中的音频提取并保存在原目录
Feb 27 Python
Python 跨.py文件调用自定义函数说明
Jun 01 Python
Python pytesseract验证码识别库用法解析
Jun 29 Python
opencv 图像礼帽和图像黑帽的实现
Jul 07 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
星际争霸教主Flash的ID由来:你永远不会知道他之前的ID是www!
2019/01/18 星际争霸
一个用php实现的获取URL信息的类
2007/01/02 PHP
php cc攻击代码与防范方法
2012/10/18 PHP
PHP面向对象学习之parent::关键字
2017/01/18 PHP
读jQuery之二(两种扩展)
2011/06/11 Javascript
jquery mobile changepage的三种传参方法介绍
2013/09/13 Javascript
JavaScript程序开发之JS代码放置的位置
2016/01/15 Javascript
jquery实现一个简单的表单验证实例
2016/03/30 Javascript
12个非常实用的JavaScript小技巧【推荐】
2016/05/18 Javascript
BootStrap使用popover插件实现鼠标经过显示并保持显示框
2016/06/23 Javascript
微信小程序 合法域名校验出错详解及解决办法
2017/03/09 Javascript
Vue组件tree实现树形菜单
2017/04/13 Javascript
JavaScript基础之this详解
2017/06/04 Javascript
使用Angular 6创建各种动画效果的方法
2018/10/10 Javascript
Vue Router 实现动态路由和常见问题及解决方法
2020/03/06 Javascript
Vue性能优化的方法
2020/07/30 Javascript
[01:02]2014 DOTA2国际邀请赛中国区预选赛 现场抢先看
2014/05/22 DOTA
python使用多线程不断刷新网页的方法
2015/03/31 Python
Python简单格式化时间的方法【strftime函数】
2016/09/18 Python
Python with语句上下文管理器两种实现方法分析
2018/02/09 Python
Python的多维空数组赋值方法
2018/04/13 Python
pytorch实现CNN卷积神经网络
2020/02/19 Python
Python环境管理virtualenv&amp;virtualenvwrapper的配置详解
2020/07/01 Python
python利用蒙版抠图(使用PIL.Image和cv2)输出透明背景图
2020/08/04 Python
Python 可视化神器Plotly详解
2020/12/26 Python
html5指南-3.如何实现html元素拖拽功能
2013/01/07 HTML / CSS
美国著名的团购网站:Woot
2016/08/02 全球购物
企业面试题试卷附带答案
2015/12/20 面试题
Java程序员面试题
2013/07/15 面试题
学生学习总结的自我评价
2013/10/22 职场文书
生活小常识广播稿
2014/09/16 职场文书
村主任个人对照检查材料
2014/10/01 职场文书
导游带团欢迎词
2015/09/30 职场文书
Go语言操作数据库及其常规操作的示例代码
2021/04/21 Golang
Python实现单例模式的5种方法
2021/06/15 Python
三种方式清除vue路由跳转router-link的历史记录
2022/04/10 Vue.js