星际争霸之小霸王之小蜜蜂(十二)--猫有九条命
系列文章目录
星际争霸之小霸王之小蜜蜂(十一)--杀杀杀
星际争霸之小霸王之小蜜蜂(十)--鼠道
星际争霸之小霸王之小蜜蜂(九)--狂鼠之灾
星际争霸之小霸王之小蜜蜂(八)--蓝皮鼠和大脸猫
星际争霸之小霸王之小蜜蜂(七)--消失的子弹
星际争霸之小霸王之小蜜蜂(六)--让子弹飞
星际争霸之小霸王之小蜜蜂(五)--为小蜜蜂降速
星际争霸之小霸王之小蜜蜂(四)--事件监听-让小蜜蜂动起来
目录
系列文章目录
文章目录
前言
一、按键事件无法监听情况
二、游戏结束的几种情形
三、检测小老鼠和小花猫碰撞
四、猫有九条命
五、雅典娜被攻击
六、游戏结束
总结
前言
昨天我们已经完成了游戏的主要部分之一,就是子弹的碰撞监测,我们还有一些事情需要解决,比如判断游戏失败、游戏记分等等,今天我们先来实现判断游戏失败功能。
一、按键事件无法监听情况
这是跟今天的内容关系不大的部分,但是之前一直存在的问题没有解决。之前我们写了一段代码,通过按键盘上的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:…...
终极指南:3分钟为Windows换上macOS专业级光标体验
终极指南:3分钟为Windows换上macOS专业级光标体验 【免费下载链接】macOS-cursors-for-Windows Tested in Windows 10 & 11, 4K (125%, 150%, 200%). With 2 versions, 2 types and 3 different sizes! 项目地址: https://gitcode.com/gh_mirrors/ma/macOS-cu…...
微信网页版访问难题如何破解?wechat-need-web浏览器扩展的轻量级替代方案探索
微信网页版访问难题如何破解?wechat-need-web浏览器扩展的轻量级替代方案探索 【免费下载链接】wechat-need-web 让微信网页版可用 / Allow the use of WeChat via webpage access 项目地址: https://gitcode.com/gh_mirrors/we/wechat-need-web 你是否曾在公…...
三月七小助手:星穹铁道自动化工具如何帮你每天节省30分钟游戏时间
三月七小助手:星穹铁道自动化工具如何帮你每天节省30分钟游戏时间 【免费下载链接】March7thAssistant 崩坏:星穹铁道全自动 三月七小助手 项目地址: https://gitcode.com/gh_mirrors/ma/March7thAssistant 你是否每天花费大量时间在《崩坏&#…...
Tree of Thoughts详解:思维树搜索算法
🌳 多路径探索 | 广度优先 深度优先搜索 | 自我评估 回溯机制 | LangChain实现 | 完整项目代码 📖 什么是Tree of Thoughts? 核心思想 ToT Tree of Thoughts(思维树) 传统LLM: 输入 → 线性思考 → 输出…...
TypeScript领域建模实战:基于斯坦福本体论七步法构建健壮数据模型
1. 项目概述如果你和我一样,在TypeScript项目里摸爬滚打了几年,肯定遇到过这样的场景:面对一个全新的业务领域,老板让你“设计一下数据模型”,你打开一个空白的types.ts文件,光标闪烁,大脑一片空…...
外卖点餐连锁店餐饮生鲜奶茶外卖店内扫码点餐源码同城外卖校园外卖源码的扫码逻辑
📱 扫码点餐系统 - 完整扫码逻辑 源码示例外卖点餐 | 连锁店 | 餐饮生鲜 | 奶茶 | 店内扫码点餐 | 同城外卖 | 校园外卖🎯 扫码业务场景总览场景扫码后行为核心逻辑🍽️ 店内扫码点餐进入店铺菜单页识别店铺ID → 加载菜单🏃 外卖…...
AI驱动终端交互:用自然语言指挥命令行的新范式
1. 项目概述:一个AI驱动的终端交互新范式最近在终端工具圈里,一个名为“yai”的项目引起了我的注意。它不是一个简单的命令行美化工具,也不是一个传统的终端复用器。简单来说,yai是一个由 AI 驱动的、旨在彻底改变你与终端交互方式…...
基于MCP协议构建AI智能体安全工具箱:qirabot/mcp-server实战指南
1. 项目概述:一个为AI智能体提供“眼睛”和“手”的MCP服务器最近在折腾AI智能体(Agent)的开发,发现一个核心痛点:如何让这些智能体安全、可控地访问外部工具和数据?直接给它们开放网络或系统权限ÿ…...
从玩具到工具:Dobot Magician桌面机械臂开箱与Blockly图形化编程初体验
从玩具到工具:Dobot Magician桌面机械臂开箱与Blockly图形化编程初体验 第一次见到Dobot Magician时,它安静地躺在包装箱里,像一件精致的工业艺术品。作为一款定位教育和个人创客市场的桌面级机械臂,它的价格只有工业机械臂的零头…...
软件测试十年老兵自述:从月薪3K到年薪50W的跃迁密码
一个Bug改变的人生轨迹十年前的那个下午,我还记得格外清晰。作为某外包公司的“点点点”工程师,我机械地对着一个后台管理系统重复着测试用例。月薪3000,坐标二线城市,每天的工作就是执行别人写好的用例,发现Bug就提交…...
