星际争霸之小霸王之小蜜蜂(十二)--猫有九条命
系列文章目录
星际争霸之小霸王之小蜜蜂(十一)--杀杀杀
星际争霸之小霸王之小蜜蜂(十)--鼠道
星际争霸之小霸王之小蜜蜂(九)--狂鼠之灾
星际争霸之小霸王之小蜜蜂(八)--蓝皮鼠和大脸猫
星际争霸之小霸王之小蜜蜂(七)--消失的子弹
星际争霸之小霸王之小蜜蜂(六)--让子弹飞
星际争霸之小霸王之小蜜蜂(五)--为小蜜蜂降速
星际争霸之小霸王之小蜜蜂(四)--事件监听-让小蜜蜂动起来
目录
系列文章目录
文章目录
前言
一、按键事件无法监听情况
二、游戏结束的几种情形
三、检测小老鼠和小花猫碰撞
四、猫有九条命
五、雅典娜被攻击
六、游戏结束
总结
前言
昨天我们已经完成了游戏的主要部分之一,就是子弹的碰撞监测,我们还有一些事情需要解决,比如判断游戏失败、游戏记分等等,今天我们先来实现判断游戏失败功能。
一、按键事件无法监听情况
这是跟今天的内容关系不大的部分,但是之前一直存在的问题没有解决。之前我们写了一段代码,通过按键盘上的Q键可以实现程序的关闭:
elif event.key == pygame.K_q:sys.exit()
当写完这个代码之后,我发现按Q键并没有任何反应,因为不影响我用鼠标点击关闭游戏,所以一直没有管它,今天再写新代码之前我试着解决,首先我在判断按键为Q后添加输出语句,但当我点击Q时,控制台没有任何输出内容。于是我怀疑按Q时,有没有触发按键事件,我在判断监听键盘按键下 elif event.type==pygame.KEYDOWN:,添加输出,结果发现,按字母都没有输出,也就是没监听到,但是按其他键比如空格、方向键、数字都可以,从逻辑上来说不应该发生这种事情。经过多方查找资料,终于知道原因:我们在运行程序时,键盘输入默认是中文输入法,这时按字母键是监听不到的,我们把切换成英文输入法就解决了这个问题。
二、游戏结束的几种情形
言归正传,今天我们要编写的是判定游戏结束,玩游戏的人都知道,游戏结束有几种情况:一是小老鼠和小花猫进行了撞击,可以判定游戏结束,二是小老鼠进入了屏幕最下边,就像塔防一样,放跑了小怪,雅典娜就死了,游戏判定结束,三是时间到了,判定游戏结束。如果存在生命值或者好几条命的情况,上面的前两种情形还要加判断,判断是否没有命了,如果没有命则游戏结束。
基于上面的思考,我们根据各种情形编写代码。
三、检测小老鼠和小花猫碰撞
我们在更新每只小老鼠的位置后判断其是否和小花猫碰撞。
def update_aliens(new_setting,,ship,aliens):check_fleet_edges(new_setting,aliens)aliens.update()if pygame.sprite.spritecollideany(ship,aliens):print('完了')
看到上面的代码我们想到写子弹和老鼠碰撞时调用的函数pygame.sprite.groupcollide,这里我们也使用了一个函数,使实现过程变得非常简单。
pygame.sprite.spritecollideany(ship, aliens)是Pygame库中的一个函数,用于检测一个精灵是否与一组精灵中的任意一个发生了碰撞。其中,ship是一个精灵对象,aliens是一个精灵组对象。如果ship与aliens中的任意一个精灵发生了碰撞,该函数会返回True,否则返回False。
这里判断撞击后,书上并没有编写后续过程,我猜后面要统一编写,只是写了一个输出,证明实现了判断的功能,我们将老鼠的速度加大,来测试下。

