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

目录

13.3.4 重构 create_fleet()

game_functions.py

13.3.5 添加行

game_functions.py

alien_invasion.py

13.4 让外星人群移动

13.4.1 向右移动外星人

settings.py

alien.py

alien_invasion.py

game_functions.py

13.4.2 创建表示外星人移动方向的设置

13.4.3 检查外星人是否撞到了屏幕边缘

alien.py

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

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


13.3.4 重构 create_fleet()

倘若我们创建了外星人群,也许应该让create_fleet()保持原样,但鉴于创建外星人的工作 还未完成,我们稍微清理一下这个函数。下面是create_fleet()和两个新函数,get_number_ aliens_x()和create_alien():

game_functions.py
1 def get_number_aliens_x(ai_settings, alien_width):"""计算每行可容纳多少个外星人"""available_space_x = ai_settings.screen_width - 2 * alien_widthnumber_aliens_x = int(available_space_x / (2 * alien_width))return number_aliens_x
def create_alien(ai_settings, screen, aliens, alien_number):"""创建一个外星人并将其放在当前行"""alien = Alien(ai_settings, screen)
2 alien_width = alien.rect.width
alien.x = alien_width + 2 * alien_width * alien_number
alien.rect.x = alien.x
aliens.add(alien)
def create_fleet(ai_settings, screen, aliens):"""创建外星人群"""# 创建一个外星人,并计算每行可容纳多少个外星人alien = Alien(ai_settings, screen)
3 number_aliens_x = get_number_aliens_x(ai_settings, alien.rect.width)# 创建第一行外星人for alien_number in range(number_aliens_x):
4 create_alien(ai_settings, screen, aliens, alien_number)

函数get_number_aliens_x()的代码都来自create_fleet(),且未做任何修改(见1)。函数 create_alien()的代码也都来自create_fleet(),且未做任何修改,只是使用刚创建的外星人来 获取外星人宽度(见2)。在3处,我们将计算可用水平空间的代码替换为对get_number_aliens_x() 的调用,并删除了引用alien_width的代码行,因为现在这是在create_alien()中处理的。在4处, 我们调用create_alien()。通过这样的重构,添加新行进而创建整群外星人将更容易。

13.3.5 添加行

要创建外星人群,需要计算屏幕可容纳多少行,并对创建一行外星人的循环重复相应的次数。 为计算可容纳的行数,我们这样计算可用垂直空间:将屏幕高度减去第一行外星人的上边距(外 星人高度)、飞船的高度以及最初外星人群与飞船的距离(外星人高度的两倍):

available_space_y = ai_settings.screen_height – 3 * alien_height – ship_height

这将在飞船上方留出一定的空白区域,给玩家留出射杀外星人的时间。

每行下方都要留出一定的空白区域,并将其设置为外星人的高度。为计算可容纳的行数,我 们将可用垂直空间除以外星人高度的两倍(同样,如果这样的计算不对,我们马上就能发现,继 而将间距调整为合理的值)。

number_rows = available_height_y / (2 * alien_height)

知道可容纳多少行后,便可重复执行创建一行外星人的代码:

game_functions.py
1 def get_number_rows(ai_settings, ship_height, alien_height):"""计算屏幕可容纳多少行外星人"""
2 available_space_y = (ai_settings.screen_height -(3 * alien_height) - ship_height)number_rows = int(available_space_y / (2 * alien_height)) return number_rows
def create_alien(ai_settings, screen, aliens, alien_number, row_number):--snip--alien.x = alien_width + 2 * alien_width * alien_numberalien.rect.x = alien.x
3 alien.rect.y = alien.rect.height + 2 * alien.rect.height * row_numberaliens.add(alien)
def create_fleet(ai_settings, screen, ship, aliens):--snip--number_aliens_x = get_number_aliens_x(ai_settings, alien.rect.width)number_rows = get_number_rows(ai_settings, ship.rect.height,alien.rect.height)# 创建外星人群
4 for row_number in range(number_rows):for alien_number in range(number_aliens_x):create_alien(ai_settings, screen, aliens, alien_number,row_number) 

为计算屏幕可容纳多少行外星人,我们在函数get_number_rows()中实现了前面计算 available_space_y和number_rows的公式(见1),这个函数与get_number_aliens_x()类似。计算 公式用括号括起来了,这样可将代码分成两行,以遵循每行不超过79字符的建议(见2)。这里 使用了int(),因为我们不想创建不完整的外星人行。

