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

目录

12.6.4 调整飞船的速度

settings.py

ship.py

alien_invasion.py

12.6.5 限制飞船的活动范围

ship.py

12.6.6 重构 check_events()

game_functions.py

12.7 简单回顾

12.7.1 alien_invasion.py

12.7.2 settings.py

12.7.3 game_functions.py

12.7.4 ship.py

12.8 射击

12.8.1 添加子弹设置

settings.py

12.8.2 创建 Bullet 类

bullet.py

bullet.py

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

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

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


12.6.4 调整飞船的速度

当前,每次执行while循环时,飞船最多移动1像素,但我们可以在Settings类中添加属性 ship_speed_factor,用于控制飞船的速度。我们将根据这个属性决定飞船在每次循环时最多移动 多少距离。下面演示了如何在settings.py中添加这个新属性:

settings.py
class Settings():"""一个存储游戏《外星人入侵》的所有设置的类"""def __init__(self):--snip--# 飞船的设置self.ship_speed_factor = 1.5 

我们将ship_speed_factor的初始值设置成了1.5。需要移动飞船时,我们将移动1.5像素而不 是1像素。 通过将速度设置指定为小数值,可在后面加快游戏的节奏时更细致地控制飞船的速度。然而, rect的centerx等属性只能存储整数值,因此我们需要对Ship类做些修改:

ship.py
class Ship():
1 def __init__(self, ai_settings, screen):"""初始化飞船并设置其初始位置"""self.screen = screen
2 self.ai_settings = ai_settings--snip--# 将每艘新飞船放在屏幕底部中央--snip--# 在飞船的属性center中存储小数值
3 self.center = float(self.rect.centerx)
# 移动标志
self.moving_right = False
self.moving_left = Falsedef update(self):"""根据移动标志调整飞船的位置"""# 更新飞船的center值,而不是rectif self.moving_right:
4 self.center += self.ai_settings.ship_speed_factorif self.moving_left:self.center -= self.ai_settings.ship_speed_factor# 根据self.center更新rect对象
5 self.rect.centerx = self.centerdef blitme(self):--snip-- 

在1处,我们在__init__()的形参列表中添加了ai_settings,让飞船能够获取其速度设置。 接下来,我们将形参ai_settings的值存储在一个属性中,以便能够在update()中使用它(见2)。 鉴于现在调整飞船的位置时,将增加或减去一个单位为像素的小数值,因此需要将位置存储在一 个能够存储小数值的变量中。可以使用小数来设置rect的属性,但rect将只存储这个值的整数部 分。为准确地存储飞船的位置,我们定义了一个可存储小数值的新属性self.center(见)。我 们使用函数float()将self.rect.centerx的值转换为小数,并将结果存储到self.center中。 现在在update()中调整飞船的位置时,将self.center的值增加或减去ai_settings.ship_ speed_factor的值(见3)。更新self.center后,我们再根据它来更新控制飞船位置的 self.rect.centerx(见4)。self.rect.centerx将只存储self.center的整数部分,但对显示飞船 而言,这问题不大。 在alien_invasion.py中创建Ship实例时,需要传入实参ai_settings:

alien_invasion.py
--snip--
def run_game():--snip--# 创建飞船ship = Ship(ai_settings, screen)--snip-- 

现在,只要ship_speed_factor的值大于1,飞船的移动速度就会比以前更快。这有助于让飞 船的反应速度足够快,能够将外星人射下来,还让我们能够随着游戏的进行加快游戏的节奏。

12.6.5 限制飞船的活动范围

当前,如果玩家按住箭头键的时间足够长,飞船将移到屏幕外面,消失得无影无踪。下面来 修复这种问题,让飞船到达屏幕边缘后停止移动。为此,我们将修改Ship类的方法update():

