使用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变量来跟踪玩家的位置,并在游戏循环中检查键盘输入来移动玩家。墙壁检查确保玩家不能穿过墙壁。游戏结束条件是当玩家到达迷宫的右下角结束位置时,会打印一条消息并退出游戏。

你可以根据需要调整迷宫的大小。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/644669.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入了解达梦数据库的增删查改操作:从入门到精通

目录 前言&#xff1a; 一.达梦数据库的增删改查 1.创建数据库 2.插入数据 3.查看数据 4.删除数据 5.数据 前言&#xff1a; 在当今数字化的时代&#xff0c;数据库已经成为企业和组织的核心资产&#xff0c;是实现高效数据处理、存储和管理的重要工具。达梦数据库&…

测试用例评审流程

1:评审的过程 A:开始前做好如下准备 1、确定需要评审的原因 2、确定进行评审的时机 3、确定参与评审人员 4、明确评审的内容 5、确定评审结束标准 6、提前至少一天将需要评审的内容以邮件的形式发送给评审会议相关人员。并注明详审时间、地点及偿参与人员等。 7、 在邮件中提醒…

科创板交易规则科普

一、交易时间&#xff1a; 交易日的上午9:30-11:30&#xff0c;下午13:00-15:00&#xff0c;其中9:15-9&#xff1a;25是开盘价公布以及竞价的时间&#xff0c;15:05-15:30是盘后固定价格交易时间。 二、买卖原则&#xff1a; 科创板实行T1交易&#xff0c;按照市场实时价格…

Linux运维实战:CentOS7.6操作系统(Shell脚本基础)

文章目录 第19章 Shell脚本基础19.1 Shell基本语法19.1.1 什么是Shell19.1.2 编程语言分类1.低级语言2.高级语言19.1.3 什么是Shell脚本19.2 Shell变量及运用19.2.1 Shell变量1.变量的设置规则如下2.按照变量的作用可以分成以下4类3.按照变量的作用域可以把变量分成两类:…

音乐证书通过率发布,市场对持有者需求旺盛

音乐证书的考试难度备受关注&#xff0c;通过率终于揭晓。据官方公布的数据&#xff0c;该证书的通过率相对较低&#xff0c;需要考生在音乐技能和表现方面有出色的表现。然而&#xff0c;持有音乐证书的人才在市场上需求旺盛&#xff0c;各种音乐机构和企业对其表现出强烈兴趣…

SpringBoot整合ElasticSearch实现分页查询

本文使用SpringBoot整合ElasticSearch实现分页查询 文章目录 环境准备分页查询方式一方式二 本文小结 环境准备 还是继续使用spring-boot-starter-data-elasticsearch来实现分页查询操作 <!-- spring-boot-starter-data-elasticsearch--> <dependency><groupId&…

基于SpringBoot + vue 的旅游景区网站系统设计与实现

目录 一、需求分析 二、技术分析 三、功能分析 四、数据设计 五、界面展示 六、资源获取 一、需求分析 旅游推荐网站是指提供旅游相关信息、服务和建议的在线平台。这些网站旨在帮助用户规划和安排旅行&#xff0c;提供目的地信息、酒店预订、机票预订、租车服务、旅行建…

antv/g6绘制数据流向图

antv/g6绘制数据流向图 前言接口模拟数据htmlts页面效果 前言 在业务开发中需要绘制数据流向图&#xff0c;由于echarts关系图的限制以及需求的特殊要求&#xff0c;转而使用antv/g6实现&#xff0c;本文以代码的方式实现数据流向需求以及节点分组,版本"antv/g6": “…

从零学习开发一个RISC-V操作系统(四)丨RISC-V汇编语言编程

本篇文章的内容 一、RISC-V汇编语言简介1.1 RISC-V 汇编语言的基本格式1.2 RISC-V 汇编指令操作对象1.3 RISC-V 汇编指令编码格式1.4 RISC-V 汇编指令分类 二、RISC-V汇编语言详解2.1 add 加法指令2.2 sub 减法指令 本系列是博主参考B站课程学习开发一个RISC-V的操作系统的学习…

linux条件判断练习

