基于Python的飞机大战复现

 
✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨

🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。

我是Srlua小谢,在这里我会分享我的知识和经验。🎥

希望在这里,我们能一起探索IT世界的奥妙,提升我们的技能。🔮

记得先点赞👍后阅读哦~ 👏👏

📘📚 所属专栏:传知代码论文复现

欢迎访问我的主页:Srlua小谢 获取更多信息和资源。✨✨🌙🌙

​​

​​

目录

一、游戏概述

二、游戏功能实现

(一)初始化设置

(二)游戏类定义

(三)游戏界面显示与逻辑

三、游戏运行流程

四、优化方向

部署方式

使用步骤


本文所有资源均可在该地址处获取。

一、游戏概述

本游戏是一款使用Python和Pygame库开发的飞机大战游戏。玩家操控飞机,通过发射子弹击落敌机来获取分数,同时需要躲避敌机的碰撞。游戏具有开始界面、游戏界面和结束界面,还包括计分、生命值管理、敌机生成等功能。原文链接

二、游戏功能实现

(一)初始化设置

  1. Pygame初始化
    • pygame.init():初始化Pygame库,这是使用Pygame进行游戏开发的第一步,它会初始化Pygame的各个模块,如显示、声音等。
  2. 屏幕设置
    • screen_width = 800screen_height = 600:定义了游戏屏幕的宽度和高度。
    • screen = pygame.display.set_mode((screen_width, screen_height)):创建了一个指定大小的游戏窗口。
  3. 游戏标题设置
    • pygame.display.set_caption('飞机大战'):设置了游戏窗口的标题为“飞机大战”。
  4. 颜色定义
    • 定义了WHITE = (255, 255, 255)(白色)、BLACK = (0, 0, 0)(黑色)、RED = (255, 0, 0)(红色)等颜色常量,用于后续绘制图形和文本。
  5. 图片加载与缩放
    • 尝试加载飞机、子弹、敌机、背景、开始背景和结束背景等图片,并进行缩放处理。如果图片加载失败,会打印错误信息并退出游戏。例如:
      • plane_image = pygame.image.load('plane.png').convert_alpha():加载飞机图片并转换为带透明通道的格式。
      • plane_image = pygame.transform.scale(plane_image, (80, 80)):将飞机图片缩放到80x80像素。
  6. 字体设置
    • font = pygame.font.SysFont(None, 36):设置了游戏中使用的字体,字体大小为36。

