使用Python的pygame库实现迷宫游戏
使用Python的pygame库实现迷宫游戏
关于Python中pygame游戏模块的安装使用可见 https://blog.csdn.net/cnds123/article/details/119514520
先给出效果图:

这个游戏每次运行能自动随机生成迷宫布局。
在这个游戏中,玩家将使用键盘箭头键来移动,并且目标是从迷宫的左上角移动到右下角。
源码如下:
import pygame
import random
import time # 导入time模块用于移动延迟# 迷宫生成算法中使用的方向常量
UP = (0, -1)
DOWN = (0, 1)
LEFT = (-1, 0)
RIGHT = (1, 0)# 初始化pygame
pygame.init()# 设置迷宫的行数和列数
ROWS, COLS = 10, 10 #你可以根据需要调整迷宫的大小
# 设置每个单元格的大小
SIZE = 40
# 创建游戏窗口
WIN = pygame.display.set_mode((COLS * SIZE+2, ROWS * SIZE+2))
pygame.display.set_caption("迷宫游戏")# 设置颜色常量
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
GREEN = (0, 255, 0)
RED = (255, 0, 0)# 定义单元格类
class Cell:def __init__(self, row, col):self.row = rowself.col = colself.walls = {'top': True, 'right': True, 'bottom': True, 'left': True}self.visited = Falsedef draw(self, win):x = self.col * SIZEy = self.row * SIZEif self.visited:pygame.draw.rect(win, WHITE, (x, y, SIZE, SIZE))if self.walls['top']:pygame.draw.line(win, BLACK, (x, y), (x + SIZE, y), 2)if self.walls['right']:pygame.draw.line(win, BLACK, (x + SIZE, y), (x + SIZE, y + SIZE), 2)if self.walls['bottom']:pygame.draw.line(win, BLACK, (x + SIZE, y + SIZE), (x, y + SIZE), 2)if self.walls['left']:pygame.draw.line(win, BLACK, (x, y + SIZE), (x, y), 2)def remove_walls(self, next_cell):dx = next_cell.col - self.coldy = next_cell.row - self.rowif dx == 1:self.walls['right'] = Falsenext_cell.walls['left'] = Falseelif dx == -1:self.walls['left'] = Falsenext_cell.walls['right'] = Falseif dy == 1:self.walls['bottom'] = Falsenext_cell.walls['top'] = Falseelif dy == -1:self.walls['top'] = Falsenext_cell.walls['bottom'] = False# 迷宫生成算法
def generate_maze(rows, cols):# 创建单元格网格grid = [[Cell(row, col) for col in range(cols)] for row in range(rows)]# 随机选择一个单元格作为当前单元格current_cell = grid[random.randint(0, rows - 1)][random.randint(0, cols - 1)]current_cell.visited = True# 使用栈来跟踪单元格路径stack = [current_cell]while stack:# 获取当前单元格的未访问邻居neighbors = []for direction in [UP, DOWN, LEFT, RIGHT]:next_row = current_cell.row + direction[1]next_col = current_cell.col + direction[0]if (0 <= next_row < rows and0 <= next_col < cols andnot grid[next_row][next_col].visited):neighbors.append(grid[next_row][next_col])if neighbors:# 随机选择一个未访问的邻居next_cell = random.choice(neighbors)next_cell.visited = True# 移除墙壁current_cell.remove_walls(next_cell)# 将当前单元格压入栈stack.append(current_cell)# 将选择的邻居设置为当前单元格current_cell = next_cellelse:# 如果没有未访问的邻居,则回溯current_cell = stack.pop()return grid# 游戏循环
def main():clock = pygame.time.Clock()grid = generate_maze(ROWS, COLS)player_pos = [0, 0] # 玩家起始位置在左上角end_pos = [COLS - 1, ROWS - 1] # 结束位置在右下角move_delay = 0.2 # 移动延迟时间last_move = time.time()player_margin = 5 # 玩家边距end_margin = 5 # 结束位置边距# 游戏主循环running = Truewhile running:clock.tick(30)for event in pygame.event.get():if event.type == pygame.QUIT:running = Falsekeys = pygame.key.get_pressed()current_cell = grid[player_pos[1]][player_pos[0]]# 玩家移动逻辑if time.time() - last_move > move_delay:if keys[pygame.K_UP] and not current_cell.walls['top']:player_pos[1] -= 1last_move = time.time()if keys[pygame.K_DOWN] and not current_cell.walls['bottom']:player_pos[1] += 1last_move = time.time()if keys[pygame.K_LEFT] and not current_cell.walls['left']:player_pos[0] -= 1last_move = time.time()if keys[pygame.K_RIGHT] and not current_cell.walls['right']:player_pos[0] += 1last_move = time.time()# 游戏结束条件if player_pos == end_pos:print("恭喜你,成功到达终点!")running = False# 绘制迷宫和玩家WIN.fill(WHITE)for row in grid:for cell in row:cell.draw(WIN)# 绘制玩家#pygame.draw.rect(WIN, GREEN, (player_pos[0] * SIZE, player_pos[1] * SIZE, SIZE, SIZE))pygame.draw.rect(WIN, GREEN, (player_pos[0] * SIZE + player_margin, player_pos[1] * SIZE + player_margin, SIZE - 2 * player_margin, SIZE - 2 * player_margin))# 绘制结束位置#pygame.draw.rect(WIN, RED, (end_pos[0] * SIZE, end_pos[1] * SIZE, SIZE, SIZE))pygame.draw.rect(WIN, RED, (end_pos[0] * SIZE + end_margin, end_pos[1] * SIZE + end_margin, SIZE - 2 * end_margin, SIZE - 2 * end_margin))pygame.display.update()pygame.quit()if __name__ == "__main__":main()
这段代码首先定义了一个Cell类,用于表示迷宫中的单个单元格。迷宫生成算法使用了深度优先搜索算法来生成迷宫。每个单元格知道自己的位置以及哪些墙是存在的。generate_maze函数创建了一个单元格网格,并从一个随机单元格开始,追踪它的路径直到所有单元格都被访问过。最后,main函数包含了游戏的主循环,它不断地绘制迷宫并处理退出事件。
player_pos变量来跟踪玩家的位置,并在游戏循环中检查键盘输入来移动玩家。墙壁检查确保玩家不能穿过墙壁。游戏结束条件是当玩家到达迷宫的右下角结束位置时,会打印一条消息并退出游戏。
你可以根据需要调整迷宫的大小。
相关文章:
使用Python的pygame库实现迷宫游戏
使用Python的pygame库实现迷宫游戏 关于Python中pygame游戏模块的安装使用可见 https://blog.csdn.net/cnds123/article/details/119514520 先给出效果图: 这个游戏每次运行能自动随机生成迷宫布局。 在这个游戏中,玩家将使用键盘箭头键来移动&#x…...
Linux新手村必备!这些常用操作命令你掌握了吗?
在计算机的世界里,Linux操作系统以其强大的功能和灵活性受到了广大程序员和IT爱好者的喜爱。然而,对于初学者来说,Linux的操作命令可能会显得有些复杂和难以理解。 今天,我们就来一起探索一些Linux常用操作命令,让你的…...
ReactNative进阶(三十六):iPad横屏适配
文章目录 一、前言二、实现思路三、延伸阅读四、拓展阅读 一、前言 应用RN技术栈实现APP上线后,业务部门领导会上反馈未实现ipad横屏全屏展示,用户体验较差。由此,一场pad横屏全屏展示的APP调优工作由此开展。 二、实现思路 时间紧任务重&…...
jsx中使用插槽
1. jsx语法中使用插槽 以elementplus ElPopconfirm 为例 <el-popconfirm title"Are you sure to delete this?"><template #reference><el-button>Delete</el-button></template></el-popconfirm>使用 slots: {default: (dat…...
CentOS服务器拒绝SSH登录
当CentOS服务器拒绝SSH登录时,有几个可能的原因和解决方法: 检查网络连接:确保服务器与您的计算机之间的网络连接是正常的。您可以尝试使用其他网络连接或ping服务器以检查是否能够访问。 确认SSH服务正在运行:在服务器上确认SSH…...
React16源码: React中的completeUnitOfWork的源码实现
completeUnitOfWork 1 )概述 各种不同类型组件的一个更新过程对应的是在执行 performUnitOfWork 里面的 beginWork 阶段它是去向下遍历一棵 fiber 树的一侧的子节点,然后遍历到叶子节点为止,以及 return 自己 child 的这种方式在 performUni…...
uniapp移动端——企业微信H5调用jssdk实现扫一扫,通过weixin-java-cp获取ticket签名,配置config
背景: 使用企业微信开发扫一扫功能 可信域名验证 (1)企业微信的可信域名需要和企业微信的备案主体一致。 域名备案主体可通过站长工具查看域名备案主体。https://icp.chinaz.com/ 企业微信备案主体可以咨询管理员 (2)通过nginx配置域名归…...
【前端基础--1】
为后面爬虫打基础 使用Visual Studio Code(VS Code) https://code.visualstudio.com/#alt-downloads 网页基础 创建一个html网页 新建一个文件 文件名后缀.html 书写网页模板 html:5 回车键(或者Tab键)英文感叹号! 回…...
E2 Mysql的基本操作和用户权限
一、实验目的: 要求掌握Mysql平台的基本操作和基本的权限管理。 二、实验要求: 1、基本硬件配置:英特尔Pentium III 以上,大于4G内存; 2、软件要求:Mysql; 3、时间:4小时; 4、撰写实验报告并按时提交。 三、实验内容: Group 1: 安装Mys…...
TCP 的三次握手和四次挥手
Java 面试题 TCP 三次握手 第一次握手:客户端向服务端发送SYN包。报文中标志位SYN1,序列号seqx(x为随机整数)。此时客户端进入了 SYN_SEND 同步已发送状态。 第二次握手:服务端回复客户端SYNACK包。报文中标志位SYN1&…...
mybatisplus做SQL拦截添加自定义排序
前言 工作中写的一段代码,备个份,以后兴许能直接用 功能描述:如果前端传入了排序规则,则优先按传入的字段进行排序,SQL原有的排序规则追加到末尾 注:我们项目里的分页查询,是基于XML的SQL执行的…...
代码随想录算法训练营第29天(回溯算法05 | * 491.递增子序列 * 46.全排列 * 47.全排列 II
回溯算法part05 491.递增子序列解题思路与 90.子集II 不同的点回溯三部曲 46.全排列解题思路遇到的难点思考 47.全排列 II解题思路注意点拓展需要加深理解的点(需复习 小总结 491.递增子序列 本题和大家刚做过的90.子集II非常像,但又很不一样,…...
mac docker desktop被禁用了,如何使用虚拟机lima运行docker
安装lima brew install lima创建配置 echo "\\ndynamic:\n big-sur:\n image: docker://docker:git\n linux:\n image: docker.io/limasoftware/ubuntu:20.04 \\n" > ~/.lima/default.yaml启动名叫default的虚拟机 limactl start default测试 limactl …...
sublime text 开启vim模式
sublime text 开启vim模式 打开配置文件 mac下点击菜单栏 Sublime Text -> Settings... -> Settings 修改配置文件并保存 添加配置 // 开启vim模式 "ignored_packages": [// "Vintage", ], // 以命令模式打开文件 "vintage_start_in_comman…...
JS词法结构
编程语言的词法结构是一套基础性规则,用来描述如何使用这门语言来编写程序。作为语法的基础,它规定了诸如变量名是什么样的、怎么写注释,以及程序语句之间如何分隔等规则。 2.1程序的文本 JS区分大小写 JS忽略程序记号(token&am…...
程序媛的mac修炼手册-- 如何用Python节省WPS会员费
上篇分享了如何用微博爬虫,咱举例爬了女明星江疏影的微博数据。今天就用这些数据,给大家安利一下怎么用Python实现WPS中部分Excel付费功能。 MacOS系统自带的工具,绝大多数都非常顶,除Numbers外。当然,page比起word来&…...
ASP.NET Core NE8实现HTTP Upgrade和HTTP CONNECT代理服务器
看到一个文章[Go] 不到 100 行代码实现一个支持 CONNECT 动词的 HTTP 服务器 在NET8中如何实现 创建项目为MiniApi 编辑Program.cs文件。 var builder WebApplication.CreateSlimBuilder(args);var app builder.Build();// 将HTTP请求通过协议升级机制转为远程TCP请求&…...
apipost和curl收不到服务器响应的HTTP/1.1 404 Not Found
windows的apipost发送请求后,服务器响应了HTTP/1.1 404 Not Found,但是apipost一直显示发送中。 linux上的curl也一样。 使用wireshark抓包发现收到了响应,但是wireshark识别不了(图中是回应404后关闭了连接)ÿ…...
javascript:计算一个坐标数组的最小值点、最大值点、中心点
作者:CSDN _乐多_ 本文将介绍使用 javascript 语言计算一个坐标数组的最小值点、最大值点、中心点的代码。 文章目录 一、代码 一、代码 function calculateCenterPoint(points) {if (points.length 0) {return null;}let sumX 0;let sumY 0;let sumZ 0;for …...
使用远程工具连接Linux系统——使用Root用户登录
1、启动虚拟机,输入以下命令 进入root用户 sudo su或 su root修改ssh配置文件 vim /etc/ssh/sshd_config找到PermitRootLogin 并用#注释掉当前行 # PermitRootLogin prohibit-password添加: PermitRootLogin yes键入esc输入:wq保存退出 2、重启服…...
大数据在电力行业的应用案例解析 -【电力技术】(一)—— 基于电力大客户运营的大数据落地拓展
目录 一、电力大客户运营场景与大数据价值 二、大数据平台架构(大客户运营专用) 三、落地应用案例一:电力大客户价值分群与精准画像 1. 业务目标 2. 数据宽表(工程常用) 3. 核心算法:K-Means 用户分群(简化示例代码) 4. 应用效果 四、落地应用案例二:大客户负荷…...
揭秘联发科设备Bootloader解锁:mtkclient-gui实战指南与深度解析
揭秘联发科设备Bootloader解锁:mtkclient-gui实战指南与深度解析 【免费下载链接】mtkclient-gui GUI tool for unlocking bootloader and bypassing authorization on Mediatek devices (Not maintained anymore) 项目地址: https://gitcode.com/gh_mirrors/mt/m…...
以太网MAC与PHY接口技术详解
以太网PHY、MAC及其通信接口技术解析1. 以太网接口架构概述1.1 基本组成结构以太网接口电路从硬件角度可分为两大核心组件:MAC控制器(Media Access Control):负责数据链路层的媒体访问控制PHY芯片(Physical Layer&…...
ApiPost实战指南:从接口创建到自动化测试的全流程解析
1. 从零开始创建你的第一个API接口 作为一个常年和API打交道的开发者,我深知新手第一次接触接口工具时的迷茫。ApiPost作为一款国产的API开发工具,用起来确实比Postman更顺手,特别是对中文用户特别友好。下面我就带你一步步创建第一个接口&am…...
通用GUI编程技术——Win32 原生编程实战(十八)——GDI 设备上下文(HDC)完全指南
通用GUI编程技术——Win32 原生编程实战(十八)——GDI 设备上下文(HDC)完全指南 前面一系列文章我们聊了对话框、控件、资源这些内容,我们的窗口已经能够显示各种控件了。但你可能已经发现了一个问题:我们所…...
Django REST framework的应用场景
目录一、鉴权开发框架介绍二、Django REST framework是什么三、如何实现认证、权限与限流功能四、Django REST framework的应用场景一、鉴权开发框架介绍 鉴权开发框架是一种用于实现身份验证和授权的软件开发工具。它可以帮助开发者快速构建安全、可靠的身份验证和授权系统&a…...
告别云端推理:手把手教你用Vivado HLS在AX7350开发板上部署YOLOv3(附完整工程)
从零部署YOLOv3到AX7350开发板:FPGA加速实战全流程解析 在边缘计算领域,FPGA因其低延迟、高能效和可重构特性,成为深度学习模型部署的热门选择。本文将带您完成YOLOv3目标检测模型在AX7350开发板上的完整部署流程,从环境准备到最终…...
财务银行对账费时间?RPA自动对接流水,10分钟对完1个月账
RPA自动化银行对账的优势传统手工对账通常需要财务人员逐笔核对银行流水和企业账目,耗时费力且易出错。RPA(机器人流程自动化)技术可实现银行流水与企业账务系统的自动对接,大幅提升效率。10分钟完成1个月账目核对已成为现实。RPA…...
AI大模型岗位薪资揭秘:2026大模型岗位薪资,非常详细收藏我这一篇就够了
1. AI系统架构师 薪资范围:100万 - 200万/年 职位要求:需要具备全面的技术背景,精通系统架构设计,能够有效整合AI技术,提升系统性能。要求硕士及以上学历,计算机科学或相关专业背景。 目标院校࿱…...
Protege新手避坑指南:搞懂‘类’、‘属性’和‘推理’到底怎么用(附常见错误排查)
Protege新手避坑指南:搞懂‘类’、‘属性’和‘推理’到底怎么用(附常见错误排查) 第一次打开Protege时,满屏的术语和复杂的界面可能会让你感到不知所措。作为一款强大的本体编辑工具,Protege确实有着陡峭的学习曲线。…...
