星际争霸之小霸王之小蜜蜂(十二)--猫有九条命

news2024/11/19 13:17:14

系列文章目录

星际争霸之小霸王之小蜜蜂(十一)--杀杀杀

 星际争霸之小霸王之小蜜蜂(十)--鼠道

星际争霸之小霸王之小蜜蜂(九)--狂鼠之灾

 星际争霸之小霸王之小蜜蜂(八)--蓝皮鼠和大脸猫

  星际争霸之小霸王之小蜜蜂(七)--消失的子弹

 星际争霸之小霸王之小蜜蜂(六)--让子弹飞

 星际争霸之小霸王之小蜜蜂(五)--为小蜜蜂降速

 星际争霸之小霸王之小蜜蜂(四)--事件监听-让小蜜蜂动起来


目录

系列文章目录

文章目录

前言

一、按键事件无法监听情况

二、游戏结束的几种情形

三、检测小老鼠和小花猫碰撞

 四、猫有九条命

 五、雅典娜被攻击

 六、游戏结束

总结


前言

昨天我们已经完成了游戏的主要部分之一,就是子弹的碰撞监测,我们还有一些事情需要解决,比如判断游戏失败、游戏记分等等,今天我们先来实现判断游戏失败功能。


一、按键事件无法监听情况

这是跟今天的内容关系不大的部分,但是之前一直存在的问题没有解决。之前我们写了一段代码,通过按键盘上的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_setting
        self.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 = 800
        self.screen_height = 600
        self.bg_color = (255,255,255)
        self.ship_speed_factor = 0.1
        self.ship_limit = 9

        self.bullet_speed_factor = 0.5
        self.bullet_width = 2
        self.bullet_hight = 5
        self.bullet_color = 60,60,60
        self.bullets_allowed = 20
        self.alien_speed_factor = 2
        self.fleet_drop_speed = 50
        self.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 GameStats

def 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 -= 1
    aliens.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)
            break


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)
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 -= 1
    aliens.empty()
    bullets.empty()
    create_fleet(new_setting, screen, aliens)
    ship.center_ship()
    if stats.ships_left > 0:
        stats.ships_left -= 1
        time.sleep(0.5)
    else:
        stats.game_active = False

 书上用stats.game_active属性表示游戏是否结束,我个人觉得没必要这么麻烦,就用stats.ships_left=0表示游戏结束就不行了。


总结

有始有终,今天我们完成了游戏的失败判定。

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

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

相关文章

力扣刷题61-旋转链表