为创建多行,我们使用两个嵌套在一起的循环:一个外部循环和一个内部循环(见4)。其 中的内部循环创建一行外星人,而外部循环从零数到要创建的外星人行数。Python将重复执行创 建单行外星人的代码,重复次数为number_rows。 为嵌套循环,我们编写了一个新的for循环,并缩进了要重复执行的代码。(在大多数文本编 辑器中,缩进代码块和取消缩进都很容易,详情请参阅附录B。)我们调用create_alien()时,传 递了一个表示行号的实参,将每行都沿屏幕依次向下放置。 create_alien()的定义需要一个用于存储行号的形参。在create_alien()中,我们修改外星 人的y坐标(见3),并在第一行外星人上方留出与外星人等高的空白区域。相邻外星人行的y坐 标相差外星人高度的两倍,因此我们将外星人高度乘以2,再乘以行号。第一行的行号为0,因此 第一行的垂直位置不变,而其他行都沿屏幕依次向下放置。 在 create_fleet() 的定义中,还新增了一个用于存储 ship 对象的形参,因此在 alien_invasion.py中调用create_fleet()时,需要传递实参ship:

alien_invasion.py
# 创建外星人群
gf.create_fleet(ai_settings, screen, ship, aliens)

如果你现在运行这个游戏,将看到一群外星人,如图13-4所示

在下一节,我们将让外星人群动起来

13.4 让外星人群移动

下面来让外星人群在屏幕上向右移动,撞到屏幕边缘后下移一定的距离,再沿相反的方向移 动。我们将不断地移动所有的外星人,直到所有外星人都被消灭,有外星人撞上飞船,或有外星 人抵达屏幕底端。下面先来让外星人向右移动。

13.4.1 向右移动外星人

为移动外星人,我们将使用alien.py中的方法update(),且对外星人群中的每个外星人都调用 它。首先,添加一个控制外星人速度的设置:

settings.py
 def __init__(self):
--snip--# 外星人设置self.alien_speed_factor = 1

然后,使用这个设置来实现update():

alien.py
 def update(self):"""向右移动外星人"""
1 self.x += self.ai_settings.alien_speed_factor
2 self.rect.x = self.x 

每次更新外星人位置时,都将它向右移动,移动量为alien_speed_factor的值。我们使用属 性self.x跟踪每个外星人的准确位置,这个属性可存储小数值(见Ø)。然后,我们使用self.x 的值来更新外星人的rect的位置(见)。 在主while循环中已调用了更新飞船和子弹的方法,但现在还需更新每个外星人的位置:

alien_invasion.py
en_invasion.py# 开始游戏主循环while True:gf.check_events(ai_settings, screen, ship, bullets)ship.update()gf.update_bullets(bullets)gf.update_aliens(aliens)gf.update_screen(ai_settings, screen, ship, aliens, bullets)

我们在更新子弹后再更新外星人的位置,因为稍后要检查是否有子弹撞到了外星人。 最后,在文件game_functions.py末尾添加新函数update_aliens():

game_functions.py
def update_aliens(aliens):"""更新外星人群中所有外星人的位置"""aliens.update() 

我们对编组aliens调用方法update(),这将自动对每个外星人调用方法update()。如果你现 在运行这个游戏,会看到外星人群向右移,并逐渐在屏幕右边缘消失。

13.4.2 创建表示外星人移动方向的设置

下面来创建让外星人撞到屏幕右边缘后向下移动、再向左移动的设置。实现这种行为的代码 如下:

settings.py

 # 外星人设置self.alien_speed_factor = 1self.fleet_drop_speed = 10# fleet_direction为1表示向右移,为-1表示向左移self.fleet_direction = 1

设置fleet_drop_speed指定了有外星人撞到屏幕边缘时,外星人群向下移动的速度。将这个 速度与水平速度分开是有好处的,这样你就可以分别调整这两种速度了。 要实现fleet_direction设置,可以将其设置为文本值,如'left'或'right',但这样就必须 编写if-elif语句来检查外星人群的移动方向。鉴于只有两个可能的方向,我们使用值1和1来表 示它们,并在外星人群改变方向时在这两个值之间切换。另外,鉴于向右移动时需要增大每个外 星人的x坐标,而向左移动时需要减小每个外星人的x坐标,使用数字来表示方向更合理。

13.4.3 检查外星人是否撞到了屏幕边缘

现在需要编写一个方法来检查是否有外星人撞到了屏幕边缘,还需修改update(),以让每个 外星人都沿正确的方向移动:

alien.py
 def check_edges(self):"""如果外星人位于屏幕边缘,就返回True"""screen_rect = self.screen.get_rect()
