当前位置: 首页 > news >正文

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

目录

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.5self.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减1stats.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_settingsself.reset_stats()# 让游戏一开始处于非活动状态self.game_active = Falsedef 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博客

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

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

相关文章:

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

目录 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_inva…...

Vivado中的FFT IP核使用(含代码)

本文介绍了Vidado中FFT IP核的使用,具体内容为:调用IP核>>配置界面介绍>>IP核端口介绍>>MATLAB生成测试数据>>测试verilogHDL>>TestBench仿真>>结果验证>>FFT运算。 1、调用IP核 该IP核对应手册pg109_xfft.pd…...

​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化

2022年亚马逊云科技re:Invent盛会于近日在拉斯维加斯成功召开,吸引了众多业界精英和创新者。亚马逊云科技边缘服务副总裁Jan Hofmeyr在演讲中分享了关于亚马逊云科技海外服务器边缘计算的最新发展和创新成果,引发与会者热烈关注。 re:Invent的核心主题是…...

什么是“人机协同”机器学习?

“人机协同”(HITL)是人工智能的一个分支,它同时利用人类智能和机器智能来创建机器学习模型。在传统的“人机协同”方法中,人们会参与一个良性循环,在其中训练、调整和测试特定算法。通常,它的工作方式如下…...

数学建模笔记-拟合算法

内容:拟合算法 一.概念: 拟合的结果就是找到一个确定的曲线 二.最小二乘法: 1. 2.最小二乘法的二表示的是平方的那个2 3.求解最小二乘法: 三.评价拟合的好坏 1.总体评分和SST: 2.误差平方和SSE: 3.回…...

非线性约束的优化问题_序列二次规划算法代码

1. 理论部分 2. 序列二次规划算法代码及解析 3.完整代码 1.理论部分 a.约束优化问题的极值条件 库恩塔克条件(Kuhn-Tucker conditions,KT条件)是确定某点为极值点的必要条件。如果所讨论的规划是凸规划,那么库恩-塔克条件也是充分条件。 &#xff…...

【数据结构之顺序表】

数据结构学习笔记---002 数据结构之顺序表1、介绍线性表1.1、什么是线性表? 2、什么是顺序表?2.1、概念及结构2.2、顺序表的分类 3、顺序表接口的实现3.1、顺序表动态存储结构的Seqlist.h3.1.1、定义顺序表的动态存储结构3.1.2、声明顺序表各个接口的函数 3.2、顺序表动态存储…...

junit-mock-dubbo

dubbo单元测试分两种情况 Autowired注解是启动上下文环境,使用上下文对象进行测试,适合调试代码 InjectMocks注解是启动上下文环境,使用mock对象替换上下文对象,适合单元测试 BaseTest *** Created by Luohh on 2023/2/10*/ S…...

json解析之fastjson和jackson使用对比

前言 最近项目中需要做埋点分析,首先就需要对埋点日志进行解析处理,刚好这时候体验对比了下fastjson和jackson两者使用的区别,以下分别是针对同一个json串处理,最终的效果都是将json数据解析出来,并统一展示。 一、fa…...

设计模式之-模板方法模式,通俗易懂快速理解,以及模板方法模式的使用场景

系列文章目录 设计模式之-6大设计原则简单易懂的理解以及它们的适用场景和代码示列 设计模式之-单列设计模式,5种单例设计模式使用场景以及它们的优缺点 设计模式之-3种常见的工厂模式简单工厂模式、工厂方法模式和抽象工厂模式,每一种模式的概念、使用…...

微软官方出品:GPT大模型编排工具,支持C#、Python等多个语言版本

随着ChatGPT的火热,基于大模型开发应用已经成为新的风口。虽然目前的大型模型已经具备相当高的智能水平,但它们仍然无法完全实现业务流程的自动化,从而达到用户的目标。 微软官方开源的Semantic Kernel的AI编排工具,就可以很好的…...

