基于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. 适配不同屏幕分辨率:目前游戏窗口大小固定,可以增加代码来适应不同的屏幕分辨率,使游戏在更多设备上有更好的显示效果。

部署方式

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

使用步骤

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

 ​​

希望对你有帮助!加油!

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

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

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

相关文章

MR30分布式 IO 模块在冷却水泵系统中的卓越应用

在当今各类工业生产以及大型设施运行的场景中&#xff0c;冷却水泵系统起着至关重要的作用&#xff0c;它犹如保障整个运转体系顺畅运行的 “血液循环系统”&#xff0c;维持着设备适宜的温度环境&#xff0c;确保其稳定、高效地工作。而随着科技的不断发展&#xff0c;明达技术…

银河麒麟桌面系统——桌面鼠标变成x,窗口无关闭按钮的解决办法

银河麒麟桌面系统——桌面鼠标变成x&#xff0c;窗口无关闭按钮的解决办法 1、支持环境2、详细操作说明步骤1&#xff1a;用root账户登录电脑步骤2&#xff1a;导航到kylin-wm-chooser目录步骤3&#xff1a;编辑default.conf文件步骤4&#xff1a;重启电脑 3、结语 &#x1f49…

多线程常见问题集

一、多线程预防和避免线程死锁 如何预防死锁&#xff1f; 破坏死锁的产生的必要条件即可&#xff1a; 破坏请求与保持条件&#xff1a;一次性申请所有的资源。破坏不剥夺条件&#xff1a;占用部分资源的线程进一步申请其他资源时&#xff0c;如果申请不到&#xff0c;可以主动释…

Java ArrayList 与顺序表:在编程海洋中把握数据结构的关键之锚

我的个人主页 我的专栏&#xff1a;Java-数据结构&#xff0c;希望能帮助到大家&#xff01;&#xff01;&#xff01;点赞❤ 收藏❤ 前言&#xff1a;在 Java编程的广袤世界里&#xff0c;数据结构犹如精巧的建筑蓝图&#xff0c;决定着程序在数据处理与存储时的效率、灵活性以…

【第三方云音乐播放器SPlayer本地安装结合内网穿透打造个性化远程音乐库】

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” 文章目录 前言1. 安装Docker2. 创建并启动Splayer容器3. 本地访问测试4. 公网远程访问本地Splayer4.1 内网穿…

easyui combobox 只能选择第一个问题解决

easyui combobox 只能选择第一个问题解决 问题现象 在拆分开票的时候&#xff0c;弹出框上面有一个下拉框用于选择需要新增的明细行&#xff0c;但是每次只能选择到第一个 选择第二条数据的时候默认选择到第一个了 代码如下 /*新增发票编辑窗口*/function addTicketDialog…

从零开始:Linux 环境下的 C/C++ 编译教程

个人主页&#xff1a;chian-ocean 文章专栏 前言&#xff1a; GCC&#xff08;GNU Compiler Collection&#xff09;是一个功能强大的编译器集合&#xff0c;支持多种语言&#xff0c;包括 C 和 C。其中 gcc 用于 C 语言编译&#xff0c;g 专用于 C 编译。 Linux GCC or G的安…

transformer.js(三):底层架构及性能优化指南

Transformer.js 是一个轻量级、功能强大的 JavaScript 库&#xff0c;专注于在浏览器中运行 Transformer 模型&#xff0c;为前端开发者提供了高效实现自然语言处理&#xff08;NLP&#xff09;任务的能力。本文将详细解析 Transformer.js 的底层架构&#xff0c;并提供实用的性…

STM32 Keil5 attribute 关键字的用法

这篇文章记录一下STM32中attribute的用法。之前做项目的时候产品需要支持远程升级&#xff0c;要求版本只能向上迭代&#xff0c;不支持回退。当时想到的方案是把版本号放到bin文件的头部&#xff0c;设备端收到bin文件的首包部数据后判断是否满足升级要求&#xff0c;这里就可…

aws服务--机密数据存储KMS(1)介绍和使用

在AWS(Amazon Web Services)中存储机密数据时,安全性和合规性是最重要的考虑因素。AWS 提供了多个服务和工具,帮助用户确保数据的安全性、机密性以及合规性。AWS Secrets Manager、KMS(Key Management Service)是推荐的存储机密数据的AWS服务和最佳实践。这里先看KMS。 …

