关于“Python”的核心知识点整理大全37

news2025/6/16 1:12:53

目录

13.6.2 响应外星人和飞船碰撞

game_stats.py

settings.py

alien_invasion.py

game_functions.py

ship.py

注意

13.6.3 有外星人到达屏幕底端

game_functions.py

13.6.4 游戏结束

game_stats.py

game_functions.py

13.7 确定应运行游戏的哪些部分

alien_invasion.py

13.8 小结

第14 章

记 分

14.1 添加 Play 按钮

game_stats.py

往期快速传送门👆(在文章最后):

感谢大家的支持!欢迎订阅收藏!专栏将持续更新!


13.6.2 响应外星人和飞船碰撞

现在需要确定外星人与飞船发生碰撞时,该做些什么。我们不销毁ship实例并创建一个新的 ship实例,而是通过跟踪游戏的统计信息来记录飞船被撞了多少次(跟踪统计信息还有助于记 分)。 下面来编写一个用于跟踪游戏统计信息的新类——GameStats,并将其保存为文件 game_stats.py:

game_stats.py
class GameStats(): 
 """跟踪游戏的统计信息"""
 def __init__(self, ai_settings):
 """初始化统计信息"""
 self.ai_settings = ai_settings
1 self.reset_stats()
 def reset_stats(self):
 """初始化在游戏运行期间可能变化的统计信息"""
 self.ships_left = self.ai_settings.ship_limit

在这个游戏运行期间,我们只创建一个GameStats实例,但每当玩家开始新游戏时,需要重 置一些统计信息。为此,我们在方法reset_stats()中初始化大部分统计信息,而不是在__init__() 中直接初始化它们。我们在__init__()中调用这个方法,这样创建GameStats实例时将妥善地设置 这些统计信息(见Ø),同时在玩家开始新游戏时也能调用reset_stats()。 当前只有一项统计信息——ships_left,其值在游戏运行期间将不断变化。一开始玩家拥有 的飞船数存储在settings.py的ship_limit中:

settings.py
 # 飞船设置
 self.ship_speed_factor = 1.5
 self.ship_limit = 3 

我们还需对alien_invasion.py做些修改,以创建一个GameStats实例:

alien_invasion.py
--snip--
from settings import Settings
1 from game_stats import GameStats
--snip--
def run_game():
 --snip--
 pygame.display.set_caption("Alien Invasion")
 # 创建一个用于存储游戏统计信息的实例
2 stats = GameStats(ai_settings)
--snip--
# 开始游戏主循环
while True:
 --snip--
 gf.update_bullets(ai_settings, screen, ship, aliens, bullets)
3 gf.update_aliens(ai_settings, stats, screen, ship, aliens, bullets)
 --snip-- 

我们导入了新类GameStats( 见1),创建了一个名为stats的实例(见2),再调用 update_aliens()并添加了实参stats、screen和ship(见3)。在有外星人撞到飞船时,我们将使用这些实参来跟踪玩家还有多少艘飞船,以及创建一群新的外星人。 有外星人撞到飞船时,我们将余下的飞船数减1,创建一群新的外星人,并将飞船重新放置 到屏幕底端中央(我们还将让游戏暂停一段时间,让玩家在新外星人群出现前注意到发生了碰撞, 并将重新创建外星人群)。 下面将实现这些功能的大部分代码放到函数ship_hit()中:

game_functions.py
import sys
1 from time import sleep
import pygame
--snip--
def ship_hit(ai_settings, stats, screen, ship, aliens, bullets):
 """响应被外星人撞到的飞船"""
 # 将ships_left减1
2 stats.ships_left -= 1
 # 清空外星人列表和子弹列表
3 aliens.empty()
 bullets.empty()
 # 创建一群新的外星人,并将飞船放到屏幕底端中央
4 create_fleet(ai_settings, screen, ship, aliens)
 ship.center_ship()
 # 暂停
5 sleep(0.5)
6 def update_aliens(ai_settings, stats, screen, ship, aliens, bullets):
 --snip--
 # 检测外星人和飞船碰撞
 if pygame.sprite.spritecollideany(ship, aliens):
 ship_hit(ai_settings, stats, screen, ship, aliens, bullets) 

我们首先从模块time中导入了函数sleep(),以便使用它来让游戏暂停(见1)。新函数 ship_hit()在飞船被外星人撞到时作出响应。在这个函数内部,将余下的飞船数减1(见2),然 后清空编组aliens和bullets(见3)。

接下来,我们创建一群新的外星人,并将飞船居中(见4),稍后将在Ship类中添加方法 center_ship()。最后,我们更新所有元素后(但在将修改显示到屏幕前)暂停,让玩家知道其 飞船被撞到了(见5)。屏幕将暂时停止变化,让玩家能够看到外星人撞到了飞船。函数sleep() 执行完毕后,将接着执行函数update_screen(),将新的外星人群绘制到屏幕上。