ship.py
def update(self):"""根据移动标志调整飞船的位置"""# 更新飞船的center值,而不是rect
1 if self.moving_right and self.rect.right < self.screen_rect.right:self.center += self.ai_settings.ship_speed_factor
2 if self.moving_left and self.rect.left > 0:self.center -= self.ai_settings.ship_speed_factor# 根据self.center更新rect对象self.rect.centerx = self.center

上述代码在修改self.center的值之前检查飞船的位置。self.rect.right返回飞船外接矩形 的右边缘的x坐标,如果这个值小于self.screen_rect.right的值,就说明飞船未触及屏幕右边缘 (见1)。左边缘的情况与此类似:如果rect的左边缘的x坐标大于零,就说明飞船未触及屏幕左 边缘(见2)。这确保仅当飞船在屏幕内时,才调整self.center的值。 如果此时运行alien_invasion.py,飞船将在触及屏幕左边缘或右边缘后停止移动。

12.6.6 重构 check_events()

随着游戏开发的进行,函数check_events()将越来越长,我们将其部分代码放在两个函数中: 一个处理KEYDOWN事件,另一个处理KEYUP事件:

game_functions.py
def check_keydown_events(event, ship):"""响应按键"""if event.key == pygame.K_RIGHT:ship.moving_right = Trueelif event.key == pygame.K_LEFT:ship.moving_left = True
def check_keyup_events(event, ship):"""响应松开"""if event.key == pygame.K_RIGHT:ship.moving_right = Falseelif event.key == pygame.K_LEFT:ship.moving_left = False
def check_events(ship):"""响应按键和鼠标事件"""for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()elif event.type == pygame.KEYDOWN:check_keydown_events(event, ship)elif event.type == pygame.KEYUP:check_keyup_events(event, ship) 

我们创建了两个新函数:check_keydown_events()和check_keyup_events(),它们都包含形参 event和ship。这两个函数的代码是从check_events()中复制而来的,因此我们将函数check_events 中相应的代码替换成了对这两个函数的调用。现在,函数check_events()更简单,代码结构更清 晰。这样,在其中响应其他玩家输入时将更容易。

12.7 简单回顾

下一节将添加射击功能,这需要新增一个名为bullet.py的文件,并对一些既有文件进行修改。 当前,我们有四个文件,其中包含很多类、函数和方法。添加其他功能之前,为让你清楚这个项 目的组织结构,先来回顾一下这些文件。

12.7.1 alien_invasion.py

主文件alien_invasion.py创建一系列整个游戏都要用到的对象:存储在ai_settings中的设置、 存储在screen中的主显示surface以及一个飞船实例。文件alien_invasion.py还包含游戏的主循环, 这是一个调用check_events()、ship.update()和update_screen()的while循环。 要 玩 游 戏 《 外 星 人 入 侵 》, 只 需 运 行 文 件alien_invasion.py。其他文件(settings.py、 game_functions.py、ship.py)包含的代码被直接或间接地导入到这个文件中。

12.7.2 settings.py

文件settings.py包含Settings类,这个类只包含方法__init__(),它初始化控制游戏外观和飞 船速度的属性。

12.7.3 game_functions.py

文件game_functions.py包含一系列函数,游戏的大部分工作都是由它们完成的。函数 check_events()检测相关的事件,如按键和松开,并使用辅助函数check_keydown_events()和 check_keyup_events()来处理这些事件。就目前而言,这些函数管理飞船的移动。模块 game_functions还包含函数update_screen(),它用于在每次执行主循环时都重绘屏幕。

12.7.4 ship.py

文件ship.py包含Ship类,这个类包含方法__init__()、管理飞船位置的方法update()以及在 屏幕上绘制飞船的方法blitme()。表示飞船的图像存储在文件夹images下的文件ship.bmp中。

12.8 射击

下面来添加射击功能。我们将编写玩家按空格键时发射子弹(小矩形)的代码。子弹将在屏 幕中向上穿行,抵达屏幕上边缘后消失。

12.8.1 添加子弹设置

首先,更新settings.py,在其方法__init__()末尾存储新类Bullet所需的值:

