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

作者:junjie 时间:2022-01-01 08:19:10 

完整代码下载: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实现(核心部分)


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,迷宫算法
0
投稿

猜你喜欢

  • 实例讲解如何配置MySQL数据库主从复制

    2008-12-17 15:33:00
  • JavaScript在ASP页面中实现掩码文本框效果代码

    2013-06-01 19:57:23
  • python实现字符串加密 生成唯一固定长度字符串

    2022-02-04 21:02:27
  • 如何基于python实现归一化处理

    2022-09-07 02:05:34
  • python实现LRU热点缓存及原理

    2022-01-08 01:26:15
  • Python爬虫使用脚本登录Github并查看信息

    2022-05-02 13:09:28
  • python中的 sorted()函数和sort()方法区别

    2022-04-13 05:16:11
  • Python计算程序运行时间的方法

    2023-08-09 09:53:50
  • Python基于回溯法子集树模板解决野人与传教士问题示例

    2023-07-14 04:36:05
  • python-sys.stdout作为默认函数参数的实现

    2022-11-23 02:50:35
  • 详解tf.device()指定tensorflow运行的GPU或CPU设备实现

    2021-03-25 19:39:27
  • python实现使用遗传算法进行图片拟合

    2022-05-25 03:31:53
  • Python 常用模块 re 使用方法详解

    2021-02-23 13:10:19
  • python翻译软件实现代码(使用google api完成)

    2023-05-19 17:25:43
  • 使用python批量读取word文档并整理关键信息到excel表格的实例

    2022-02-10 16:25:21
  • python matplotlib 绘图 和 dpi对应关系详解

    2023-12-11 18:13:43
  • 用 SA FileUp 上传多文件

    2008-07-04 13:44:00
  • Python学习之pip包管理工具的使用

    2023-07-24 11:01:57
  • ASP实例:使用ASP生成图片彩色校验码

    2009-01-20 16:27:00
  • 基于Opencv的图像卡通化实现代码

    2023-07-10 06:58:55
  • asp之家 网络编程 m.aspxhome.com