关于“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条件)是确定某点为极值点的必要条件。如果所讨论的规划是凸规划,那么库恩-塔克条件也是充分条件。 ÿ…...
【数据结构之顺序表】
数据结构学习笔记---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、手机删掉证书,重新下载安装。 (如果还不行,重新试一遍,先把浏览器…...
单片机原理及应用:流水灯的点亮
流水灯是一种简单的单片机控制电路,由许多LED组成,电路工作时LED会按顺序点亮,类似于流水的效果。 下面是运行在keil上的代码,分别使用了数组,移位符和库函数来表示。 //数组法 #include <reg52.h> //头文…...
蓝桥杯宝藏排序算法(冒泡、选择、插入)
冒泡排序: def bubble_sort(li): # 函数方式for i in range(len(li)-1):exchangeFalsefor j in range(len(li)-i-1):if li[j]>li[j1]:li[j],li[j1]li[j1],li[j]exchangeTrueif not exchange:return 选择排序: 从左往右找到最小的元素,放在起始位置…...
使用@jiaminghi/data-view实现一个数据大屏
<template><div class"content bg"><!-- 全局容器 --><!-- <dv-full-screen-container> --><!-- 第二行 --><div class"module-box" style"align-items: start; margin-top: 10px"><!-- 左 -->…...
神经网络:池化层知识点
1.CNN中池化的作用 池化层的作用是对感受野内的特征进行选择,提取区域内最具代表性的特征,能够有效地减少输出特征数量,进而减少模型参数量。按操作类型通常分为最大池化(Max Pooling)、平均池化(Average Pooling)和求和池化(Sum Pooling)&a…...
微服务常见的配置中心简介
微服务架构中,常见的配置中心包括以下几种: Spring Cloud Config: Spring Cloud Config是官方推荐的配置中心解决方案,它支持将配置文件存储在Git、SVN等版本控制系统中。通过提供RESTful API,各个微服务可以远程获取和…...
银河麒麟v10 rpm安装包 安装mysql 8.35
银河麒麟v10 rpm安装包 安装mysql 8.35 1、卸载mariadb2、下载Mysql安装包3、安装Mysql 8.353.1、安装Mysql 8.353.3、安装后配置 1、卸载mariadb 由于银河麒麟v10系统默认安装了mariadb 会与Mysql相冲突,因此首先需要卸载系统自带的mariadb 查看系统上默认安装的M…...
一篇文章带你搞定CTFMice基本操作
CTF比赛是在最短时间内拿到最多的flag,mice必须要有人做,或者一支战队必须留出一块时间专门写一些mice,web,pwn最后的一两道基本都会有难度,这时候就看mice的解题速度了! 说实话,这是很大一块&…...
Spring security之授权
前言 本篇为大家带来Spring security的授权,首先要理解一些概念,有关于:权限、角色、安全上下文、访问控制表达式、方法级安全性、访问决策管理器 一.授权的基本介绍 Spring Security 中的授权分为两种类型: 基于角色的授权&…...
模式识别与机器学习(十一):Bagging
1.原理 Bagging [Breiman, 1996a] 是井行式集成学习方法最著名的代表.从名字即可看出,它直接基于自助采样法(bootstrap sampling)。给定包含m 个样本的数据集,我们先随机取出一个样本放入采样集中,再把该样本放回初始数据集,使得…...
数据压缩(哈夫曼编码)
【问题描述】在数据压缩问题中,需要将数据文件转换成由二进制字符0、1组成的二进制串,称之为编码,已知待压缩的数据中包含若干字母(A-Z),为获得更好的空间效率,请设计有效的用于数据压缩的二进制…...
移动安全APP--Frida+模拟器,模拟器+burp联动
最近测APP被通报了,问题点测得比较深,涉及到frida和burp抓包,一般在公司可能会有网络的限制,手机没办法抓包,我就直接在模拟器上试了,就在这记录一下安装过程。 目录 一、Frida安装 二、burp与逍遥模拟器…...
做网站时图片的分辨率是多少/怎么让网站快速收录
Zynq-7000 系列的亮点在于它包含了完整的 ARM 处理子系统,每一颗 Zynq-7000 系列处理器都包含了双核的CortexTM-A9 处理器,整个处理器的搭建都以处理器为中心,而该处理器子系统中集成了内存控制器和大量的外设, 使 CortexTM-A9 的…...
松北建设局网站/51link友链
最近项目上有一个需求,在api上收到的请求,需要在springmvc转化成实体参数之前把request body读取出来记录日志。 在通常的响应流程上,使用了request.getInputStream()之后,流就会失效,即这个request body的流只能读取一…...
世界工厂采购网登录/seo领导屋
5月24日,神州专车正式入驻浙江省嘉兴市,并获得由嘉兴市交通运输管理局颁发的《网络预约出租汽车经营许可证》,成为当地首家合法化运营的网约车平台。同时,首批300辆神州专车将陆续投放市场,为市民提供安全、舒适、标准…...
网站制作论文题目/磁力引擎
1、通过VMWare给linux系统添加一个新硬盘 2、重启linux系统,键入 fdisk –l 命令查看新增硬盘的盘符(通常会有 “doesnt contain a valid partion table”的提示信息),假设为 /dev/sdb 3、fdisk /dev/sdb 注意扩展(e…...
新乡公司做网站/广州市口碑seo推广外包
tomcat探究二搭建简单的servlet容器说明代码HttpServerRequestResponseServletServletProcessorTestControllerServlet请求测试说明 HttpServer:容器服务入口,监听一个端口 Request:对请求报文做处理,获取http请求报文第一行的资源路径 Response:延续 探究一 的内容 Servlet:自…...
wordpress主题模板中国/网络营销服务
1、Spring下载地址http://repo.spring.io/release/org/springframework/spring/ 里面有各自版本下载: 方法二: 1、在百度中输入Spring 2、进入spring.io官网 3、点击上面导航中PROJECTS,然后选择SPRING FRAMEWORK 4、任意选择一个点击Referen…...