我们还更新了update_aliens()的定义,使其包含形参stats、screen和bullets(6),让它 能够在调用ship_hit()时传递这些值。

下面是新方法center_ship(),请将其添加到ship.py的末尾:

ship.py
def center_ship(self):
 """让飞船在屏幕上居中"""
 self.center = self.screen_rect.centerx 

为让飞船居中,我们将飞船的属性center设置为屏幕中心的x坐标,而该坐标是通过属性 screen_rect获得的。


注意

我们根本没有创建多艘飞船,在整个游戏运行期间,我们都只创建了一个飞船实例,并 在该飞船被撞到时将其居中。统计信息ships_left让我们知道飞船是否用完。


请运行这个游戏,射杀几个外星人,并让一个外星人撞到飞船。游戏暂停后,将出现一群新 的外星人,而飞船将在屏幕底端居中。

13.6.3 有外星人到达屏幕底端

如果有外星人到达屏幕底端,我们将像有外星人撞到飞船那样作出响应。请添加一个执行这 项任务的新函数,并将其命名为update_aliens():

game_functions.py
def check_aliens_bottom(ai_settings, stats, screen, ship, aliens, bullets):
 """检查是否有外星人到达了屏幕底端"""
 screen_rect = screen.get_rect()
 for alien in aliens.sprites():
1 if alien.rect.bottom >= screen_rect.bottom:
 # 像飞船被撞到一样进行处理
 ship_hit(ai_settings, stats, screen, ship, aliens, bullets)
 break
def update_aliens(ai_settings, stats, screen, ship, aliens, bullets):
 --snip--
 # 检查是否有外星人到达屏幕底端
2 check_aliens_bottom(ai_settings, stats, screen, ship, aliens, bullets)

函数check_aliens_bottom()检查是否有外星人到达了屏幕底端。到达屏幕底端后,外星人的 属性rect.bottom的值大于或等于屏幕的属性rect.bottom的值(见1)。如果有外星人到达屏幕底 端,我们就调用ship_hit();只要检测到一个外星人到达屏幕底端,就无需检查其他外星人,因 此我们在调用ship_hit()后退出循环。

我们在更新所有外星人的位置并检测是否有外星人和飞船发生碰撞后调用check_aliens_ bottom()(见2)。现在,每当有外星人撞到飞船或抵达屏幕底端时,都将出现一群新的外星人。

13.6.4 游戏结束

现在这个游戏看起来更完整了,但它永远都不会结束,只是ships_left不断变成更小的负数。 下面在GameStats中添加一个作为标志的属性game_active,以便在玩家的飞船用完后结束游戏:

game_stats.py
 def __init__(self, settings):
 --snip--
 # 游戏刚启动时处于活动状态
 self.game_active = True 

现在在ship_hit()中添加代码,在玩家的飞船都用完后将game_active设置为False:

game_functions.py
def ship_hit(ai_settings, stats, screen, ship, aliens, bullets):
 """响应飞船被外星人撞到"""
 if stats.ships_left > 0:
 # 将ships_left减1
 stats.ships_left -= 1
 --snip--
 #暂停一会儿
 sleep(0.5)
 else:
 stats.game_active = False

ship_hit()的大部分代码都没变。我们将原来的所有代码都移到了一个if语句块中,这条if 语句检查玩家是否至少还有一艘飞船。如果是这样,就创建一群新的外星人,暂停一会儿,再接 着往下执行。如果玩家没有飞船了,就将game_active设置为False。

13.7 确定应运行游戏的哪些部分

在alien_invasion.py中,我们需要确定游戏的哪些部分在任何情况下都应运行,哪些部分仅在 游戏处于活动状态时才运行:

alien_invasion.py
 # 开始游戏主循环
 while True:
 gf.check_events(ai_settings, screen, ship, bullets)
 if stats.game_active:
 ship.update()
 gf.update_bullets(ai_settings, screen, ship, aliens, bullets)
 gf.update_aliens(ai_settings, stats, screen, ship, aliens, bullets)
 gf.update_screen(ai_settings, screen, ship, aliens, bullets)

在主循环中,在任何情况下都需要调用check_events(),即便游戏处于非活动状态时亦如此。 例如,我们需要知道玩家是否按了Q键以退出游戏,或单击关闭窗口的按钮。我们还需要不断更 新屏幕,以便在等待玩家是否选择开始新游戏时能够修改屏幕。其他的函数仅在游戏处于活动状 态时才需要调用,因为游戏处于非活动状态时,我们不用更新游戏元素的位置。 现在,你运行这个游戏时,它将在飞船用完后停止不动。

13.8 小结