51c~C语言~合集2

我自己的原文哦~ https://blog.51cto.com/whaosoft/12652943 一、嵌入式开发中的C语言编译器 如果你和一个优秀的程序员共事&#xff0c;你会发现他对他使用的工具非常熟悉&#xff0c;就像一个画家了解他的画具一样。----比尔.盖茨1 不能简单的认为是个工具 嵌入式程序开发…

ensp静态路由实验

一、实验目的 1、熟练掌握交换机的基本配置命令 2、熟练掌握静态路由的使用方法 3. 熟练掌握交换机端口模式 二、实验内容 需求&#xff1a; 根据要求利用现有实验设备组建小型局域网 实验设备&#xff1a; 交换机S37002台&#xff1b;PC机2台&#xff1b;路由器2台。 …

深度学习3

五、自动微分 1、基础概念 模块 autograd 负责自动计算张量操作的梯度&#xff0c;具有自动求导功能&#xff1b;autograd 创建一个动态计算图来跟踪张量的操作&#xff0c;每个张量是计算图中的一个节点&#xff0c;节点之间的操作构成图的边。 属性 requires_grad 决定…

路由器中继与桥接

一 . 背景 现在的路由器大多数已经开始支持多种网络连接模式&#xff0c;以下将以TP-Link迷你无线路由器为例进行展开介绍。在TP-Link迷你无线路由器上一般有AP&#xff08;接入点&#xff09;模式&#xff0c;Router&#xff08;无线路由&#xff09;模式&#xff0c;Repeate…

人工智能|计算机视觉——微表情识别(Micro expression recognition)的研究现状

一、简述 微表情是一种特殊的面部表情,与普通的表情相比,微表情主要有以下特点: 持续时间短,通常只有1/25s~1/3s;动作强度低,难以察觉;在无意识状态下产生,通常难以掩饰或伪装;对微表情的分析通常需要在视频中,而普通表情在图像中就可以分析。由于微表情在无意识状态…

嵌入式系统与OpenCV

目录 一、OpenCV 简介 二、嵌入式 OpenCV 的安装方法 1. Ubuntu 系统下的安装 2. 嵌入式 ARM 系统中的安装 3. Windows10 和树莓派系统下的安装 三、嵌入式 OpenCV 的性能优化 1. 介绍嵌入式平台上对 OpenCV 进行优化的必要性。 2. 利用嵌入式开发工具&#xff0c;如优…

React(五)——useContecxt/Reducer/useCallback/useRef/React.memo/useMemo

文章目录 项目地址十六、useContecxt十七、useReducer十八、React.memo以及产生的问题18.1组件嵌套的渲染规律18.2 React.memo18.3 引出问题 十九、useCallback和useMemo19.1 useCallback对函数进行缓存19.2 useMemo19.2.1 基本的使用19.2.2 缓存属性数据 19.2.3 对于更新的理解…

STM32设计学生宿舍监测控制系统-分享

目录 前言 一、本设计主要实现哪些很“开门”功能&#xff1f; 二、电路设计原理图 电路图采用Altium Designer进行设计&#xff1a; 三、实物设计图 四、程序源代码设计 五、获取资料内容 前言 本项目旨在利用STM32单片机为核心&#xff0c;结合传感器技术、无线通信技…

华为无线AC+AP组网实际应用小结

之前公司都是使用的H3C的交换机、防火墙以及无线AC和AP的&#xff0c;最近优化下无线网络&#xff0c;说新的设备用华为的&#xff0c;然后我是直到要部署的当天才知道用华为设备的&#xff0c;就很无语了&#xff0c;一点准备没有&#xff0c;以下为这次的实际操作记录吧&…

Linux麦克风录音实战

在 Linux 上使用麦克风进行录音可以通过多种方式实现&#xff0c;包括使用命令行工具、图形界面应用程序以及编程接口。下面我将介绍几种常见的方法&#xff0c;从简单的命令行工具到使用 PortAudio 库进行编程。 一. 使用arecord命令行工具 arecord 是 ALSA&#xff08;Adva…