关于“Python”的核心知识点整理大全34
目录
第13 章
外星人
13.1 回顾项目
game_functions.py
13.2 创建第一个外星人
13.2.1 创建 Alien 类
alien.py
13.2.2 创建 Alien 实例
alien_invasion.py
13.2.3 让外星人出现在屏幕上
game_functions.py
13.3 创建一群外星人
13.3.1 确定一行可容纳多少个外星人
注意
13.3.2 创建多行外星人
alien_invasion.py
game_functions.py
13.3.3 创建外星人群
game_functions.py
注意

第13 章
外星人
13.1 回顾项目
开发较大的项目时,进入每个开发阶段前回顾一下开发计划,搞清楚接下来要通过编写代码 来完成哪些任务都是不错的主意。本章涉及以下内容。
研究既有代码,确定实现新功能前是否要进行重构。
在屏幕左上角添加一个外星人,并指定合适的边距。
根据第一个外星人的边距和屏幕尺寸计算屏幕上可容纳多少个外星人。我们将编写一个 循环来创建一系列外星人,这些外星人填满了屏幕的上半部分。
让外星人群向两边和下方移动,直到外星人被全部击落,有外星人撞到飞船,或有外星 人抵达屏幕底端。如果整群外星人都被击落,我们将再创建一群外星人。如果有外星人 撞到了飞船或抵达屏幕底端,我们将销毁飞船并再创建一群外星人。
限制玩家可用的飞船数量,配给的飞船用完后,游戏结束。
我们将在实现功能的同时完善这个计划,但就目前而言,该计划已足够详尽。
在给项目添加新功能前,还应审核既有代码。每进入一个新阶段,通常项目都会更复杂,因 此最好对混乱或低效的代码进行清理。
我们在开发的同时一直不断地重构,因此当前需要做的清理工作不多,但每次为测试新功能而运行这个游戏时,都必须使用鼠标来关闭它,这太讨厌了。下面来添加一个结束游戏的快捷键Q:
game_functions.py
def check_keydown_events(event, ai_settings, screen, ship, bullets):--snip--elif event.key == pygame.K_q:sys.exit()
在check_keydown_events()中,我们添加了一个代码块,以便在玩家按Q时结束游戏。这样 的修改很安全,因为Q键离箭头键和空格键很远,玩家不小心按Q键而导致游戏结束的可能性不 大。现在测试时可按Q关闭游戏,而无需使用鼠标来关闭窗口了。
13.2 创建第一个外星人
在屏幕上放置外星人与放置飞船类似。每个外星人的行为都由Alien类控制,我们将像创建 Ship类那样创建这个类。出于简化考虑,我们也使用位图来表示外星人。你可以自己寻找表示外 星人的图像,也可使用图13-1所示的图像,可在本书配套资源(https://www.nostarch.com/ pythoncrashcourse/)中找到。这幅图像的背景为灰色,与屏幕背景色一致。请务必将你选择的图 像文件保存到文件夹images中。

13.2.1 创建 Alien 类
下面来编写Alien类:
alien.py
import pygame
from pygame.sprite import Sprite
class Alien(Sprite):"""表示单个外星人的类"""def __init__(self, ai_settings, screen):"""初始化外星人并设置其起始位置"""super(Alien, self).__init__()self.screen = screenself.ai_settings = ai_settings# 加载外星人图像,并设置其rect属性self.image = pygame.image.load('images/alien.bmp')self.rect = self.image.get_rect()# 每个外星人最初都在屏幕左上角附近
1 self.rect.x = self.rect.widthself.rect.y = self.rect.height# 存储外星人的准确位置self.x = float(self.rect.x)def blitme(self):"""在指定位置绘制外星人"""self.screen.blit(self.image, self.rect)
除位置不同外,这个类的大部分代码都与Ship类相似。每个外星人最初都位于屏幕左上 角附近,我们将每个外星人的左边距都设置为外星人的宽度,并将上边距设置为外星人的高 度(见1)。
13.2.2 创建 Alien 实例
下面在alien_invasion.py中创建一个Alien实例:
alien_invasion.py
--snip--
from ship import Ship
from alien import Alien
import game_functions as gf
def run_game():--snip--# 创建一个外星人alien = Alien(ai_settings, screen)# 开始游戏主循环while True:gf.check_events(ai_settings, screen, ship, bullets)ship.update()gf.update_bullets(bullets)gf.update_screen(ai_settings, screen, ship, alien, bullets)
run_game()
在这里,我们导入了新创建的Alien类,并在进入主while循环前创建了一个Alien实例。我们 没有修改外星人的位置,因此该while循环没有任何新东西,但我们修改了对update_screen()的 调用,传递了一个外星人实例。
13.2.3 让外星人出现在屏幕上
为让外星人出现在屏幕上,我们在update_screen()中调用其方法blitme():
game_functions.py
def update_screen(ai_settings, screen, ship, alien, bullets):--snip--# 在飞船和外星人后面重绘所有的子弹for bullet in bullets:bullet.draw_bullet()ship.blitme()alien.blitme()# 让最近绘制的屏幕可见pygame.display.flip()
我们先绘制飞船和子弹,再绘制外星人,让外星人在屏幕上位于最前面。图13-2显示了屏幕 上的第一个外星人。

第一个外星人正确地现身后,下面来编写绘制一群外星人的代码。
13.3 创建一群外星人
要绘制一群外星人,需要确定一行能容纳多少个外星人以及要绘制多少行外星人。我们将首 先计算外星人之间的水平间距,并创建一行外星人,再确定可用的垂直空间,并创建整群外星人。
13.3.1 确定一行可容纳多少个外星人
为确定一行可容纳多少个外星人,我们来看看可用的水平空间有多大。屏幕宽度存储在 ai_settings.screen_width中,但需要在屏幕两边都留下一定的边距,把它设置为外星人的宽度。 由于有两个边距,因此可用于放置外星人的水平空间为屏幕宽度减去外星人宽度的两倍:
available_space_x = ai_settings.screen_width – (2 * alien_width)
我们还需要在外星人之间留出一定的空间,即外星人宽度。因此,显示一个外星人所需的水 平空间为外星人宽度的两倍:一个宽度用于放置外星人,另一个宽度为外星人右边的空白区域。 为确定一行可容纳多少个外星人,我们将可用空间除以外星人宽度的两倍:
number_aliens_x = available_space_x / (2 * alien_width)
我们将在创建外星人群时使用这些公式。
注意
令人欣慰的是,在程序中执行计算时,一开始你无需确定公式是正确的,而可以尝试直 接运行程序,看看结果是否符合预期。即便是在最糟糕的情况下,也只是屏幕上显示的 外星人太多或太少。你可以根据在屏幕上看到的情况调整计算公式。
13.3.2 创建多行外星人
为创建一行外星人,首先在alien_invasion.py中创建一个名为aliens的空编组,用于存储全部 外星人,再调用game_functions.py中创建外星人群的函数:
alien_invasion.py
import pygame
from pygame.sprite import Group
from settings import Settings
from ship import Ship
import game_functions as gf
def run_game():--snip--# 创建一艘飞船、一个子弹编组和一个外星人编组ship = Ship(ai_settings, screen)bullets = Group()
1 aliens = Group()# 创建外星人群
2 gf.create_fleet(ai_settings, screen, aliens)# 开始游戏主循环while True:--snip—
3 gf.update_screen(ai_settings, screen, ship, aliens, bullets)
run_game()
由于我们不再在alien_invasion.py中直接创建外星人,因此无需在这个文件中导入Alien类。 1处创建了一个空编组,用于存储所有的外星人。接下来,调用稍后将编写的函数 create_fleet()(见2),并将ai_settings、对象screen和空编组aliens传递给它。然后,修改对 update_screen()的调用,让它能够访问外星人编组(见3)。 我们还需要修改update_screen():
game_functions.py
def update_screen(ai_settings, screen, ship, aliens, bullets):--snip--ship.blitme()aliens.draw(screen)# 让最近绘制的屏幕可见pygame.display.flip()
对编组调用draw()时,Pygame自动绘制编组的每个元素,绘制位置由元素的属性rect决定。 在这里,aliens.draw(screen)在屏幕上绘制编组中的每个外星人。
13.3.3 创建外星人群
现在可以创建外星人群了。下面是新函数create_fleet(),我们将它放在game_functions. py的末尾。我们还需要导入Alien类,因此务必在文件game_functions.py开头添加相应的import 语句:
game_functions.py
--snip--
from bullet import Bullet
from alien import Alien
--snip--
def create_fleet(ai_settings, screen, aliens):"""创建外星人群"""# 创建一个外星人,并计算一行可容纳多少个外星人# 外星人间距为外星人宽度
1 alien = Alien(ai_settings, screen)
2 alien_width = alien.rect.width
3 available_space_x = ai_settings.screen_width - 2 * alien_width
4 number_aliens_x = int(available_space_x / (2 * alien_width))
# 创建第一行外星人
5 for alien_number in range(number_aliens_x):# 创建一个外星人并将其加入当前行
6 alien = Alien(ai_settings, screen)alien.x = alien_width + 2 * alien_width * alien_numberalien.rect.x = alien.xaliens.add(alien)
这些代码大都在前面详细介绍过。为放置外星人,我们需要知道外星人的宽度和高度,因此 在执行计算前,我们先创建一个外星人(见1)。这个外星人不是外星人群的成员,因此没有将 它加入到编组aliens中。在2处,我们从外星人的rect属性中获取外星人宽度,并将这个值存储 到alien_width中,以免反复访问属性rect。在3处,我们计算可用于放置外星人的水平空间,以 及其中可容纳多少个外星人。
相比于前面介绍的工作,这里唯一的不同是使用了int()来确保计算得到的外星人数量为整 数(见4),因为我们不希望某个外星人只显示一部分,而且函数range()也需要一个整数。函数 int()将小数部分丢弃,相当于向下圆整(这大有裨益,因为我们宁愿每行都多出一点点空间, 也不希望每行的外星人之间过于拥挤)。
接下来,我们编写了一个循环,它从零数到要创建的外星人数(见5)。在这个循环的主体 中,我们创建一个新的外星人,并通过设置x坐标将其加入当前行(见6)。将每个外星人都往右 推一个外星人的宽度。接下来,我们将外星人宽度乘以2,得到每个外星人占据的空间(其中包 括其右边的空白区域),再据此计算当前外星人在当前行的位置。最后,我们将每个新创建的外 星人都添加到编组aliens中。 如果你现在运行这个游戏,将看到第一行外星人,如图13-3所示。

这行外星人在屏幕上稍微偏向了左边,这实际上是有好处的,因为我们将让外星人群往右移, 触及屏幕边缘后稍微往下移,然后往左移,以此类推。就像经典游戏《太空入侵者》,相比于只 往下移,这种移动方式更有趣。我们将让外形人群不断这样移动,直到所有外星人都被击落或有 外星人撞上飞船或抵达屏幕底端。
注意
根据你选择的屏幕宽度,在你的系统中,第一行外星人的位置可能稍有不同
关于“Python”的核心知识点整理大全12-CSDN博客
关于“Python”的核心知识点整理大全25-CSDN博客
往期快速传送门👆(在文章最后):
感谢大家的支持!欢迎订阅收藏!专栏将持续更新!
相关文章:
关于“Python”的核心知识点整理大全34
目录 第13 章 外星人 13.1 回顾项目 game_functions.py 13.2 创建第一个外星人 13.2.1 创建 Alien 类 alien.py 13.2.2 创建 Alien 实例 alien_invasion.py 13.2.3 让外星人出现在屏幕上 game_functions.py 13.3 创建一群外星人 13.3.1 确定一行可容纳…...
设计模式--抽象工厂模式
实验4:抽象工厂模式 本次实验属于模仿型实验,通过本次实验学生将掌握以下内容: 1、理解抽象工厂模式的动机,掌握该模式的结构; 2、能够利用抽象工厂模式解决实际问题。 [实验任务]:人与肤色 使用抽象…...
浅析海博深造
文章目录 深造作用 留学种类 选专业 择校 申请流程 申请方式 深造作用 1、个人能力提升(学术专业、语言、新文化或新生活方式) 2、更好的职业发展(起点更高、结交新朋友或扩大社交圈) 3、北京上海落户优惠 4、海外居留福…...
【Hive_05】企业调优1(资源配置、explain、join优化)
1、 计算资源配置1.1 Yarn资源配置1.2 MapReduce资源配置 2、 Explain查看执行计划(重点)2.1 Explain执行计划概述2.2 基本语法2.3 案例实操 3、分组聚合优化3.1 优化说明(1)map-side 聚合相关的参数 3.2 优化案例 4、join优化4.1…...
synchronized
⭐ 作者:小胡_不糊涂 🌱 作者主页:小胡_不糊涂的个人主页 📀 收录专栏:JavaEE 💖 持续更文,关注博主少走弯路,谢谢大家支持 💖 synchronized 1. 特性1.1 互斥1.2 可重入 …...
Vue在页面上添加水印
第一步:在自己的项目里创建一个js文件;如图所示我在在watermark文件中创建了一个名为waterMark.js文件。 waterMark.js /** 水印添加方法 */ let setWatermark (str1, str2) > {let id 1.23452384164.123412415if (document.getElementById(id) …...
SQL server 数据库练习题及答案(练习2)
使用你的名字创建一个数据库 创建表: 数据库中有三张表,分别为student,course,SC(即学生表,课程表,选课表) 问题: --1.分别查询学生表和学生修课表中的全部数据。--2.查询成绩在70到80分之间…...
minicube搭建golang容器服务
引言 最近在自己电脑上搭建一个小型k8s环境,以学习云原生相关内容。这里我主要分为三部分记录: 容器及容器编排理论环境安装相关rpcx服务实战 还在调试中,先总结整理下,这里后续补充上我的github工程链接。 一、容器及容器编排理…...
图片批量处理:图片批量缩放,高效调整尺寸的技巧
在数字媒体时代,图片处理已是日常生活和工作中不可或缺的一部分。有时候要批量处理图片,如缩放图片尺寸,以满足不同的应用需求。现在一起来看看办公提效式具如何高效的将图片批量处理方法,快速、准确地批量调整图片尺寸操作。 下…...
直接插入排序【从0-1学数据结构】
文章目录 💗 直接插入排序Java代码C代码JavaScript代码稳定性时间复杂度空间复杂度 我们先来学习 直接插入排序, 直接排序算是所有排序中最简单的了,代码也非常好实现,尽管直接插入排序很简单,但是我们依旧不可以上来就直接写代码,一定要分析之后才开始写,这样可以提…...
C++/CLI——1简介
C/CLI——1简介 如果你是.net程序员,不免会用到C/C写的库。对于简单的调用,可以直接使用DllImport来完成就可以,详情可参考C#调用C/C从零深入讲解。但是对于复杂的C类和对象,尤其是类似于OCC的大型C项目,DllImport可能…...
C#实现串口通讯
1、官网下载Launch Virtual Serial Port Driver Virtual Serial Port Driver - create and emulate virtual COM port,开个虚拟串口: Pair模式(一对,成双成对的意思,就是COM1向COM2传或者COM2向COM1,好比两台机器的CO…...
NLP论文阅读记录 - 以大语言模型为参考学习总结
文章目录 前言0、论文摘要一、Introduction1.1目标问题1.2相关的尝试1.3本文贡献 二.相关工作2.1文本生成模型的训练方法2.2 基于LLM的自动评估2.3 LLM 蒸馏和基于 LLM 的数据增强 三.本文方法3.1 Summarize as Large Language Models3.1.1 前提3.1.2 大型语言模型作为参考具有…...
前端---资源路径
当我们使用img标签显示图片的时候,需要指定图片的资源路径,比如: <img src"images/logo.png">这里的src属性就是设置图片的资源路径的,资源路径可以分为相对路径和绝对路径。 1. 相对路径 从当前操作 html 的文档所在目录算…...
【2024考研】心情记录
今天是12.26日。距离24考研已经过去了2天,自认为缓过来了,故写下这篇文章。 25日早上简单过了一下答案,但实在是记不住答案了,不知道是我的脑子抵触还是怎的,像一块灰色的布遮住了我的记忆,羞于打开&#x…...
MySQL数据库日志管理和数据的备份及恢复
目录 MySQL日志管理 数据库备份的重要性 数据库备份的分类 从物理与逻辑的角度 从数据库的备份策略角度 常见的备份方法 物理冷备 专用备份工具mysqldump或mysqlhotcopy 启用二进制日志进行增量备份 第三方工具备份 MySQL完全备份与恢复 MySQL完全备份 物理冷备份与…...
node-schedule nodejs定时提醒(并判断段是否是工作日)
概述 工作中有个需求:在特定的时间发送一些消息,也就是说比如在每天的7点发送消息:该起床了。一开始我想用定时器每分钟每分钟的去查当前时间,但好像有点蠢,然后我找到了这个包 使用方法 安装 npm install node-sc…...
LeetCode 75| 前缀和
目录 1732 找到最高海拔 724 找到数组的中心下标 1732 找到最高海拔 class Solution { public:int largestAltitude(vector<int>& gain) {int res 0;int sum 0;for(int num : gain){sum num;res max(res,sum);}return res;} }; 时间复杂度O(n) 空间复杂度O(…...
智能,轻量,高效的爬虫工具 (爬虫宝第一代), HSpider
场景 之前玩爬虫宝一时爽,但是我很快发现了一个致命的问题。就是chat3.5 有时候误判,Claude2 是遇到大一点的html就无法解析,chat4 Api没有申请下来,chat3.5 误判这个可以纠正,但是每次爬取花费的钱都是2刀以上&#…...
IDEA Maven Helper插件 解决jar冲突
Jar包冲突报错 程序抛出java.lang.ClassNotFoundException异常; 程序抛出java.lang.NoSuchMethodError异常; 程序抛出java.lang.NoClassDefFoundError异常; 程序抛出java.lang.LinkageError异常等;Maven Jar包管理机制 在Maven项…...
Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
