python实现的生成随机迷宫算法核心代码分享(含游戏完整代码)
作者:junjie 发布时间:2022-01-01 08:19:10
标签:python,迷宫算法
完整代码下载: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版在生成迷宫的过程中增加了随机处理,对应算法也稍微复杂一点点。
![](https://www.aspxhome.com/images/zang.png)
![](https://www.aspxhome.com/images/jiucuo.png)
猜你喜欢
- # -*- coding: utf-8 -*-# @Time : 2019-11-18 09:31# @Author : cxa# @Fil
- 一:threading VS Thread众所周知,python是支持多线程的,而且是native的线程,其中threading是对Thre
- 本文实例讲述了php面象对象数据库操作类。分享给大家供大家参考。具体实现代码如下://此处构造一个数据库操作类,封装所有数据库操作 //可以
- 方法一、os.system() 会保存可执行程序中的打印值和主函数的返回值,且会将执行过程中要打印的内容打印出来import os main
- 为什么要引入线程池如果在程序中经常要用到线程,频繁的创建和销毁线程会浪费很多硬件资源,所以需要把线程和任务分离。线程可以反复利用,省去了重复
- 近期,有小伙伴问我关于怎么使用python进行散点图的绘制,这个东西很简单,但是怎么讲相关性的值标注在图形上略显麻烦,因此,在这里记录一下,
- 一、噪声 我们将常会听到平滑(去噪),锐化(和平滑是相反的),那我们就会有疑惑?什么是噪声呢?图像噪声是指存在于图像数
- 1. 二维(多维)数组降为一维数组方法1: reshape()+concatenate 函数,这个方法是间接法,利用 reshape() 函
- 前言本文主要介绍的是关于python 3用BeautifulSoup抓取div标签的方法示例,分享出来供大家参考学习,下面来看看详细的介绍:
- 在JavaScript开发中,被人问到:null与undefined到底有啥区别?一时间不好回答,特别是undefined,因为这涉及到un
- 随着JS与XHTML的应用普及,越来越多的web界面应用技术出现在网站上,比如我们常见的日历控件,搜索下拉框等,这些web界面应用技术大大的
- PDO::errorInfoPDO::errorCode — 返回最后一次操作数据库的错误信息(PHP 5 >= 5.1.0, PEC
- [数据恢复故障描述]一台重要的MYSQL数据库服务器,146GB*2,RAID1,约130GB DATA卷,存储了大约200~300个数据库
- 排序,是许多编程语言中经常出现的问题。同样的,在Python中,如何是实现排序呢?(以下排序都是基于列表来实现)一、使用Python内置函数
- 标题pycharm专业版(python License Activate)python运行的环境大多数人用的比较多的是pycharm,但是很
- 1. 2D坐标轴1.1 绘制简单的曲线import matplotlib.pyplot as pltimport numpy as npx=
- Django分页功能的实现打开命令行窗口,创建Django工程,使用以下命令:django-admin startproject djpag
- 本文讲述了线程安全及Python中的GIL。分享给大家供大家参考,具体如下:摘要什么是线程安全? 为什么python会使用GIL的机制?在多
- 本文实例讲述了python装饰器常见使用方法。分享给大家供大家参考,具体如下:python 的装饰器,可以用来实现,类似spring AOP
- 一、Cookie的使用1、什么是Cookie我们都知道,HTTP 协议是无状态的,也就是说,在一次请求响应结束后,服务端不会保留任何对方状态