docker安装的php 在cli中使用

1: 修改 ~/.bashrc 中新增 php7 () {ttytty -s && tty--ttydocker run \$tty \--interactive \--rm \--volume /website:/website:rw \--workdir /website/project \--networkdnmp_dnmp \dnmp_php php "$" }–networkdnmp_dnmp 重要, 不然连不上数据库, 可通…...

tcp vegas 为什么好

我吹捧 bbr 时曾论证过它在和 buffer 拧巴的时候表现如何优秀,但这一次说 vegas 时,我说的是从拥塞控制这个问题本身看来,vegas 为什么好,并且正确。 接着昨天 tcp vegas 鉴赏 继续扯。 假设一群共享带宽的流量中有流量退出或有…...

【设计模式】命令模式

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、什么是命令模式? 二、命令模式的优点和应用场景 三、命令模式的要素和实现 3.1 命令 3.2 具体命令 3.3 接受者 …...

Unity头发飘动效果

Unity头发飘动 介绍动作做头发飘动头发骨骼绑定模拟物理组件 UnityChan插件下载UnityChan具体用法确定人物是否绑定好骨骼节点(要做的部位比如头发等)给人物添加SpringManager骨骼管理器给骨骼节点添加SpringBone这里给每个头发骨骼都添加上SpringBone。…...

【MIKE】MIKE河网编辑器操作说明

目录 MIKE河网编辑器说明河网定义河网编辑工具栏河网文件(.nwk11)输入步骤1. 从传统的地图引入底图1.1 底图准备1.2 引入河网底图1.3 输入各河段信息2. 从ARCView .shp文件引入底图MIKE河网编辑器说明 河网编辑器主要功能有两个: ①河网的编辑和参数输人,包括数字化河网及…...

RIPV1配置实验

查看路由器路由表: 删除手工配置的静态路由项: Route1->Config->static Remove删除路由项 删除Route3的路由项,方法同上删除Route2的路由项,方法同上 完成路由器RIP配置: Route1->Config->RIP->Ne…...

快速实现农业机械设备远程监控

农业机械设备远程监控解决方案 一、项目背景 近年来,农业生产事故时有发生,农业安全问题已经成为农业生产中的关键问题,农业监控系统在农业安全生产中发挥着重要作用。农业机械设备以计划维修或定期保养为主,在日常应用的过程中因…...

解决用Fiddler抓包,网页显示你的连接不是专用/私密连接

关键:重置fiddler的证书 在Fiddler重置证书 1、Actions --> Reset All Certificates --> 弹窗一路yes 2、关掉Fiddler,重新打开 3、手机删掉证书,重新下载安装。 (如果还不行,重新试一遍,先把浏览器…...

单片机原理及应用:流水灯的点亮

流水灯是一种简单的单片机控制电路&#xff0c;由许多LED组成&#xff0c;电路工作时LED会按顺序点亮&#xff0c;类似于流水的效果。 下面是运行在keil上的代码&#xff0c;分别使用了数组&#xff0c;移位符和库函数来表示。 //数组法 #include <reg52.h> //头文…...

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

【git】把本地更改提交远程新分支feature_g

创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

网络编程(UDP编程)

思维导图 UDP基础编程&#xff08;单播&#xff09; 1.流程图 服务器&#xff1a;短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

面向无人机海岸带生态系统监测的语义分割基准数据集

描述&#xff1a;海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而&#xff0c;目前该领域仍面临一个挑战&#xff0c;即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

恶补电源:1.电桥

一、元器件的选择 搜索并选择电桥&#xff0c;再multisim中选择FWB&#xff0c;就有各种型号的电桥: 电桥是用来干嘛的呢&#xff1f; 它是一个由四个二极管搭成的“桥梁”形状的电路&#xff0c;用来把交流电&#xff08;AC&#xff09;变成直流电&#xff08;DC&#xff09;。…...