可以看到控制台上出现很多的“完了”,因为小老鼠有很多,左右撞击都会判定成功。
四、猫有九条命
这个游戏最终还是赋予了玩家好几条命,但是书上的思路我觉得还是非常好的,正常我们想到的是重新创建一个新的小花猫,就像爆炸的子弹和老鼠一样,书上给的思路是不创建新的花猫,只创建一个变量来记录花猫死的次数,花猫还是那个花猫。为此,创建一个类GameStats保存游戏里面需要统计的信息。
class GameStats():def __init__(self,new_setting):self.new_setting = new_settingself.reset_stats()def reset_stats(self):self.ships_left = self.new_setting.ship_limit
这里的self.new_setting.ship_limit,我们马上在settings模块设置
class Settings():def __init__(self):self.screen_width = 800self.screen_height = 600self.bg_color = (255,255,255)self.ship_speed_factor = 0.1self.ship_limit = 9self.bullet_speed_factor = 0.5self.bullet_width = 2self.bullet_hight = 5self.bullet_color = 60,60,60self.bullets_allowed = 20self.alien_speed_factor = 2self.fleet_drop_speed = 50self.fleet_direction = 1
至此我们应该想到需要在哪些地方使用这个函数,首先想到的就是我们上面写的老鼠和花猫碰撞之后,但是在update_aliens调用之前,我们需呀将其实例化,传入实参。
import pygame
import settings
from ship import Ship
import game_functions as gf
from pygame.sprite import Group
from alien import Alien
from game_stats import GameStatsdef run_game():pygame.init()new_setting=settings.Settings()screen = pygame.display.set_mode((new_setting.screen_width,new_setting.screen_height))ship = Ship(screen,new_setting)alien = Alien(new_setting,screen)pygame.display.set_caption("狂敲代码的橘子")bullets = Group()aliens = Group()gf.create_fleet(new_setting,screen,aliens)stats = GameStats(new_setting)while True:gf.check_events(new_setting,screen,ship,bullets)ship.update()gf.update_bullets(new_setting,screen,bullets,aliens)gf.update_aliens(new_setting,stats,ship,aliens)gf.update_screen(new_setting,screen,ship,bullets,aliens)run_game()
我们在主函数对其实例化,然后再调用update_aliens函数时将其传入。在update_aliens里面我们要实现一是将小花猫的命减一,二是删除原来的老鼠,创建一群新的老鼠,三是将小花猫放在初始位置,也就是窗口的中央。
def ship_hit(new_setting,stats,screen,ship,aliens,bullets):stats.ships_left -= 1aliens.empty()bullets.empty()create_fleet(new_setting, screen, aliens)ship.center_ship()time.sleep(0.5)def update_aliens(new_setting,stats,screen,ship,aliens,bullets):check_fleet_edges(new_setting,aliens)aliens.update()if pygame.sprite.spritecollideany(ship,aliens):ship_hit(new_setting, stats, screen, ship, aliens, bullets)
这段代码不难理解,我们发现 ship.center_ship()这个函数我们没有在ship类中定义,它的功能就是将小花猫放到中央去,其实可有可无,我觉得原地复活也不错,但是按照书上我们还是在ship类中添加
def center_ship(self):self.center = self.screen_rect.centerx
我们运行试试效果

五、雅典娜被攻击
之前我们分析过,除了老鼠和小猫进行撞击,小猫会掉血以外,还有就是老鼠触及屏幕底端,相当于塔防游戏失守,怪物跑老家了。实现这个功能非常简单,我们只需要在判断老鼠和花猫碰撞后,再增加一个判断,如果碰撞了,后续操作和老鼠碰到猫一样,我们直接调用ship_hit函数就行了。
def check_aliens_bottom(new_setting,stats,screen,ship,aliens,bullets):screen_rect = screen.get_rect()for alien in aliens.sprites():if alien.rect.bottom >= screen_rect.bottom:ship_hit(new_setting,stats,screen,ship,aliens,bullets)breakdef update_aliens(new_setting,stats,screen,ship,aliens,bullets):check_fleet_edges(new_setting,aliens)aliens.update()if pygame.sprite.spritecollideany(ship,aliens):ship_hit(new_setting, stats, screen, ship, aliens, bullets)
check_aliens_bottom(new_setting, stats, screen, ship, aliens, bullets)
我们不像写小老鼠和小花猫碰撞那样直接在update_aliens里进行判断,而是将代码写在 check_aliens_bottom函数里。为了测试代码效果,我们将判断老鼠和花猫碰撞的代码注释掉,避免发生干扰。