settings.py
 def __init__(self):--snip--# 子弹设置self.bullet_speed_factor = 1self.bullet_width = 3self.bullet_height = 15self.bullet_color = 60, 60, 60

这些设置创建宽3像素、高15像素的深灰色子弹。子弹的速度比飞船稍低。

12.8.2 创建 Bullet 类

下面来创建存储Bullet类的文件bullet.py,其前半部分如下:

bullet.py
import pygame
from pygame.sprite import Sprite
class Bullet(Sprite):"""一个对飞船发射的子弹进行管理的类"""def __init__(self, ai_settings, screen, ship):"""在飞船所处的位置创建一个子弹对象"""super(Bullet, self).__init__()self.screen = screen# 在(0,0)处创建一个表示子弹的矩形,再设置正确的位置
1 self.rect = pygame.Rect(0, 0, ai_settings.bullet_width,ai_settings.bullet_height)
2 self.rect.centerx = ship.rect.centerx
3 self.rect.top = ship.rect.top #存储用小数表示的子弹位置
4 self.y = float(self.rect.y)
5 self.color = ai_settings.bullet_colorself.speed_factor = ai_settings.bullet_speed_factor

Bullet类继承了我们从模块pygame.sprite中导入的Sprite类。通过使用精灵,可将游戏中相 关的元素编组,进而同时操作编组中的所有元素。为创建子弹实例,需要向__init__()传递 ai_settings、screen和ship实例,还调用了super()来继承Sprite。


注意 代码super(Bullet, self).__init__()使用了Python 2.7语法。这种语法也适用于Python 3, 但你也可以将这行代码简写为super().__init__()。


在1处,我们创建了子弹的属性rect。子弹并非基于图像的,因此我们必须使用pygame.Rect() 类从空白开始创建一个矩形。创建这个类的实例时,必须提供矩形左上角的x坐标和y坐标,还有 矩形的宽度和高度。我们在(0, 0)处创建这个矩形,但接下来的两行代码将其移到了正确的位置, 因为子弹的初始位置取决于飞船当前的位置。子弹的宽度和高度是从ai_settings中获取的。

在2处,我们将子弹的centerx设置为飞船的rect.centerx。子弹应从飞船顶部射出,因此我 们将表示子弹的rect的top属性设置为飞船的rect的top属性,让子弹看起来像是从飞船中射出的 (见3)。 我们将子弹的y坐标存储为小数值,以便能够微调子弹的速度(见4)。在5处,我们将子弹 的颜色和速度设置分别存储到self.color和self.speed_factor中。 下面是bullet.py的第二部分——方法update()和draw_bullet():

bullet.py
def update(self):"""向上移动子弹"""#更新表示子弹位置的小数值
1 self.y -= self.speed_factor#更新表示子弹的rect的位置
2 self.rect.y = self.ydef draw_bullet(self):"""在屏幕上绘制子弹"""
3 pygame.draw.rect(self.screen, self.color, self.rect) 

方法update()管理子弹的位置。发射出去后,子弹在屏幕中向上移动,这意味着y坐标将不 断减小,因此为更新子弹的位置,我们从self.y中减去self.speed_factor的值(见1)。接下来, 我们将self.rect.y设置为self.y的值(见2)。属性speed_factor让我们能够随着游戏的进行或根 据需要提高子弹的速度,以调整游戏的行为。子弹发射后,其x坐标始终不变,因此子弹将沿直 线垂直地往上穿行。需要绘制子弹时,我们调用draw_bullet()。函数draw.rect()使用存储在self.color中的颜色 填充表示子弹的rect占据的屏幕部分(见3)。


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

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

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


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

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

相关文章

JavaGUI(但期末速成版)之JFrame和JDialog

前言 学到期末发现越来越没时间来细写这些东西了&#xff0c;毕竟蒟蒻博主的发展方向主要需要学的不是Java&#xff0c;但为了期末高分通过&#xff0c;也不得不花一些精力上来&#xff0c;于是有了这样一篇速成GUI&#xff0c;本篇会以十分精简的语言来学习&#xff0c;主打一…

