python利用matplotlib生成迷宫
起因
我想要写一个项目叫python迷宫游戏,需求是玩家能和机器对抗率先走出迷宫,至少要有两个等级的电脑。
慢慢来,首先迷宫游戏需要有一个迷宫并展示出来,这便是这篇博客的目的
假设迷宫使用0表示点,1表示墙,那么下面的代码主要使用深度优先搜索遍历所有的0
不过在下面的代码并不是这样的,比如在下面的代码(0, 0)表示点,两个点(0, 0)和(0, 1)的连线表示墙,这是因为plt.plot([x1, x2], [y1, y2], color="black")可以轻易画出两个点之间的连线
下面我会介绍我的每一块代码,首先导入需要的库
import sys
import matplotlib.pyplot as plt
from random import randint
sys.setrecursionlimit(height * width)是设置栈的最大深度防止递归写错占用太多内存
self.visited用来记录哪个点已经遍历了
self.edges用来记录要用到的墙,在一开始初始化时会把每个点与他周围的所有点连接生成墙的列表初始化,之后会利用规则删掉不需要的墙,然后就是成品地图了使用plt绘制即可
class Maze(object):
def __init__(self, height, width):
sys.setrecursionlimit(height * width)
self.HEIGHT = height #设置迷宫高
self.WIDTH = width #设置迷宫宽
self.visited = []
self.edges = set()
# 这个方法用来初始化点的列表
def initVisitedList(self):
for y in range(self.HEIGHT):
line = []
for x in range(self.WIDTH):
line.append(False)
self.visited.append(line)
下面两个方法用来初始化墙的列表,尝试把(0, 0)带入get_edges(self,x, y)很容易就能知道是初始化点旁边的哪4条边
def get_edges(self,x, y):
result = []
result.append((x, y, x, y + 1))
result.append((x + 1, y, x + 1, y + 1))
result.append((x, y, x + 1, y))
result.append((x, y + 1, x + 1, y + 1))
return result
def initEdgeList(self):
for x in range(self.WIDTH):
for y in range(self.HEIGHT):
cellEdges = self.get_edges(x, y)
for edge in cellEdges:
self.edges.add(edge)
这三个方法是为下面的一个方法准备的,看不懂可以先往下看
shuffle(self, dX, dY)目的是随机指定点往哪一边走(墙)
isValidPosition(self,x, y)用来判断点是否在self.visited中
getCommonEdge()用来判断应该删除哪一条边
def shuffle(self, dX, dY):
for t in range(4):
i = randint(0, 3)
j = randint(0, 3)
dX[i], dX[j] = dX[j], dX[i]
dY[i], dY[j] = dY[j], dY[i]
def isValidPosition(self,x, y):
if x < 0 or x >= self.WIDTH:
return False
elif y < 0 or y >= self.HEIGHT:
return False
else:
return True
def getCommonEdge(self, cell1_x, cell1_y, cell2_x, cell2_y):
edges1 = self.get_edges(cell1_x, cell1_y)
edges2 = set(self.get_edges(cell2_x, cell2_y))
for edge in edges1:
if edge in edges2:
return edge
return None
这个是最主要的逻辑,它用来得到成品的迷宫地图。它的输入DFS(self, X, Y, edgeList, visited)应该是这样的self.DFS(0, 0, self.edges, self.visited),self.edges是初始化后的边,self.visited是初始化后用来记录某个点是否被遍历过的列表
dX``dY共同代表了一个点上下左右4个方向,比如(1, 1)带入代码后的结果是(1, 0)``(1, 2)``(0, 1)``(2, 1)
def DFS(self, X, Y, edgeList, visited):
dX = [0, 0, -1, 1]
dY = [-1, 1, 0, 0]
self.shuffle(dX, dY)
for i in range(len(dX)):
nextX = X + dX[i]
nextY = Y + dY[i]
if self.isValidPosition(nextX, nextY):
if not visited[nextY][nextX]:
visited[nextY][nextX] = True
# 删除某一条线
commonEdge = self.getCommonEdge(X, Y, nextX, nextY)
if commonEdge in edgeList:
edgeList.remove(commonEdge)
# 使用深度优先搜索遍历每一个点
self.DFS(nextX, nextY, edgeList, visited)
把drawLine(self,x1, y1, x2, y2)方法带入下面的逻辑就可以画出迷宫图像了其中self.edges是经过DFS方法后得到的删除掉一些边后的列表
def drawLine(self,x1, y1, x2, y2):
plt.plot([x1, x2], [y1, y2], color="black")
for edge in self.edges:
self.drawLine(edge[0], edge[1], edge[2], edge[3])
我使用了generate_maze(self)整合了前面所有的方法以画出图片,这里只展示部分代码,因为我担心老师说我是抄的,完整的代码在这里plt_generate_maze
其实DFS得到的并不是完全的成品,它没有出口和入口,这一点也是在generate_maze中删掉两条线来完成的
def generate_maze(self):
plt.axis('equal')
plt.title('Maze')
#删除的代码部分在这里
plt.show()
在之后只要调用类设置迷宫宽高,再调用generate_maze方法就可以了
假如宽设置为60,高设置为40,迷宫图是这样的。