可以看见,老鼠穿过花猫后没有问题,然后老鼠重新生成。
六、游戏结束
游戏结束的各种情形已经写完,但是目前老鼠和小猫还在不断重生,我们设置的猫的命属性还没有用上,我们加上判断语句,小猫每归位一次,生命就减一。
def ship_hit(new_setting,stats,screen,ship,aliens,bullets):stats.ships_left -= 1aliens.empty()bullets.empty()create_fleet(new_setting, screen, aliens)ship.center_ship()if stats.ships_left > 0:stats.ships_left -= 1time.sleep(0.5)else:stats.game_active = False
书上用stats.game_active属性表示游戏是否结束,我个人觉得没必要这么麻烦,就用stats.ships_left=0表示游戏结束就不行了。
总结
有始有终,今天我们完成了游戏的失败判定。
相关文章:
星际争霸之小霸王之小蜜蜂(十二)--猫有九条命
系列文章目录 星际争霸之小霸王之小蜜蜂(十一)--杀杀杀 星际争霸之小霸王之小蜜蜂(十)--鼠道 星际争霸之小霸王之小蜜蜂(九)--狂鼠之灾 星际争霸之小霸王之小蜜蜂(八)--蓝皮鼠和大…...
【软件分析/静态分析】chapter8 课程11/12 指针分析—上下文敏感(Pointer Analysis - Context Sensitivity)
🔗 课程链接:李樾老师和谭天老师的: 南京大学《软件分析》课程11(Pointer Analysis - Context Sensitivity I)_哔哩哔哩_bilibili 南京大学《软件分析》课程12(Pointer Analysis - Context Sensitivity II&…...
时间复杂度与空间复杂度详解
时间复杂度与空间复杂度详解🦖 一、算法效率1.1 如何衡量一个算法的好坏1.2 算法的复杂度 二、时间复杂度2.1 时间复杂度的定义2.2 大O的渐进表示法2.3 如何记录表示算法复杂度 三、空间复杂度3.1 空间复杂度的定义3.2 小试牛刀 一、算法效率 1.1 如何衡量一个算法…...
目录操作函数
mkdir函数 rmdir函数 删除空目录 rename函数 换名 chdir函数 修改当前的工作目录 getcwd函数 获取当前工作的路径...
PlantUML入门教程:画时序图
软件工程中会用到各种UML图,例如用例图、时序图等。那我们能不能像写代码一样去画图呢? 今天推荐一款软件工程师的作图利器--PlantUML,它能让你用写代码的方式快速画出UML图。 一、什么是PlantUML? PlantUML是一个允许你快速作出…...
C#范围运算符
C#8.0语法中,范围运算符是一种用于快速截取序列的运算符,其语法为 “start…end”,表示从序列的 “start” 索引处开始,一直截取到"end" 索引处为止(包括 “end” 索引处的元素)。范围运算符主要…...
云数据库知识学习——云数据库产品、云数据库系统架构
一、云数据库产品 1.1、云数据库厂商概述 云数据库供应商主要分为三类。 ① 传统的数据库厂商,如 Teradata、Oracle、IBM DB2 和 Microsoft SQL Server 等。 ② 涉足数据库市场的云供应商,如 Amazon、Google、Yahoo!、阿里、百度、腾讯…...
C++中引用详解!
前言: 本文旨在讲解C中引用的相关操作,以及引用的一些注意事项!搬好小板凳,干货来了! 引用的概念 何谓引用呢?引用其实很容易理解,比如李华这个同学,他因为很调皮,所以…...
VUE3+TS项目无法找到模块“../version/version.js”的声明文件
问题描述 在导入 ../version/version.js 文件时,提示无法找到模块 解决方法 将version.js改为version.ts可以正常导入 注意,因为version.js是我自己写的模块,我可以直接该没有关系,但是如果是引入的其他的第三方包,…...
数据结构-堆的实现及应用(堆排序和TOP-K问题)
数据结构-堆的实现及应用[堆排序和TOP-K问题] 一.堆的基本知识点1.知识点 二.堆的实现1.堆的结构2.向上调整算法与堆的插入2.向下调整算法与堆的删除 三.整体代码四.利用回调函数避免对向上和向下调整算法的修改1.向上调整算法的修改2.向下调整算法的修改3.插入元素和删除元素函…...
Spring 条件注解没生效?咋回事
条件注解相信各位小伙伴都用过,Spring 中的多环境配置 profile 底层就是通过条件注解来实现的,松哥在之前的 Spring 视频中也有和大家详细介绍过条件注解的使用,感兴趣的小伙伴戳这里:Spring源码应该怎么学?。 从 Spr…...
96. 不同的二叉搜索树
class Solution { public:int numTrees(int n) {if (n0) {return 1;}vector<int> dp(n1, 0);dp[0] 1;dp[1] 0;for (int i 1; i < n; i) {for (int j 0; j < i; j) {dp[i] dp[j] * dp[i - 1 - j];}}return dp[n];} };...
Android Jetpack 中Hilt的使用
Hilt 是 Android 的依赖项注入库,可减少在项目中执行手动依赖项注入的样板代码。执行 手动依赖项注入 要求您手动构造每个类及其依赖项,并借助容器重复使用和管理依赖项。 Hilt 通过为项目中的每个 Android 类提供容器并自动管理其生命周期,…...
批量采集的时间管理与优化
在进行大规模数据采集时,如何合理安排和管理爬取任务的时间成为了每个专业程序员需要面对的挑战。本文将分享一些关于批量采集中时间管理和优化方面的实用技巧,帮助你提升爬虫工作效率。 1. 制定明确目标并设置合适频率 首先要明确自己所需获取数据的范…...
uniApp监听左右滑动事件
监听左右滑动事件的步骤 1. 添加需要监听滑动事件的元素 在你的页面中,添加需要监听滑动事件的元素。这可以是一个 view、swiper 或其他组件,取决于你的需求。例如: <template><view class"body" touchstart"touc…...
十八、MySQL添加外键?
1、外键 外键是用来让两张表的数据之间建立联系,从而保证数据的一致性和完整性。 注意,父表被关联的字段类型,必须和子表被关联的字段类型一致。 2、实际操作 (1)初始化两张表格: 子表: 父…...
图像文件的操作MATLAB基础函数使用
简介 MATLAB中的图像处理工具箱体统了一套全方位的标准算法和图形工具,用于进行图像处理、分析、可视化和算法开发。这里仅仅对常用的基础函数做个使用介绍。 查询图像文件的信息 使用如下函数 imfinfo(filename,fmt) 函数imfinfo返回一个结构体的infoÿ…...
【k8s】Kubernetes版本v1.17.3 kubesphere 3.1.1 默认用户登录失败
1.发帖: Kubernetes版本v1.17.3 kubesphere 3.11 默认用户登录失败 - KubeSphere 开发者社区 2. 问题日志: 2.1问题排查方法 : 用户无法登录 http://192.168.56.100:30880/ 2.2查看用户状态 kubectl get users [rootk8s-node1 ~]# k…...
Mysql加密功能
Mysql加密功能 InnoDB加密功能查询条件问题开启整个数据库加密 InnoDB加密功能 InnoDB是MySQL数据库引擎的一种,它提供了加密存储的功能。具体来说,InnoDB引擎支持以下两种方式的加密存储: 表级加密:InnoDB支持表级加密ÿ…...
redis-win10安装和解决清缓存报错“Error: Protocol error, got “H“ as reply type byte”
win10安装 https://github.com/microsoftarchive/redis/releases 下载最新的zip,解压,把路径加到Path里,每次直接在cmd里 redis-server.exeError: Protocol error, got “H” as reply type byte 这个报错是因为我端口写错了。。无语 D:…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...
CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!
本文介绍了一种名为AnomalyAny的创新框架,该方法利用Stable Diffusion的强大生成能力,仅需单个正常样本和文本描述,即可生成逼真且多样化的异常样本,有效解决了视觉异常检测中异常样本稀缺的难题,为工业质检、医疗影像…...
消息队列系统设计与实践全解析
文章目录 🚀 消息队列系统设计与实践全解析🔍 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡💡 权衡决策框架 1.3 运维复杂度评估🔧 运维成本降低策略 🏗️ 二、典型架构设计2.1 分布式事务最终一致…...
shell脚本质数判断
shell脚本质数判断 shell输入一个正整数,判断是否为质数(素数)shell求1-100内的质数shell求给定数组输出其中的质数 shell输入一个正整数,判断是否为质数(素数) 思路: 1:1 2:1 2 3:1 2 3 4:1 2 3 4 5:1 2 3 4 5-------> 3:2 4:2 3 5:2 3…...