CN3302 PFM升压型双节电池充电控制集成电路外置MOS管 双节锂电池充电IC

CN3302是一款工作于2.7V到6.5V的PFM升压型双节鲤电池充电控制集成电路。CN3302采用恒流和准恒压模式(Quasi-CVTM)对电池进行充电管理&#xff0c;内部集成有基准电压源&#xff0c;电感电流检测单元&#xff0c;电池电压检测电路和片外场效应品体管驱动电路等&#xff0c;具有外…

企业网络常用技术-快速生成树RSTP原理与配置

STP协议虽然能够解决环路问题&#xff0c;但是收敛速度慢&#xff0c;影响了用户通信质量。如果STP网络的拓扑结构频繁变化&#xff0c;网络也会频繁失去连通性&#xff0c;从而导致用户通信频繁中断。IEEE于2001年发布的802.1w标准定义了快速生成树协议RSTP&#xff08;Rapid …

微信基于StarRocks的湖仓一体实践

作者&#xff1a;StarRocks Active Contributer、微信 OLAP 内核研发工程师 微信作为国内活跃用户最多的社交软件&#xff0c;其数据平台建设经历了从 Hadoop 到 ClickHouse 亚秒级实时数仓的阶段&#xff0c;但仍旧面临着数据体验割裂、存储冗余的问题。通过 StarRocks 的湖仓…

时钟偏移与时钟抖动

1、时钟偏移 如下图所示&#xff0c;由于布局布线导致&#xff0c;clk到达三个触发器的时间是不一样的。这个就是时钟偏移&#xff0c;对每个触发器而言&#xff0c;不会改变时钟周期。 2、时钟抖动 如下图所示&#xff0c;指芯片的某一个给定点上时钟周期发生暂时性变化&…

【Spring】15 ApplicationContextAware 接口

文章目录 1. 简介2. 作用3. 使用3.1 创建并实现接口3.2 配置 Bean 信息3.3 创建启动类3.4 启动 4. 应用场景总结 Spring 框架提供了许多回调接口&#xff0c;用于在 Bean 的生命周期中执行特定的操作。ApplicationContextAware 接口是其中之一&#xff0c;它允许 Bean 获取对 A…

SM5321 是一款带动态路径管理的开关型单节锂电池充电电路。

SM5321 2.5A.1MHz 带动态路径管理的开关型单节锂电池充电电路 简介&#xff1a; SM5321 是一款带动态路径管理的开关型单节锂电池充电电路。SM5321 可提供 2.5A 的充电电流&#xff0c;特别适合移动电源、平板电脑等配备超大容量锂电池的设备。SM5321 内部集成了大电流同步降压…

SpringBoot 使用Quartz执行定时任务对象时无法注入Bean问题

文章目录 问题描述解决方案结束语 大家好&#xff01;今天是2023年12月212日 | 农历十一月初九(距离2024年还有一周左右的时间)&#xff0c;最近还是比较忙的&#xff0c;忙着搞钱&#xff0c;毕竟马上过年啦。 问题描述 感谢大家对我一直以来的支持与帮助&#xff0c;今天这边…

IDEA 黑色主题很难看到鼠标

“控制面板”—搜索“鼠标”关键字—选择“更改鼠标设置” 参考&#xff1a; IDEA 黑色主题很难看到鼠标

JDBC常见的几种连接池使用(C3PO、Druid、HikariCP 、DBCP)

✨前言✨ 本篇作为主要在于介绍jdbc数据库连接池&#xff0c;以及多种连接池的用法 &#x1f352;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f4dd;私信必回哟&#x1f601; &#x1f352;博主将持续更新学习记录收获&#xff0c;友友们有任何问题可以在评论区留言 文章目…

计算机基础:网络基础