1 if self.rect.right >= screen_rect.right:return True
2 elif self.rect.left <= 0:return Truedef update(self):"""向左或向右移动外星人"""
3 self.x += (self.ai_settings.alien_speed_factor *self.ai_settings.fleet_direction)self.rect.x = self.x

我们可对任何外星人调用新方法check_edges(),看看它是否位于屏幕左边缘或右边缘。如 果外星人的rect的right属性大于或等于屏幕的rect的right属性,就说明外星人位于屏幕右边缘 (见1)。如果外星人的rect的left属性小于或等于0,就说明外星人位于屏幕左边缘(见2)。 我们修改了方法update(),将移动量设置为外星人速度和fleet_direction的乘积,让外星人向左或向右移。如果fleet_direction为1,就将外星人当前的x坐标增大alien_speed_factor,从 而将外星人向右移;如果fleet_direction为1,就将外星人当前的x坐标减去alien_speed_ factor,从而将外星人向左移。


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

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

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

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

相关文章

【第七在线】可持续时尚与商品计划:减少库存浪费的方法

随着可持续时尚的崭露头角&#xff0c;服装企业越来越重视减少库存浪费。库存浪费不仅对环境造成负面影响&#xff0c;还对企业的经济可持续性产生负面影响。本文将深入探讨可持续时尚与商品计划之间的关系&#xff0c;以及一些减少库存浪费的方法&#xff0c;有助于改进商品计…

源码订货系统的优势

源码订货系统是一种企业购买后可以获得源代码的订货系统&#xff0c;它可以不受软件厂商的规模、发展而修改和使用。与SaaS订货系统相比&#xff0c;核货宝为您分享源码订货系统的四大优势&#xff1a; 一是开放性&#xff1a;源码订货系统是开源的&#xff0c;用户可以掌握源代…

解决IDEA编译/启动报错:Abnormal build process termination

报错信息 报错信息如下&#xff1a; Abnormal build process termination: "D:\Software\Java\jdk\bin\java" -Xmx3048m -Djava.awt.headlesstrue -Djava.endorsed.dirs\"\" -Djdt.compiler.useSingleThreadtrue -Dpreload.project.path………………很纳…

【Python百宝箱】时序之美:Python 时间序列探秘与创新

时光漫游&#xff1a;Python 时间序列分析全指南 前言 在数字化时代&#xff0c;时间序列数据扮演着关键的角色&#xff0c;从金融到气象再到生产制造。本文将引导你穿越Python丰富的时间序列分析工具&#xff0c;探索从基础统计到机器学习和深度学习的各个层面。无论你是初学…

MySQL概括与SQL分类

文章目录 一、计算机语言二、SQL语言三、数据库系统四、MySQL简介 一、计算机语言 二、SQL语言 三、数据库系统 四、MySQL简介

ZZ014城市轨道交通运营与维护赛题第5套

ZZ014城市轨道交通运营与维护赛题第5套 模块1赛题 模块序号 模块1 对应赛项编号 ZZ014 模块名称 城市轨道交通运营服务 子任务数量 12 竞赛时间 60分钟 任务描述 行车组织作业、票务设备故障处置以及突发事件应急处理 职业要素 R基本专业素养 R专业实践技能 R协…

【MySQL】事务、事务隔离级别、死锁

文章目录 1. 事务1.1 事务的属性 ACID1.2 创建事务1.3 autocommit 2. 并发和锁定2.1 并发问题 3. 事务隔离级别3.1 读未提交3.2 读已提交3.3 可重复读&#xff1a;MySQL的默认事务隔离级别3.4 序列化 4. 死锁 1. 事务 事务&#xff1a;单个工作单元的一组SQL语句。事务中的所有…

Python的环境搭建环境配置()

Python 环境搭建 一,下载Python 1.去官网 www.python.org 下载环境 2.如图点击Download 3.选择Windows 4.如图直接下载 5.直接勾选 6.后面就一直默认选项 Win11 安装目录 不能放在C盘的ProgramFIle路径下 二,测试环境是否安装成功 1.winR 输入cmd 2.输入python --versio…

React AntDesign form表单文件上传 nodejs formidable 接受参数并把文件放置后端项目相对目录指定文件夹下面

@umijs/max 请求方法 // 上传文件改成form表单 export async function uploadFile(data, options) {return request(CMMS_UI_HOST + /api/v1/uploadFile, {method: POST,data,requestType: form,...(options || {}),}); }前端调用方法 注意upload组件上传 onChange的如下方法,…