在本章中,你学习了:如何在游戏中添加大量相同的元素,如创建一群外星人;如何使用嵌 套循环来创建元素网格,还通过调用每个元素的方法update()移动了大量的元素;如何控制对象 在屏幕上移动的方向,以及如何响应事件,如有外星人到达屏幕边缘;如何检测和响应子弹和外 星人碰撞以及外星人和飞船碰撞;如何在游戏中跟踪统计信息,以及如何使用标志game_active 来判断游戏是否结束了。

在与这个项目相关的最后一章中,我们将添加一个Play按钮,让玩家能够开始游戏,以及游 戏结束后再玩。每当玩家消灭一群外星人后,我们都将加快游戏的节奏,并添加一个记分系统, 得到一个极具可玩性的游戏!

第14 章

记 分

14.1 添加 Play 按钮

在本节中,我们将添加一个Play按钮,它在游戏开始前出现,并在游戏结束后再次出现,让 玩家能够开始新游戏。 当前,这个游戏在玩家运行alien_invasion.py时就开始了。下面让游戏一开始处于非活动状态, 并提示玩家单击Play按钮来开始游戏。为此,在game_stats.py中输入如下代码:

game_stats.py
def __init__(self, ai_settings):
 """初始化统计信息"""
 self.ai_settings = ai_settings
 self.reset_stats()
 # 让游戏一开始处于非活动状态
 self.game_active = False
 def reset_stats(self):
 --snip-- 

现在游戏一开始将处于非活动状态,等我们创建Play按钮后,玩家才能开始游戏。


关于“Python”的核心知识点整理大全35-CSDN博客

关于“Python”的核心知识点整理大全34-CSDN博客

关于“Python”的核心知识点整理大全33-CSDN博客

关于“Python”的核心知识点整理大全32-CSDN博客

关于“Python”的核心知识点整理大全31-CSDN博客

关于“Python”的核心知识点整理大全30-CSDN博客

关于“Python”的核心知识点整理大全29-CSDN博客

关于“Python”的核心知识点整理大全28-CSDN博客

关于“Python”的核心知识点整理大全27-CSDN博客

关于“Python”的核心知识点整理大全26-CSDN博客

关于“Python”的核心知识点整理大全25-CSDN博客

关于“Python”的核心知识点整理大全12-CSDN博客

往期快速传送门👆(在文章最后):

感谢大家的支持!欢迎订阅收藏!专栏将持续更新!

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

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

相关文章

3dsmax渲染太慢,用云渲染农场多少钱?

对于许多从事计算机图形设计的创作者来说,渲染速度慢是一个常见问题,尤其是对于那些追求极致出图效果的室内设计师和建筑可视化师,他们通常使用3ds Max这样的工具,而高质量的渲染经常意味着长时间的等待。场景复杂、细节丰富&…

恢复丢失数据,AnyMP4数据恢复软件帮您解忧

在现今数字化的时代,我们经常会面临着数据丢失的困扰。无论是因为误操作、病毒攻击、格式化、系统崩溃还是硬盘损坏等原因,重要数据的丢失都会给我们带来巨大的困扰和损失。为此,AnyMP4数据恢复软件应运而生,它为用户提供了一种高…

ssm基于BS的库存管理软件设计与实现论文

目 录 目 录 I 摘 要 III ABSTRACT IV 1 绪论 1 1.1 课题背景 1 1.2 研究现状 1 1.3 研究内容 2 2 系统开发环境 3 2.1 vue技术 3 2.2 JAVA技术 3 2.3 MYSQL数据库 3 2.4 B/S结构 4 2.5 SSM框架技术 4 3 系统分析 5 3.1 可行性分析 5 3.1.1 技术可行性 5 3.1.2 操作可行性 5 3…

Ubuntu 常用命令之 zip 命令用法介绍

📑Linux/Ubuntu 常用命令归类整理 Ubuntu系统下的zip命令是用来压缩文件的。这个命令可以将一个或多个文件或者目录压缩成一个.zip文件,也可以将整个目录树压缩成一个.zip文件。 zip命令的基本格式 zip [选项] [压缩文件名] [要压缩的文件或目录...]z…

机器视觉兄弟们,出身寒微,不是耻辱,能屈能伸,方为丈夫

人生过往,当时只道是寻常。 可以说,“社会边角料”这个词,即刺耳,又是那么难听。只是,无数的年轻人和中年人,都喜欢用这个词来自嘲。 特别是出身寒微,没啥资源的80后和90后,他们总是…

.NET中的Swagger使用

目录 前言 一、Swagger是什么? 二、如何Swagger文档说明的信息 1.在AddSwaggerGen方法中写入文档信息 2.运行效果 二、文档UI界面标题、路由设置 1.在中间件UseSwaggerUI方法中配置 三、文档UI界面添加接口注释 1.在 .csproj中配置 2.在AddSwaggerGen方法中配置Incl…

SLAM算法与工程实践——雷达篇:Livox激光雷达使用

