最新用 Python 制作一个迷宫游戏,2024年最新关于Python开发的面试经验总结

最后

不知道你们用的什么环境,我一般都是用的Python3.6环境和pycharm解释器,没有软件,或者没有资料,没人解答问题,都可以免费领取(包括今天的代码),过几天我还会做个视频教程出来,有需要也可以领取~

给大家准备的学习资料包括但不限于:

Python 环境、pycharm编辑器/永久激活/翻译插件

python 零基础视频教程

Python 界面开发实战教程

Python 爬虫实战教程

Python 数据分析实战教程

python 游戏开发实战教程

Python 电子书100本

Python 学习路线规划

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

[1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1]

[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]

[1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1]

[1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1]

[1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1]

[1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1]

[1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1]

[1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0]

[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]

走出迷宫

得到了迷宫的地图,接下来就按照我们文首的思路来走迷宫即可。主要函数逻辑如下:

def dfs(self, x, y, path, visited=[]):

outOfIndex

if self.is_out_of_index(x, y):

return False

visited or is wall

if [x, y] in visited or self.get_value([x, y]) == 1:

return False

visited.append([x, y])

path.append([x, y])

end…

if x == self.width - 2 and y == self.height - 2:

return True

recursive

for i in range(4):

if 0 < x + self.dx[i] < self.width - 1 and 0 < y + self.dy[i] < self.height - 1 and

self.get_value([x + self.dx[i], y + self.dy[i]]) == 0:

if self.dfs(x + self.dx[i], y + self.dy[i], path, visited):

return True

elif not self.is_out_of_index(x, y) and path[-1] != [x, y]:

path.append([x, y])

很明显,这就是一个典型的递归程序。当该节点坐标越界、该节点被访问过或者该节点是墙壁的时候,直接返回,因为该节点肯定不是我们要找的路径的一部分,否则就将该节点加入被访问过的节点和路径的集合中。

然后如果该节点是出口则表示程序执行结束,找到了通路。不然就遍历四个方向向量,将节点的邻路传入函数 dfs 继续以上步骤,直到找到出路或者程序所有节点都遍历完成。

来看看我们 dfs 得出的路径结果:

[[0, 1], [1, 1], [2, 1], [3, 1], [4, 1], [5, 1], [6, 1], [7, 1], [8, 1], [9, 1], [9, 1], [8, 1], [7, 1], [6, 1], [5, 1], [5, 2], [5, 3], [6, 3], [7, 3], [8, 3], [9, 3], [9, 4], [9, 5], [9, 5], [9, 4], [9, 3], [8, 3], [7, 3], [7, 4], [7, 5], [7, 5], [7, 4], [7, 3], [6, 3], [5, 3], [4, 3], [3, 3], [2, 3], [1, 3], [1, 3], [2, 3], [3, 3], [3, 4], [3, 5], [2, 5], [1, 5], [1, 6], [1, 7], [1, 8], [1, 9], [1, 9], [1, 8], [1, 7], [1, 6], [1, 5], [2, 5], [3, 5], [3, 6], [3, 7], [3, 8], [3, 9], [3, 9], [3, 8], [3, 7], [3, 6], [3, 5], [3, 4], [3, 3], [4, 3], [5, 3], [5, 4], [5, 5], [5, 6], [5, 7], [6, 7], [7, 7], [8, 7], [9, 7], [9, 8], [9, 9], [10, 9]]

可视化

有了迷宫地图和通路路径,剩下的工作就是将这些坐标点渲染出来。今天我们用的可视化库是 pyxel,这是一个用来写像素级游戏的 Python 库,

当然使用前需要先安装下这个库。

Win 用户直接用 pip install -U pyxel命令安装即可。

Mac 用户使用以下命令安装:

brew install python3 gcc sdl2 sdl2_image gifsicle

pip3 install -U pyxel

先来看个简单的 Demo。

在这里插入图片描述

‘’’

遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025

寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!

‘’’

class App:

def init(self):

pyxel.init(160, 120)

self.x = 0

pyxel.run(self.update, self.draw)

def update(self):

self.x = (self.x + 1) % pyxel.width

def draw(self):

pyxel.cls(0)

pyxel.rect(self.x, 0, 8, 8, 9)

App()

类 App 的执行逻辑就是不断的调用 update 函数和 draw 函数,因此可以在 update 函数中更新物体的坐标,然后在 draw 函数中将图像画到屏幕即可。

如此我们就先把迷宫画出来,然后在渲染 dfs 遍历动画。

在这里插入图片描述

width, height = 37, 21

my_maze = Maze(width, height)

my_maze.generate()

class App:

def init(self):

pyxel.init(width * pixel, height * pixel)

pyxel.run(self.update, self.draw)

def update(self):

if pyxel.btn(pyxel.KEY_Q):

pyxel.quit()

if pyxel.btn(pyxel.KEY_S):

self.death = False

def draw(self):

draw maze

for x in range(height):

for y in range(width):

color = road_color if my_maze.map[x][y] is 0 else wall_color

pyxel.rect(y * pixel, x * pixel, pixel, pixel, color)

pyxel.rect(0, pixel, pixel, pixel, start_point_color)

pyxel.rect((width - 1) * pixel, (height - 2) * pixel, pixel, pixel, end_point_color)

App()

看起来还可以,这里的宽和高我分别用了 37 和 21 个像素格来生成,所以生成的迷宫不是很复杂,如果像素点很多的话就会错综复杂了。

接下里来我们就需要修改 update 函数和 draw 函数来渲染路径了。为了方便操作,我们在 init 函数中新增几个属性。

self.index = 0

self.route = [] # 用于记录待渲染的路径

self.step = 1 # 步长,数值越小速度越快,1:每次一格;10:每次 1/10 格

self.color = start_point_color

self.bfs_route = my_maze.bfs_route()

其中 index 和 step 是用来控制渲染速度的,在 draw 函数中 index 每次自增 1,然后再对 step 求余数得到当前的真实下标 real_index,简言之就是 index 每增加 step,real_index 才会加一,渲染路径向前走一步。

‘’’

遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025

寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!

‘’’

def draw(self):

draw maze

for x in range(height):

for y in range(width):

color = road_color if my_maze.map[x][y] is 0 else wall_color

pyxel.rect(y * pixel, x * pixel, pixel, pixel, color)

pyxel.rect(0, pixel, pixel, pixel, start_point_color)

pyxel.rect((width - 1) * pixel, (height - 2) * pixel, pixel, pixel, end_point_color)

if self.index > 0:

draw route

offset = pixel / 2

for i in range(len(self.route) - 1):

curr = self.route[i]

next = self.route[i + 1]

self.color = backtrack_color if curr in self.route[:i] and next in self.route[:i] else route_color

最后

🍅 硬核资料:关注即可领取PPT模板、简历模板、行业经典书籍PDF。
🍅 技术互助:技术群大佬指点迷津,你的问题可能不是问题,求资源在群里喊一声。
🍅 面试题库:由技术群里的小伙伴们共同投稿,热乎的大厂面试真题,持续更新中。
🍅 知识体系:含编程语言、算法、大数据生态圈组件(Mysql、Hive、Spark、Flink)、数据仓库、Python、前端等等。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值