关于“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博客
往期快速传送门👆(在文章最后):
感谢大家的支持!欢迎订阅收藏!专栏将持续更新!
相关文章:
关于“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 …...
【krita】实时绘画 入门到精通 海报+电商+装修+人物
安装插件 首先打开comfyUI,再打开krita,出现问题提示, 打开 cd custom_nodes 输入命令 安装控件 git clone https://github.com/Acly/comfyui-tooling-nodes.git krita基础设置 设置模型 设置lora (可设置lora强度 增加更多…...
云原生系列2-CICD持续集成部署-GitLab和Jenkins
1、CICD持续集成部署 传统软件开发流程: 1、项目经理分配模块开发任务给开发人员(项目经理-开发) 2、每个模块单独开发完毕(开发),单元测试(测试) 3、开发完毕后,集成部…...
50ms时延工业相机
华睿工业相机A3504CG000 参数配置: 相机端到端理论时延:80ms 厂家同步信息,此款设备帧率上线23fps,单帧时延:43.48ms,按照一图缓存加上传输显示的话,厂家预估时延在:80ms 厂家还有…...
CPU缓存一致性问题
什么是可见性问题? Further Reading :什么是可见性问题? 缓存一致性 内存一致性 内存可见性 顺序一致性区别 CPU缓存一致性问题 由于CPU缓存的出现,很好地解决了处理器与内存速度之间的矛盾,极大地提高了CPU的吞吐能…...
35道HTML高频题整理(附答案背诵版)
1、简述 HTML5 新特性 ? HTML5 是 HTML 的最新版本,它引入了很多新的特性和元素,以提供更丰富的网页内容和更好的用户体验。以下是一些主要的新特性: 语义元素:HTML5 引入了新的语义元素,像 <article&g…...
【powershell】Windows环境powershell 运维之历史文件压缩清理
🦄 个人主页——🎐开着拖拉机回家_Linux,大数据运维-CSDN博客 🎐✨🍁 🪁🍁🪁🍁🪁🍁🪁🍁 🪁🍁🪁&am…...
【Linux】Linux线程概念和线程控制
文章目录 一、Linux线程概念1.什么是线程2.线程的优缺点3.线程异常4.线程用途5.Linux进程VS线程 二、线程控制1.线程创建2.线程终止3.线程等待4.线程分离 一、Linux线程概念 1.什么是线程 线程是进程内的一个执行流。 我们知道,一个进程会有对应的PCB,…...
Flink cdc3.0同步实例(动态变更表结构、分库分表同步)
文章目录 前言准备flink环境docker构建mysql、doris环境数据准备 通过 FlinkCDC cli 提交任务整库同步同步变更路由变更路由表结构不一致无法同步 结尾 前言 最近Flink CDC 3.0发布, 不仅提供基础的数据同步能力。schema 变更自动同步、整库同步、分库分表等增强功…...
国产Apple Find My认证芯片哪里找,伦茨科技ST17H6x芯片可以帮到您
深圳市伦茨科技有限公司(以下简称“伦茨科技”)发布ST17H6x Soc平台。成为继Nordic之后全球第二家取得Apple Find My「查找」认证的芯片厂家,该平台提供可通过Apple Find My认证的Apple查找(Find My)功能集成解决方案。…...
肺癌相关知识
写在前面 大概想了解下肺癌相关的知识,开此贴做记录,看看后续有没有相关的生信文章思路。 综述 文章名期刊影响因子Lung cancer immunotherapy: progress, pitfalls, and promisesMol Cancer37.3 常见治疗手段有surgery, radiation therapy, chemoth…...
ChimeraX使用教程-安装及基本操作
ChimeraX使用教程-安装及基本操作 1、访问https://www.cgl.ucsf.edu/chimerax/download.html进行下载,然后安装 安装完成后,显示界面 2、基本操作 1、点击file,导入 .PDB 文件。 (注:在 alphafold在线预测蛋白》点…...
【小黑嵌入式系统第十一课】μC/OS-III程序设计基础(一)——任务设计、任务管理(创建基本状态内部任务)、任务调度、系统函数
上一课: 【小黑嵌入式系统第十课】μC/OS-III概况——实时操作系统的特点、基本概念(内核&任务&中断)、与硬件的关系&实现 文章目录 一、任务设计1.1 任务概述1.2 任务的类型1.2.1 单次执行类任务(运行至完成型&#…...
Redis一些常用的技术
文章目录 第1关:Redis 事务与锁机制第2关:流水线第3关:发布订阅第4关:超时命令第5关:使用Lua语言 第1关:Redis 事务与锁机制 编程要求 根据提示,在右侧编辑器Begin-End补充代码,根据…...
基于QPainter 绘图图片绕绘制设备中心旋转
项目地址:https://gitcode.com/m0_45463480/QPainter/tree/main 获取途径:进入CSDN->GitCode直接下载或者通过git拉取仓库内容。 QPainter是Qt框架中的一个类,用于在QWidget或QPixmap等设备上进行绘图操作。它提供了丰富的绘图功能,可以用于绘制线条、图形、文本等。Q…...
计算机网络(4):网络层
网络层提供的两种服务 虚电路服务(Virtual Circuit Service)和数据报服务(Datagram Service)是在网络层(第三层)提供的两种不同的通信服务。它们主要区别在于建立连接的方式和数据传输的方式。 虚电路服务…...
动态内存分配(malloc和free、calloc和realloc)
目录 一、为什么要有动态内存分配 二、C/C中程序内存区域划分 三、malloc和free 2.1、malloc 2.2、free 四、calloc和realloc 3.1、calloc 3.2、realloc 3.3realloc在调整内存空间的是存在两种情况: 3.4realloc有malloc的功能 五、常见的动…...
C语言---井字棋(三子棋)
Tic-Tac-Toe 1 游戏介绍和随机数1.1 游戏介绍1.2 随机数的生成1.3 棋盘大小和符号 2 设计游戏2.1 初始化棋盘2.2 打印棋盘2.3 玩家下棋2.4 电脑下棋2.5 判断输赢2.6 game()函数2.7 main()函数 3 完整三子棋代码3.1 Tic_Tac_Toe.h3.2 Tic_Tac_Toe.c3.3 Test.c 4 游戏代码的缺陷 …...
[Kubernetes]3. k8s集群Service详解
在上一节讲解了k8s 的pod,deployment,以及借助pod,deployment来部署项目,但会存在问题: 每次只能访问一个 pod,没有负载均衡自动转发到不同 pod访问还需要端口转发Pod重创后IP变了,名字也变了针对上面的问题,可以借助Service来解决,下面就来看看Service怎么使用 一.Service详…...
C++ 指定范围内递增初始化一个vector<int> | Python: list(range(31, 90))
通过lambda表达式 std::iota()实现: template <typename Tp> inline void print_vec(const std::vector<Tp>& vec) {fmt::print("[{}]\n", fmt::join(vec, ", ")); }// 相当于Python的lst list(range(31, 90))const std::ve…...
【Java之数据结构与算法】
选择排序 package Code01;public class Code01_SelectionSort {public static void selectionSort(int[] arr) {if(arrnull||arr.length<2) {return;}for(int i0;i<arr.length;i) {int minIndex i;for(int ji1;j<arr.length;j) {minIndex arr[minIndex] > arr[j…...
爬虫scrapy中间件的使用
爬虫scrapy中间件的使用 学习目标: 应用 scrapy中使用间件使用随机UA的方法应用 scrapy中使用代理ip的的方法应用 scrapy与selenium配合使用 1. scrapy中间件的分类和作用 1.1 scrapy中间件的分类 根据scrapy运行流程中所在位置不同分为: 下载中间件…...
普冉(PUYA)单片机开发笔记 [完结篇]:使用体会
失败的移植:FreeRTOS 当使用了 PY32F003 的各种接口和功能后,手痒痒想把 FreeRTOS 也搬到这个 MCU 上,参考 STM32 和 GD32 对 FreeRTOS 的移植步骤,把 FreeRTOS v202212.00 版本的源码搬到了 Keil 工程中,编译倒是通过…...
Elasticsearch:生成 AI 中的微调与 RAG
在自然语言处理 (NLP) 领域,出现了两种卓越的技术,每种技术都有其独特的功能:微调大型语言模型 (LLM) 和 RAG(检索增强生成)。 这些方法极大地影响了我们利用语言模型的方式,使它们更加通用和有效。 在本文…...
ip静态好还是dhcp好?
选择使用静态 IP 还是 DHCP(动态主机配置协议)取决于您的网络需求和环境。下面是它们的一些特点和适用场景: 静态 IP: 固定的 IP 地址:静态 IP 是手动配置在设备上的固定 IP 地址,不会随时间或网络变化而改…...
PolarDB-X、OceanBase、CockroachDB、TiDB二级索引写入性能测评
为什么要做这个测试 二级索引是关系型数据库相较于NoSQL数据库的一个关键差异。二级索引必须是强一致的,因此索引的写入需要与主键的写入放在一个事务当中,事务的性能是二级索引性能的基础。 目前市面上的分布式数据库中,从使用体验的角度看…...
Convolutional Neural Network(CNN)——卷积神经网络
1.NN的局限性 拓展性差 NN的计算量大性能差,不利于在不同规模的数据集上有效运行若输入维度发生变化,需要修改并重新训练网络容易过拟合 全连接导致参数量特别多,容易过拟合如果增加更多层,参数量会翻倍无法有效利用局部特征 输入…...
鸿蒙开发基本概念
1、开发准备 1.1、UI框架 HarmonyOS提供了一套UI开发框架,即方舟开发框架(ArkUI框架)。方舟开发框架可为开发者提供应用UI开发所必需的能力,比如多种组件、布局计算、动画能力、UI交互、绘制等。 方舟开发框架针对不同目的和技术…...
Open CV 图像处理基础:(二)从基本概念到实践操作
Open CV 图像处理基础:从基本概念到实践操作 一、引言 图像处理是计算机视觉领域的一个重要分支,它涉及对图像的各种操作和处理。了解图像的基本概念、读取和显示方法以及基本操作是图像处理的基础。本文将通过示例文章的形式,帮助初学者逐…...
【MAC】M2 安装docker 与 mysql
一、docker下载地址 下载地址 二、安装docker完成 罗列一下docker常用命令 # 查看docker版本 docker --version# 拉取镜像 docker pull 镜像名# 查看当前所有镜像 docker images# 查看运行中的容器 docker ps -a docker ps grep| 镜像名#镜像启动操作: sudo dock…...
涉密项目单位网站建设流程/手机网页制作软件
一、设置动态获取IP dhclient命令使用动态主机配置协议动态的配置网络接口的网络参数。 语法 dhclient(选项)(参数) 选项 0: 指定dhcp客户端监听的端口号; -d:总是以前台方式运行程序;-q:安静模式,不打印…...
wordpress logged in/seo诊断方案
前文回顾事务处理的四种分离水平(隔离级别)分离水平的设置注意事项 非提交读取(脏读)不可重复读取幻象读取总结: 前文回顾 在上篇博文史上最简单MySQL教程详解(进阶篇)之锁与事务处理分离水平&…...
上海做网站天锐/百度认证证书
前一段时间遇到的系统故障,以下是操作过程:大晚上收到该服务器内存超高告警,ps aux发现有大量的/usr/sbin/sendmail进程,一开始将其kill掉:ps -ax | grep sendmail | awk {print $1} | wc –l 统计了以下有1230个ps -a…...
网站建设技术/百分百营销软件官网
vcf文件做记录个体或群体突变的文件格式,在生物信息学应用中举足轻重。主流的生物信息分析软件,在处理变异信息时,也基本上需要考虑支持解析或输出vcf格式的文件。本文在介绍vcf文件格式的基本格式的同时,对vcf文件记录的细节进行…...
wap手机网站开发软件/北京疫情太严重了
Bash shell 中,熟记以下快捷键,将极大的提高你的命令行操作效率。 编辑命令 Ctrl a :移到命令行首 Ctrl e :移到命令行尾 Ctrl f :按字符前移(右向) Ctrl b :按字符后移&am…...
树莓派做网站/互联网培训
本篇文章给大家带来的内容是关于MySQL如何通过实例化对象参数查询数据 ?(源代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。public static string QueryByEntity(T t) where T : new(){ string resultstr s…...