目录 一.网线制作 1.制作所需要工具 网线制作标准 ​编辑 2.水晶头使用 3.网线钳使用 4.视频教学 二.集线器、交换机介绍 1.OSI七层模型 2.TCP/IP四层参考模型 3.集线器、交换机。路由器介绍 集线器 交换机 路由器 区别 三.路由器的配置 1.路由器设置 说明书 设…

智能优化算法应用:基于水基湍流算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于水基湍流算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于水基湍流算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.水基湍流算法4.实验参数设定5.算法结果6.…

Python:正则表达式---贪婪匹配

在正则表达式中&#xff0c;贪婪匹配是指匹配尽可能多的字符&#xff0c;而非贪婪匹配&#xff08;也称为懒惰匹配或最小匹配&#xff09;则是匹配尽可能少的字符。 .* 表示匹配任意数量的任意字符&#xff08;除换行符外&#xff09;。贪婪匹配会将尽可能多的字符都作为匹配结…

macOS 安装 oh-my-zsh 后 node 报错 command not found : node

最近为了让终端中显示 git 分支的名称&#xff0c;安装了 oh-my-zsh &#xff0c;安装之后呢&#xff0c;我原先安装的 Volta、 node 都没法用了&#xff0c;报错如下&#xff1a; 这时候粗略判断应该是系统变量出了问题&#xff0c;oh-my-zsh 的变量文件是 ~/.zshrc&#xff0…

变分自动编码器【03/3】:使用 Docker 和 Bash 脚本进行超参数调整

一、说明 在深入研究第 1 部分中的介绍和实现&#xff0c;并在第 2 部分中探索训练过程之后&#xff0c;我们现在将重点转向在第 3 部分中通过超参数调整来优化模型的性能。要访问本系列的完整代码&#xff0c;请访问我们的 GitHub 存储库在GitHub - asokraju/ImageAutoEncoder…

Linux(二)常用命令

文章目录 一、文件管理命令1.1 chmod1.2 chown1.3 cat1.4 cp1.5 find1.6 head1.7 tail1.8 less1.9 more1.10 mv1.11 rm1.12 touch1.13 vim1.14 >和>>1.15 scp1.16 ln1.17 怎么用命令查看日志 二、文档管理命令2.1 grep2.2 wc2.3 echo 三、磁盘管理命令3.1 cd3.2 df3.3…

短视频账号矩阵系统3年独立开发正规接口源码搭建部署开发

一、矩阵系统源码主要有三种框架&#xff1a; 短视频账号矩阵源码的框架有很多种&#xff0c;以下列举其中几种&#xff1a; 1. **星图矩阵**&#xff1a;星图矩阵是抖音官方向商家提供的短视频广告推广平台&#xff0c;是抖音官方的赚钱工具。商家可利用星图矩阵进行广告推广…

适用于车载电动升窗器的解决方案

升窗器是指避免车主忘记关窗的自动关窗装置&#xff0c;主要通过电子模块加认组合&#xff0c;利用主机上的芯片里面设定的程序完成检测功能&#xff0c;使自动升窗步骤顺利完成。 ■ 基于ACM32F403系列MCU ■ 高性价比软件控制方案&#xff0c;高算力 ■ MCU内置2路CAN总线&a…

为什么项目管理工具需要项目财务信息?

在讨论项目时&#xff0c;钱是绕不开的话题。 资金是项目管理中最重要的因素之一&#xff0c;与范围和时间并列&#xff0c;三者共同构成了 “三重约束”。例如&#xff0c;如果缩短项目时间&#xff0c;就必须增加成本。 如果无法清楚了解开支及其对项目的影响&#xff08;反…

Python接口自动化测试:断言封装详解

前言 在进行API接口测试时&#xff0c;断言起着至关重要的作用。断言是用于验证预期结果与实际结果是否一致的过程。在Python中&#xff0c;我们可以利用一些库来实现断言功能。 1. 安装必要的库 在Python中&#xff0c;我们主要会使用两个库&#xff1a;requests和jsonpath…