SLAM算法与工程实践系列文章 下面是SLAM算法与工程实践系列文章的总链接,本人发表这个系列的文章链接均收录于此 SLAM算法与工程实践系列文章链接 下面是专栏地址: SLAM算法与工程实践系列专栏 文章目录 SLAM算法与工程实践系列文章SLAM算法与工程实践…

C++设计模式 #3策略模式(Strategy Method)

动机 在软件构建过程中,某些对象使用的的算法可能多种多样,经常改变。如果将这些算法都写在类中,会使得类变得异常复杂;而且有时候支持不频繁使用的算法也是性能负担。 如何在运行时根据需求透明地更改对象的算法?将…

ceph块存储学习

目录 ceph的组件和功能 ceph的数据读写流程 ceph存储池学习 ceph的组件和功能 Ceph OSD:功能是存储数据,处理数据的复制、恢复、平衡数据分布,并将一些相关数据提供给Ceph Monitor,。 Ceph Monitor: 功能是维护整个集群健康状态&…

关于“Python”的核心知识点整理大全36

目录 13.4.4 向下移动外星人群并改变移动方向 game_functions.py alien_invasion.py 13.5 射杀外星人 13.5.1 检测子弹与外星人的碰撞 game_functions.py alien_invasion.py 13.5.2 为测试创建大子弹 13.5.3 生成新的外星人群 game_functions.py alien_invasion.py …

怎么开启基于软件标签的kasan, CONFIG_KASAN_SW_TAGS=y

如果内核版本等于或大于5.0,那么需要在通用KASAN和基于软件标签的KASAN之间做出选择,前者的配置宏是CONFIG_KASAN_GENERIC,后者的配置宏是CONFIG_KASAN_SW_TAGS。menuconfig无法勾选CONFIG_KASAN_SW_TAGSy CONFIG_KASAN_SW_TAGS 依赖 CC_HAS…

python dash 的学习笔记1

dash 用python开发web界面 https://dash.plotly.com/ 官方上支持jula F# python一类。当然我只会python只学习python中使用dash. 要做一个APP,用php,java以及.net都可以写,只所有选择python是因为最近在用这一个。同时也发现python除了慢全是优点。 资料…

基于单片机设计的指纹锁(读取、录入、验证指纹)

一、前言 指纹识别技术是一种常见的生物识别技术,利用每个人指纹的唯一性进行身份认证。相比于传统的密码锁或者钥匙锁,指纹锁具有更高的安全性和便利性,以及防止钥匙丢失或密码泄露的优势。 基于单片机设计的指纹锁项目是利用STC89C52作为…

基于Java Web的“萌宠小知识”网站设计与实现论文

摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统萌宠小知识信息管理难度大,容错率低&#xff…

java: -source 7 中不支持 lambda 表达式 (请使用 -source 8 或更高版本以启用 lambda 表达式)

目录 1、检查项目中 JDK 的设置: 2、检查模块中 JDK 的设置: 3、检查Idea 中的SDK设置 4、检查 IDEA 中 JDK 的设置(我出现的问题在这): 今天遇见了一个报错: 问题产生的原因是 JDK 版本太低&#xf…

1215. 小朋友排队(权值树状数组求逆序数)

题目: 1215. 小朋友排队 - AcWing题库 思路:权值树状数组 1.权值树状数组的模板与树状数组一样没有变化,但树状数组tr[]中存储的内容以及add和query的含义发生了变化。 2.tr[]~ 树状数组:存储的是区间和;权值树状数…

tcp 的限制 (TCP_WRAPPERS)

#江南的江 #每日鸡汤:青春是打开了就合不上的书,人生是踏上了就回不了头的路,爱情是扔出了就收不回的赌注。 #初心和目标:拿到高级网络工程师 TCP_WRAPPERs Tcp_wrappers 对于七层模型中是位于第四层的安全工具,他…

Redis数据一致解决方案

文章目录 前言技术积累查询缓存业务流程更新缓存业务流程 更新缓存问题解决方案写在最后 前言 当前的应用服务很多都有着高并发的业务场景,对于高并发的解决方案一般会用到缓存来降低数据库压力,并且还能够提高系统性能减少请求耗时,比如我们…

西南交通大学【数电实验之modelsim的使用】

由于后面的实验和考试时的仿真全部用modelsim,所以出一期modelsim的使用。 一、准备工作 1.找到modelsim 可以将其拖到桌面上。 2.Quartus的准备 这里以笔者考试时的代码为例,代码如下图所示 是产生一个周期性的110100序列。 在编写好代码后&#x…

【redis笔记】

Redis简介 安装步骤 Redis存储的是key-value结构的数据,其中key是字符串类型,value有5种常用的数据类型: 字符串string ​ 哈希hash 适合存储对象 列表list 按照插入顺序排序,可以有重复元素 集合set 无序集合,没…