strlen

strlen&#xff08;&#xff09;从字符串的开头位置依次往后面计数&#xff0c;直到遇到‘\0’停止&#xff0c;所计算的字符串大小为‘\0’以前的字符所计算的值&#xff0c;最终的字符串长度不包括‘\0’ 它的原型是size_t strlen(const char* str) 例如一个数组 char arr…

【JS】事件循环机制

一、JS单线程、异步、同步概念 众所周知&#xff0c;JS是单线程&#xff08;如果一个线程删DOM&#xff0c;一个线程增DOM&#xff0c;浏览器傻逼了&#xff5e;所以只能单着了&#xff09;&#xff0c;虽然有webworker酱紫的多线程出现&#xff0c;但也是在主线程的控制下。we…

服务器数据恢复-服务器断电导致linux操作系统数据丢失的数据恢复案例

linux操作系统服务器数据恢复环境&#xff1a; 某品牌R730服务器MD3200系列存储&#xff0c;linux操作系统。 服务器故障&#xff1a; 机房意外断电导致服务器linux操作系统部分文件丢失。 服务器数据恢复过程&#xff1a; 1、将故障服务器连接到北亚企安数据恢复中心备份服务器…

【JVM】一、认识JVM

文章目录 1、虚拟机2、Java虚拟机3、JVM的整体结构4、Java代码的执行流程5、JVM的分类6、JVM的生命周期 1、虚拟机 虚拟机&#xff0c;Virtual Machine&#xff0c;一台虚拟的计算机&#xff0c;用来执行虚拟计算机指令。分为&#xff1a; 系统虚拟机&#xff1a;如VMware&am…

如何在Portainer部署一个web站点到Nginx容器并结合内网穿透远程访问

文章目录 前言1. 安装Portainer1.1 访问Portainer Web界面 2. 使用Portainer创建Nginx容器3. 将Web静态站点实现公网访问4. 配置Web站点公网访问地址4.1公网访问Web站点 5. 固定Web静态站点公网地址6. 固定公网地址访问Web静态站点 前言 Portainer是一个开源的Docker轻量级可视…

Appearance-Motion Memory Consistency Network for Video Anomaly Detection 论文阅读

Appearance-Motion Memory Consistency Network for Video Anomaly Detection 论文阅读 AbstractIntroductionRelated WorkMethodExperimentsConclusions阅读总结 论文标题&#xff1a;Appearance-Motion Memory Consistency Network for Video Anomaly Detection 文章信息&am…

Node.js-模块化(二)

1. 模块化的基本概念 1.1 什么是模块化 模块化是指解决一个复杂问题时&#xff0c;自顶向下逐层将系统拆分成若干模块的过程。对于整个系统来说&#xff0c;模块是可组合、分解和更换的单元。 1.2 编程领域中的模块化 编程领域中的模块化&#xff0c;就是遵守固定的规则&…

大一C语言作业题目2

目录 字符串&#xff1f; struct&#xff1f; index细节&#xff1f; scanf细节&#xff1f; 7-2 找出总分最高的学生 给定N个学生的基本信息&#xff0c;包括学号&#xff08;由5个数字组成的字符串&#xff09;、姓名&#xff08;长度小于10的不包含空白字符的非空字符…

数据结构和算法笔记2:二分法

二分法网上有两种写法&#xff0c;一种左闭右闭&#xff0c;一种左闭右开&#xff0c;个人习惯左闭右闭的写法&#xff0c; 有序数组查找数 这是标准二分法&#xff0c;对应力扣的704. 二分查找&#xff1a; 求值为target的索引 int search(vector<int>& nums, i…

说说 style gan 中的感知路径长度(Perceptual Path Length)

我在之前的博库中介绍了 style gan 的基本原理&#xff0c;原文中有提出感知路径长度&#xff08;Perceptual Path Length&#xff09;的概念。这是一种评价生成器质量的方式。 PPL基本思想&#xff1a;给出两个随机噪声 z 1 , z 2 ​ &#xff0c;为求得两点的感知路径长度PPL…

利用ffmpeg cv2取h265码流视频(转换图片灰屏问题解决)

利用海康威视相机拍出来的视频是H265格式的&#xff0c;相比于常规的H264编码&#xff0c;压缩率更高&#xff0c;但因此如果直接用正常取流方法读取&#xff0c;会出现无法读取的情况 1. 如图h265码流取出图片为灰屏 2 、解决灰屏问题 import subprocess import cv2# 将h265流…