1.实现自动生成相应的压缩包 1.写一个脚本&#xff0c;完成如下功能 传递一个参数给脚本&#xff0c;此参数为gzip、bzip2或者xz三者之一&#xff1b; (1) 如果参数1的值为gzip&#xff0c;则使用tar和gzip归档压缩/etc目录至/backups目录中&#xff0c;并命名为/backups/etc-…

PPP协议原理介绍+报文分析+配置指导-RFC1661

个人认为&#xff0c;理解报文就理解了协议。通过报文中的字段可以理解协议在交互过程中相关传递的信息&#xff0c;更加便于理解协议。 因此本文将在PPP协议报文的基础上进行介绍。 关于PPP协议基本原理&#xff0c;可参考RFC1661-The Point-to-Point Protocol (PPP)。 关于P…

【JavaEE】文件操作 —— IO

文件操作 —— IO 1. 文件的属性 文件内容文件大小文件路径文件名称 2. 文件的管理 采用树形结构进行管理。 3. 文件路径 分为两种&#xff1a;相对、绝对路径。 相对路径&#xff1a;相对于当前位置的路径&#xff0c;以“./xxx.xxx”为标志绝对路径&#xff1a;以从盘符…

手动导入jar包到Maven的解决方案(简单有效!)

想要导入一个jar包到项目中&#xff0c;这个jar包在Maven中没有可以尝试以下方式。 第一步 先找到你maven的本地仓库&#xff0c;我的仓库就在这里&#xff0c;你可以根据你安装的maven找到你的目录 第二步 根据坐标创建文件夹。 这个依赖modbus4j.jar&#xff0c;Maven远…

PyQt ------ QTextEditor

PyQt ------ QTextEditor 引言正文示例1------进阶示例 引言 这里给大家介绍一下 PyQt6 中的 QTextEditor 组件用法。 正文 QTextEditor 可以进行多行字符串输出的组件。 想要获取 QTextEditor 组件中当前存放的字符串&#xff0c;需要使用&#xff1a; QTextEditor.toPla…

《GreenPlum系列》GreenPlum初级教程-GreenPlum详细入门教程

文章目录 GreenPlum详细入门教程第一章 GreenPlum介绍1.MPP架构介绍2.GreenPlum介绍3.GreenPlum数据库架构4.GreenPlum数据库优缺点 第二章 GreenPlum单节点安装1.Docker创建centos容器1.1 拉取centos7镜像1.2 创建容器1.3 进入容器1.4 容器和服务器免密操作1.4.1 生成密钥1.4.…

idea创建公用依赖包项目

创建parent项目 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/…

服务器管理平台(6)- Utils

Utils 本篇为服务器管理平台的结篇&#xff0c;讲述一些必要的Util&#xff0c;如钉钉告警、安全加密、远程登录等功能的实现 1、钉钉告警 1.1、SQL配置告警规则 逻辑磁盘容量已使用比例超过90% 超过30天未登录 字段名称字段类型解释Idint自增IDTablestring监测表名Metri…

matlab appdesigner系列-常用18-表格

表格&#xff0c;常用来导入外部表格数据 示例&#xff1a; 导入外界excel数据&#xff1a;data.xlsx 姓名年龄城市王一18长沙王二21上海王三56武汉王四47北京王五88成都王六23长春 操作步骤如下&#xff1a; 1&#xff09;将表格拖拽到画布上 2&#xff09;对app1右键进行…

GPSR路由算法的MATLAB实现

GPSR基于节点地理位置路由信息&#xff0c;采用贪婪策略和右手准则的结合在邻居节点中选择下一跳节点进行数据转发。节点在进行路由选择时&#xff0c;只需知道自己、邻居和目标节点的地理位置信息&#xff0c;无需维护全局网络的链路状态&#xff0c;这在很大程度上降低了网络…

高质量简历模板网站,免费、免费、免费

你们在制作简历时&#xff0c;是不是基本只关注两件事&#xff1a;简历模板&#xff0c;还有基本信息的填写。 当你再次坐下来更新你的简历时&#xff0c;可能会发现自己不自觉地选择了那个“看起来最好看的模板”&#xff0c;填写基本信息&#xff0c;却没有深入思考如何使简历…