题目来源: 力扣61-旋转链表 题目描述: 思路:双指针 因为它倒得永远是倒数k个 class Solution {public ListNode rotateRight(ListNode head, int k) {ListNode slowhead,fasthead,lenhead;int l0;//1 求长度while(len!null){l;lenlen.next…

【JAVA-Day05】深入理解Java数据类型和取值范围

深入理解Java数据类型和取值范围 深入理解Java数据类型和取值范围摘要一、Java的数据类型1.1 存储单位1.2 Java基本数据类型 二、Java的取值范围2.1 变量定义2.2 取值范围验证 三、总结 博主 默语带您 Go to New World. ✍ 个人主页—— 默语 的博客👦🏻…

孙哥Spring源码第21集

第21集 refresh-invokeBeanFactoryPostProcessor-下半部分BeanFactoryPostPrcessor处理 【视频来源于:B站up主孙帅suns Spring源码视频】【微信号:suns45】 1、注解处理添加的的BeanDefinitionRegistryFactoryProcessor在哪个地方? 在第一…

【Flutter】引入网络图片时,提示:Failed host lookup: ‘[图片host]‘

在使用 NetworkImage 组件加载外部图片时,提示 Failed host lookup: [图片host] 错误。 排查方向 1、清理缓存 解决方案: 尝试flutter clean清空缓存后重新安装依赖flutter pub get重新构建项目flutter create . 走完上述三个步骤后,再次…

COMO-ViT论文阅读笔记

Low-Light Image Enhancement with Illumination-Aware Gamma Correction and Complete Image Modelling Network 这是一篇美团、旷视、深先院、华为诺亚方舟实验室、中国电子科技大学 五个单位合作的ICCV2023的暗图增强论文,不过没有开源代码。 文章的贡献点一个是…

工作游戏时mfc140u.dll丢失的解决方法,哪个方法可快速修复mfc140u.dll问题

在 Windows 操作系统中,mfc140u.dll 文件是非常重要的一个组件,许多基于 MFC(Microsoft Foundation Classes)的程序都需要依赖这个文件。然而,有些用户在运行这些程序时可能会遇到mfc140u.dll丢失的问题,导…

技术分析需谨慎,各位投资者应该这样做

技术市场分析中存在许多工具,其中之一便是烛台模式。然而对于这些模式和指标,FPmarkets澳福和各位投资者应持谨慎的态度,因为它们仅仅展示了一种可能的结果,而无法确保其绝对准确。 关于蜡烛图交易的提示,包括Maruboz…

RK3399平台开发系列讲解(内核调试篇)spidev_test工具使用

🚀返回专栏总目录 文章目录 一、环境二、执行测试三、回环测试四、字节发送测试五、32位数据发送测试沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 在 Linux 系统上,“spidev_test” 是一个用于测试和配置 SPI(Serial Peripheral Interface)设备的命令行工具。…

2023-2024年最值得选的微信小程序毕业设计选题大全:100个热门选题推荐✅

一、前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 毕业设计选题非常重要&a…

页面优化技术

页面优化技术 文章目录 页面优化技术1.概述2.页面缓存URL缓存对象缓存2.1 页面缓存2.2 对象缓存2.3 测试效果 3.页面静态化 1.概述 Aim:减少对数据库的访问 页面缓存URL缓存对象缓存’ Aim:实现前后端分离 页面静态化,前后端分离 Aim: 静态资…

华为Mate60 Pro手机重大突破,资本要做空iPhone?Android开发市场将来会如何?

在9月10日有消息称,在华为的Mate60 Pro手机取得重大突破,其研发的 麒麟9000s芯片的研制, 国际卫星通信技术的应用 等这一系列的重大突破,导致美国的一家对冲基金Satori Fund创始人公开要做空iPhone。 而摩根大通发布报告称&#x…

LeetCode(力扣)122. 买卖股票的最佳时机 II

LeetCode122. 买卖股票的最佳时机 II 题目链接代码 题目链接 https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/ 代码 class Solution:def maxProfit(self, prices: List[int]) -> int:result 0for i in range(1, len(prices)):result max((prices[i…

Mybatis 动态语言 - mybatis-velocity

前面我们介绍了Mybatis动态SQL的使用;本篇我们介绍使用mybatis-velocity动态语言生成动态SQL。 如果您对Mybatis动态SQL不太了解,建议您先进行了解后再阅读本篇,可以参考: Mybatis 动态SQL – 使用if,where标签动态生成条件语句…

FFMPEG视频压缩与Python使用方法

一、简介 FFMPEG 是一个完整的,跨平台的解决方案,记录,转换和流音频和视频。 官网:https://ffmpeg.org/ 二、安装 1、Linux: sudo apt install ffmpeg 2、Mac: brew install ffmpeg 3、Windows: 下载文件&#…

web UI自动化介绍

文章目录 一、web UI自动化介绍1.1 执行UI自动化测试前提1.2 Selenium介绍以及知识点梳理 二、Selenium 学习2.1 基础2.1.1 环境安装与基础使用2.1.2 web浏览器控制2.1.3 常见控件的八大定位方式2.1.3.1 八大定位方式介绍2.1.3.2 NAME、ID定位2.1.3.3 css_selector定位2.1.3.4 …

第六章 图 六、最小生成树(Prim算法、Kruskal算法)

一、定义 对于一个带权连通无向图G(V,E),生成树不同,每棵树的权(即树中所有边上的权值之和)也可能不同。设R为G的所有生成树的集合,若T为R中边的权值之和最小的生成树,则T称为G的最小生成树(Minimum-Spanning-Tree, MST)。 二、手…

PCD235A101-3BHE032025R010 为航海级用户提供卓越的性能

PCD235A101-3BHE032025R010 为航海级用户提供卓越的性能 PCD235A101 系列提供 12.1 英寸、19 英寸和 24 英寸 LCD 尺寸,配备宽视角屏幕,以满足不同船舶的要求。船用PC符合DNV标准,通过IEC 60945认证,具有日光/月光可读、防腐涂层…

C语言入门Day_18 判断和循坏的小结

目录 前言: 1.判断 2.循环 3.课堂笔记 4.思维导图 前言: 判断语句和循环语句都可以大致分为三个部分,第一个部分是固定的语法格式;第二部分是代码的执行顺序,第三部分是判断和循环成立与否的判断条件。 1.判断 1…

小米13Pro/13Ultra刷面具ROOT后激活LSPosed框架微X模块详细教程

喜欢买小米手机,很多是因为小米手机的开放,支持root权限,而ROOT对普通用户来说更多的是刷入DIY模块功能,今天ROM乐园小编就教大家如何使用面具ROOT,实现大家日常情况下非常依赖的微X模块功能,体验微X模块的…

10.2 整流电路

在分析整流电路时,为了突出重点,简化分析过程,一般均假定负载为纯电阻性;整流二极管为理想二极管,即导通时正向压降为零,截止时反向电流为零;变压器无损耗,内部压降为零等。 一、整…