(二)游戏类定义

  1. 飞机类(Plane)
    • 初始化方法(__init__
      • super(Plane, self).__init__():调用父类(pygame.sprite.Sprite)的初始化方法。
      • self.image = plane_image:设置飞机的图像为加载和缩放后的飞机图片。
      • self.rect = self.image.get_rect(center=(screen_width/2, screen_height - 50)):获取飞机图像的矩形区域,并设置飞机的初始位置在屏幕底部中央。
      • self.speed = 5:定义飞机的移动速度为5像素/帧。
      • self.lives = 3:设置飞机的初始生命值为3。
    • 移动方法(move_upmove_downmove_leftmove_right
      • 例如move_up方法中,self.rect.y -= self.speed实现飞机向上移动,通过改变飞机矩形区域的y坐标来实现移动效果,其他移动方法类似,只是改变坐标的方向不同。
  2. 子弹类(Bullet)
    • 初始化方法(__init__
      • 同样先调用父类初始化方法。
      • self.image = bullet_image:设置子弹的图像。
      • self.rect = self.image.get_rect(center=(x, y)):根据传入的坐标设置子弹的初始位置(这里的xy在创建子弹实例时传入,通常是飞机的位置)。
      • self.speed = 10:设置子弹的移动速度为10像素/帧。
    • 更新方法(update
      • self.rect.y -= self.speed:使子弹向上移动。
      • if self.rect.y < 0: self.kill():当子弹移出屏幕顶部时,从精灵组中移除子弹。
  3. 敌机类(Enemy)
    • 初始化方法(__init__
      • 调用父类初始化方法。
      • self.image = enemy_image:设置敌机的图像。
      • self.rect = self.image.get_rect(center=(random.randint(0, screen_width), -50)):随机设置敌机的初始位置在屏幕上方的随机水平位置。
      • self.speed = random.randint(1, 3):随机设置敌机的移动速度在1到3像素/帧之间。
    • 更新方法(update
      • self.rect.y += self.speed:使敌机向下移动。
      • if self.rect.y > screen_height: self.kill():当敌机移出屏幕底部时,从精灵组中移除敌机。
  4. 按钮类(Button)
    • 初始化方法(__init__
      • 定义按钮的位置(xy)、大小(widthheight)、颜色(color)和文本(text)等属性。
      • self.text_rect = font.render(self.text, True, WHITE):渲染按钮上的文本。
    • 绘制方法(draw
      • pygame.draw.rect(surface, self.color, (self.x, self.y, self.width, self.height)):在指定表面(surface)上绘制按钮的矩形。
      • surface.blit(self.text_rect, (self.x + (self.width / 2) - (self.text_rect.get_width() / 2), self.y + (self.height / 2) - (self.text_rect.get_height() / 2))):将按钮文本绘制在按钮矩形的中心位置。
    • 点击检测方法(is_clicked
      • 当鼠标点击事件发生时,判断点击位置是否在按钮范围内,如果是则返回True,否则返回False

(三)游戏界面显示与逻辑

  1. 显示开始界面(show_start_screen函数)
    • 创建一个循环,不断绘制开始背景图和开始按钮,直到玩家点击开始按钮。
    • 处理退出事件(pygame.QUIT),如果玩家点击关闭窗口,则退出游戏。
    • 当玩家点击开始按钮时,结束循环,进入游戏主循环。
  2. 显示结束界面(show_end_screen函数)
    • 不断绘制结束背景图、“Game Over”文本、得分文本和重试按钮。
    • 处理退出事件和重试按钮点击事件,如果玩家点击重试按钮,则返回游戏主循环重新开始游戏,否则保持在结束界面。
  3. 游戏主循环
    • 事件处理
      • 处理退出事件,当玩家点击关闭窗口时,结束游戏循环。
      • 获取键盘按键状态,根据按键控制飞机的移动(如按下上箭头键调用plane.move_up方法等)。
    • 自动射击
      • 通过pygame.time.get_ticks()获取当前时间,当满足一定时间间隔(每500毫秒,这里通过current_time % 500 < 50判断)时,创建一颗子弹并添加到子弹精灵组。
    • 背景绘制
      • screen.blit(background_image, (0, 0)):在屏幕上绘制背景图。
    • 飞机绘制与位置更新
      • screen.blit(plane.image, plane.rect):在屏幕上绘制飞机。
    • 敌机生成与更新
      • 随机生成敌机(概率为1%,通过random.randint(0, 100) < 1判断),并添加到敌机精灵组。
      • 调用enemies.update()更新敌机的位置。
    • 子弹更新
      • 调用bullets.update()更新子弹的位置。
    • 碰撞检测
      • 检测飞机与敌机的碰撞,如果碰撞,飞机生命值减1,重置飞机位置。如果飞机生命值小于等于0,显示结束界面,重置分数、清空敌机和子弹精灵组、恢复飞机生命值并显示开始界面。
      • 检测子弹与敌机的碰撞,如果碰撞,移除敌机和子弹,增加分数。同时更新最高分显示。
    • 得分与生命值显示
      • 渲染得分文本和生命值文本,并在屏幕上绘制显示。
    • 屏幕更新与帧率控制
      • pygame.display.flip():更新屏幕显示。
      • pygame.time.Clock().tick(60):控制游戏帧率为60帧/秒。

三、游戏运行流程

  1. 游戏开始时,显示开始界面,等待玩家点击“Start”按钮。
  2. 玩家点击开始按钮后,进入游戏主循环。
    • 在游戏主循环中,不断处理用户输入、更新游戏状态(飞机、敌机、子弹位置等)、进行碰撞检测、绘制游戏画面(背景、飞机、敌机、子弹、得分、生命值等)。
    • 当飞机生命值耗尽或玩家关闭游戏窗口时,游戏结束,显示结束界面,玩家可以选择重试或关闭游戏。
  3. 如果玩家在结束界面点击“Retry”按钮,游戏重新从开始界面开始。

四、优化方向

  1. 增加音效:可以为射击、爆炸、获取奖励等事件添加音效,增强游戏的沉浸感。例如使用pygame.mixer模块加载和播放音效文件。
  2. 敌机多样化:设计不同类型的敌机,具有不同的外观、速度、生命值和攻击方式,增加游戏难度和趣味性。
  3. 游戏道具多样化:除了现有的生命值、超级子弹、炸弹奖励外,还可以添加其他道具,如护盾、双倍得分等。
  4. 关卡设计:设计多个关卡,每个关卡有不同的背景、敌机生成频率和难度,玩家通过完成一关进入下一关,增加游戏的挑战性和耐玩性。
  5. 优化碰撞检测算法:目前的碰撞检测可能存在一定的性能开销,可以考虑使用更高效的碰撞检测算法,如基于空间划分(如四叉树)的算法,提高游戏性能。
  6. 增加游戏暂停功能:在游戏过程中,玩家可以暂停游戏,以便在需要时休息或处理其他事情。
  7. 改善画面效果:可以进一步优化图片资源,添加动画效果(如飞机爆炸动画、敌机飞行动画等),提升游戏的视觉效果。
  8. 适配不同屏幕分辨率:目前游戏窗口大小固定,可以增加代码来适应不同的屏幕分辨率,使游戏在更多设备上有更好的显示效果。

部署方式

在这里描述您的服务详细部署方式以及运行环境参数,配置清单等

使用步骤

在这里描述您的程序使用步骤以及详细过程

 ​​

希望对你有帮助!加油!

若您认为本文内容有益,请不吝赐予赞同并订阅,以便持续接收有价值的信息。衷心感谢您的关注和支持!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【趣味】斗破苍穹修炼文字游戏HTML,CSS,JS

目录 图片展示 游戏功能 扩展功能 完整代码 实现一个简单的斗破苍穹修炼文字游戏&#xff0c;你可以使用HTML、CSS和JavaScript结合来构建游戏的界面和逻辑。以下是一个简化版的游戏框架示例&#xff0c;其中包含玩家修炼的过程、增加修炼进度和显示经验值的基本功能。 图片…

005 MATLAB符号微积分

前言&#xff1a; 在MATLAB中&#xff0c;数值与符号的主要区别在于它们的处理方式和应用场景 数值计算适用于实际的数值计算问题&#xff0c;如矩阵运算、数据分析等。符号计算适用于符号推导、公式化简和符号解析&#xff0c;如理论物理和工程计算。 01 符号对象 1.基本符…

Android 13 编译Android Studio版本的Launcher3

Android 13 Aosp源码 源码版本Android Studio版本Launcher3QuickStepLib (主要代码) Launcher3ResLib(主要资源)Launcher3IconLoaderLib(图

Ubuntu交叉编译 opencv for QNX

前言 在高通板子上开发一些程序的时候,会用到opencv帮助处理一下图像数据,高通车载板子sa8155和sm8295都有QNX os,需要交叉编译opencv的库,(这个交叉编译真是搞得我太恶心了,所以进行一个记录和分享) 搜了很多资料,有些太过于复杂,有些也存在错误导致最后没有编译成…

NVR监测软件EasyNVR多个NVR同时管理:录播主机的5条常见问题与解决办法

视频监控广泛应用于城市治安、交通管理、商业安保及家庭监控等领域。在使用EasyNVR平台管理多个NVR设备时&#xff0c;尤其是涉及到海康录播主机的场景中&#xff0c;使用者可能会遇到一些常见问题。本文将探讨海康录播主机的五个常见问题及其解决办法。 1、海康录播主机的5条常…

力扣刷题TOP101:6.BM7 链表中环的入口结点

目录&#xff1a; 目的 思路 复杂度 记忆秘诀 python代码 目的 {1,2},{3,4,5}, 3 是环入口。 思路 这个任务是找到带环链表的环入口。可以看作是上一题龟兔赛跑&#xff08;Floyd 判圈算法&#xff09;的延续版&#xff1a;乌龟愤愤不平地举报兔子跑得太快&#xff0c;偷偷…

网关: 用途和产品对比

概述 微服务中的有一个非常关键的组件: API网关 和配置中心一样&#xff0c;在没有采用微服务架构的时候 我们可以自己搭建自己的API网作作为统一的 API 出口和安全验证 在微服务架构之下&#xff0c;服务被拆的非常的零散&#xff0c;在降低了耦合度的同时 也给服务的统一…

Java ConcurrentHashMap

Java Map本质不是线程安全的&#xff0c;HashTable和Collections同步包装器&#xff08;Synchronized Wrapper&#xff09;在并发场景下性能低。Java还为实现 Map 的线程安全提供了并发包&#xff0c;保证线程安全的方式从synchronize简单方式到精细化&#xff0c;比如Concurre…

Spring 自调用事务失效分析及解决办法

前言 博主在写公司需求的时候&#xff0c;有一个操作涉及到多次对数据库数据的修改。当时就想着要加 Transactional注解来声名事务。并且由于一个方法中有太多行了&#xff0c;于是就想着修改数据库的操作单独提取出来抽象成一个方法。但这个时候&#xff0c;IDEA 提示我自调用…

【LeetCode每日一题】——189.轮转数组

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【题目进阶】八【解题思路】九【时空频度】十【代码实现】十一【提交结果】 一【题目类别】 数组 二【题目难度】 中等 三【题目编号】 189.轮转数组 四【题目描述】 …

Spark基本命令详解

文章目录 Spark基本命令详解一、引言二、Spark Core 基本命令1、Transformations&#xff08;转换操作&#xff09;1.1、groupBy(func)1.2、filter(func) 2、Actions&#xff08;动作操作&#xff09;2.1、distinct([numTasks])2.2、sortBy(func, [ascending], [numTasks]) 三、…

AppFlow:支持飞书机器人调用百炼应用

AppFlow&#xff1a;支持飞书机器人调用百炼应用 简介&#xff1a; 本文介绍了如何创建并配置飞书应用及机器人&#xff0c;包括登录飞书开发者后台创建应用、添加应用能力和API权限&#xff0c;以及通过AppFlow连接流集成阿里云百炼服务&#xff0c;最后详细说明了如何将机器…

基于vite创建一个脚手架(快速入门)

Vite是一种新型的前端构建工具&#xff0c;主要用于构建现代化的Web应用程序。以 原生ESM 方式提供源码。这实际上是让浏览器接管了打包程序的部分工作&#xff1a;Vite 只需要在浏览器请求源码时进行转换并按需提供源码。根据情景动态导入代码&#xff0c;即只在当前屏幕上实际…

学习ASP.NET Core的身份认证(基于Session的身份认证1)

ASP.NET Core使用Session也可以实现身份认证&#xff0c;关于Session的介绍请见参考文献5。基于Session的身份认证大致原理就是用户验证成功后将用户信息保存到Session中&#xff0c;然后在其它控制器中从Session中获取用户信息&#xff0c;用户退出时清空Session数据。百度基于…

视觉语言模型(VLM)学习笔记

目录 应用场景举例 VLM 的总体架构包括&#xff1a; 深度解析&#xff1a;图像编码器的实现 图像编码器&#xff1a;视觉 Transformer 注意力机制 视觉-语言投影器 综合实现 训练及注意事项 总结 应用场景举例 基于文本的图像生成或编辑&#xff1a;你输入 “生成一张…

spider--某站搜索--自动化dp

免责声明&#xff1a;本文仅作分享&#xff01; 自动化&#xff1a; DrissionPage DrissionPage官网 import time from DrissionPage import ChromiumPage,ChromiumOptions import pandas as pd# 这里配置了浏览器路径&#xff0c;不配置的话直接 page ChromiumPage() co Ch…

学成在线day07

视频处理 技术方案 掌握了xxl-job的分片广播调度方式&#xff0c;下边思考如何分布式去执行学成在线平台中的视频处理任务。 任务添加成功后&#xff0c;对于要处理的任务会添加到待处理任务表中&#xff0c;现在启动多个执行器实例去查询这些待处理任务&#xff0c;此时如何…

vsftpd 的安装和应用(超详细!!!)

FTP&#xff08;File Transfer Protocol&#xff0c;文件传输协议&#xff09;是一种用于在计算机网络上进行文件传输的标准协议。它允许用户从一台计算机向另一台计算机上传或下载文件。FTP的工作原理涉及到客户端和服务器之间的交互&#xff0c;以及数据传输的过程。 一、FT…

学习笔记:黑马程序员JavaWeb开发教程(2024.11.29)

10.5 案例-部门管理-新增 如何接收来自前端的数据: 接收到json数据之后&#xff0c;利用RequestBody注解&#xff0c;将前端响应回来的json格式的数据封装到实体类中 对代码中Controller层的优化 发现路径中都有/depts&#xff0c;可以将每个方法对应请求路径中的…

基于Java的小程序电商商城开源设计源码

近年来电商模式的发展越来越成熟&#xff0c;基于 Java 开发的小程序电商商城开源源码&#xff0c;为众多开发者和企业提供了构建个性化电商平台的有力工具。 基于Java的电子商城购物平台小程序的设计在手机上运行&#xff0c;可以实现管理员&#xff1b;首页、个人中心、用户…