python利用matplotlib生成迷宫的更多相关文章
- python 利用matplotlib中imshow()函数绘图
matplotlib 是python最著名的2D绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地进行制图.而且也可以方便地将它作为绘图控件,嵌入GUI应用程序中.通过简单的绘图语 ...
- Python利用PIL生成随机验证码图片
安装pillow: pip install pillow PIL中的Image等模块提供了创建图片,制作图片的功能,大致的步骤就是我们利用random生成6个随机字符串,然后利用PIL将字符串绘制城图 ...
- Python调用matplotlib实现交互式数据可视化图表案例
交互式的数据可视化图表是 New IT 新技术的一个应用方向,在过去,用户要在网页上查看数据,基本的实现方式就是在页面上显示一个表格出来,的而且确,用表格的方式来展示数据,显示的数据量会比较大,但是, ...
- python中利用matplotlib绘图可视化知识归纳
python中利用matplotlib绘图可视化知识归纳: (1)matplotlib图标正常显示中文 import matplotlib.pyplot as plt plt.rcParams['fo ...
- python基础一 ------利用生成器生成一个可迭代对象
#利用生成器生成一个可迭代对象#需求:生成可迭代对象,输出指定范围内的素数,利用生成器产生一个可迭代对象#生成器:本身是可迭代的,只是 yield 好比return返回,yield返回后函数冻结状态, ...
- python利用决策树进行特征选择
python利用决策树进行特征选择(注释部分为绘图功能),最后输出特征排序: import numpy as np import tflearn from tflearn.layers.core im ...
- 获取博客积分排名,存入数据库,读取数据进行绘图(python,selenium,matplotlib)
该脚本的目的:获取博客的排名和积分,将抓取时间,排名,积分存入数据库,然后把最近的积分和排名信息进行绘图,查看积分或者排名的变化情况. 整个脚本的流程:是利用python3来编写,利用selnium获 ...
- canvas——随机生成迷宫
先上图. 效果 代码 随机生成迷宫要求任意两点都能够找到相同的路径,也就是说,迷宫是一个连通图.随机生成迷宫可以使用普里姆算法.广度优先算法.深度优先算法等实现.这里将使用普里姆算法通过生成最小数的方 ...
- matplotlib 生成 eps 插入到 tex
matplotlib 生成 eps 插入到 tex matplotlib 生成 eps,就可以插入到 tex 中,而且是矢量图,放大不失真. 而且因为图中的元素都是嵌入到 pdf 中,所以图中的文字也 ...
- Mac上实现Python用HTMLTestRunner生成html测试报告
一.导入HTMLTestRunnerNew文件 首先,我们要知道如果要利用HTMLTestRunnerNew生成测试报告的话,就需要对其进行导入: HTMLTestRunnerNew下载地址:链接:h ...
随机推荐
- Debian安装WPS的方法
1.防止安装失败,请尽量重启电脑,关闭系统的软件商店,因为商店的权限可能会锁住pkg的配置文件,导致无法安装wps. 2.将原机残废的WPS卸载干净,卸载方法:手动或命令行操作. sudo apt r ...
- Java多线程(7):JUC(上)
您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来- 前面把线程相关的生命周期.关键字.线程池(ThreadPool).ThreadLocal.CAS.锁和AQS都讲完了,现在就剩下怎么来用多线程了 ...
- android 代码分析
1.@Override注解 @Override 注解是用来指定方法重写的,只能修饰方法并且只能用于方法重写,不能修饰其它的元素. 作用是告诉编译器检查这个方法,保证父类要包含一个被该方法重写的方法,否 ...
- C#多线程之线程基础篇
目录 一.概念 二.原理 硬件结构 运行时 三.基础 创建与启动 传递参数 前台/后台线程 异常处理 中断与中止 中断(Interrupt) 中止(Abort) 协作取消模式 四.异步编程模式 异步编 ...
- Java开发学习(四十一)----MyBatisPlus标准数据层(增删查改分页)开发
一.标准CRUD使用 对于标准的CRUD功能都有哪些以及MyBatisPlus都提供了哪些方法可以使用呢? 我们先来看张图: 1.1 环境准备 这里用的环境就是Java开发学习(四十)----MyBa ...
- SolidEdge ST8安装教程
SolidEdge ST8安装教程: 1.使用百度云客户端下载Solidedge ST8软件安装包,打开软件安装文件夹: 2.选择.ISO安装文件,打开.ISO安装文件,可以解压或使用虚拟光驱加载: ...
- 面向对象进阶(static&继承)
今日分享:static and 继承 static: staic是修饰符 可以修饰方法和变量 变量: 被static修饰的变量称为静态变量 特点: 该类的所有对象都共享同一个静态变量:不属于 ...
- [Android开发学iOS系列] TableView展现一个list
TableView 基础 本文讲讲TableView的基本使用. 顺便介绍一下delegation. TableView用来做什么 TableView用来展示一个很长的list. 和Android中的 ...
- python贪心算法——以“修理牛棚”题目为例
[USACO1.3]修理牛棚 Barn Repair 题目描述 在一个月黑风高的暴风雨夜,Farmer John 的牛棚的屋顶.门被吹飞了 好在许多牛正在度假,所以牛棚没有住满. 牛棚一个紧挨着另一个 ...
- JS逆向实战9——cookies DES加密混淆
cookie加密 DES 混淆 目标网站:aHR0cHM6Ly90bGNoZW1zaG9wLnlvdXpoaWNhaS5jb20vbWFpbi90ZW5kP05vdGljZUNhdGVJZD0xJk5 ...