关于“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博客

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

医院如何精进其设备漏费管理

加19339904493(康) 医院如何精进其漏费管理,以杜绝利用职务之便的私收费现象?医疗设备防漏费系统系统在此背景下应运而生,但其成熟度究竟如何?尤其在中国这个人情交织的社会环境中,某些医院的医…

叮咚,微信年度聊天报告(圣诞节版)请查收~丨GitHub star 16.8k+

微信年度聊天报告——圣诞节特别版,快发给心仪的ta吧~ 开源地址 GitHub开源地址:https://github.com/LC044/WeChatMsg 我深信有意义的不是微信,而是隐藏在对话框背后的一个个深刻故事。未来,每个人都能拥有AI的陪伴,…

【内存泄漏】Malloc Debug 和 libmenunreacbale 原理介绍

内存泄漏检测原理介绍 malloc debug 原理介绍 分为初始化和内存泄漏检测两个阶段介绍。 初始化阶段 整体流程如下图 libc 初始化时通过 __libc_init_malloc 函数调用 MallocInitImpl 来初始化 memory allocation framework。 // malloc_common_dynamic.cpp static const…

N-136基于springboot,vue在线聊天系统

开发工具:IDEA 服务器:Tomcat9.0, jdk1.8 项目构建:maven 数据库:mysql5.7 系统分前后台,项目采用前后端分离 前端技术:TypeScriptVue3.0ElementUI-Plus 服务端技术:springboo…

基于ssm医院预约挂号系统的设计与实现论文

医院预约挂号系统 摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了医院预约挂号系统的开发全过程。通过分析医院预约挂号系统管理的不足,创建了一个计算机管理医院预约挂号系统的方案。文章介绍了…

【Python】基于flaskMVT架构与session实现博客前台登录登出功能

目录 一、MVT说明 1.Model层 2.View层 3.Template层 二、功能说明 三、代码框架展示 四、具体代码实现 models.py 登录界面前端代码 博客界面前端代码(profile.html) main.py 一、MVT说明 MVT架构是Model-View-Template的缩写,是…

初识大数据,一文掌握大数据必备知识文集(3)

🏆作者简介,普修罗双战士,一直追求不断学习和成长,在技术的道路上持续探索和实践。 🏆多年互联网行业从业经验,历任核心研发工程师,项目技术负责人。 🎉欢迎 👍点赞✍评论…

人工智能_机器学习071_SVM支持向量机_人脸识别算法_LFW人脸数据加载_与理解---人工智能工作笔记0111

然后我们继续来看 这里有个lfw_home可以看到这个数据是,包含了人脸数据 然后我们继续看,在我们的顶你用户目录下,如果安装了,sklearn就会有这样一个目录, scikit_learn_data目录,这个里面可以看到 可以看到这个文件夹中有个 lfw_home文件夹是对.zip文件夹的解压,这个下载以后…

关于增强监控以检测针对Outlook Online APT活动的动态情报

一、基本内容 2023年6月,联邦民事行政部门(FCEB)在其Microsoft 365(M365)云环境中发现了可疑活动。该机构迅速向Microsoft和网络安全和基础设施安全局(CISA)报告了此情况。经过深入调查&#x…

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

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

bugku-misc-这是一张单纯的图片

附件:图片 1、查看属性 2、010 whex打开看看 可以看到html编码,将文件后缀,改成html,打开 即可

【Linux】进程周边007之进程控制

👀樊梓慕:个人主页 🎥个人专栏:《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》 🌝每一个不曾起舞的日子,都是对生命的辜负 目录 前言 1.进程创建 2.进程终止 2.…