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

目录

12.4.2 在屏幕上绘制飞船

alien_invasion.py

​编辑12.5 重构:模块 game_functions

12.5.1 函数 check_events()

game_functions.py

alien_invasion.py

12.5.2 函数 update_screen()

game_functions.py

alien_invasion.py

12.6 驾驶飞船

12.6.1 响应按键

game_ functions.py

alien_invasion.py

12.6.2 允许不断移动

ship.py

game_functions.py

alien_invasion.py

12.6.3 左右移动

ship.py

game_functions.py

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

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


12.4.2 在屏幕上绘制飞船

下面来更新alien_invasion.py,使其创建一艘飞船,并调用其方法blitme():

alien_invasion.py
--snip--
from settings import Settings
from ship import Ship
def run_game():--snip--pygame.display.set_caption("Alien Invasion")# 创建一艘飞船
1 ship = Ship(screen)# 开始游戏主循环while True:--snip--# 每次循环时都重绘屏幕screen.fill(ai_settings.bg_color)
2 ship.blitme()# 让最近绘制的屏幕可见pygame.display.flip()
run_game()

我们导入Ship类,并在创建屏幕后创建一个名为ship的Ship实例。必须在主while循环前面创 建该实例(见1),以免每次循环时都创建一艘飞船。填充背景后,我们调用ship.blitme()将飞 船绘制到屏幕上,确保它出现在背景前面(见2)。 现在如果运行alien_invasion.py,将看到飞船位于空游戏屏幕底部中央,如图12-2所示。

12.5 重构:模块 game_functions

在大型项目中,经常需要在添加新代码前重构既有代码。重构旨在简化既有代码的结构,使 其更容易扩展。在本节中,我们将创建一个名为game_functions的新模块,它将存储大量让游戏 《外星人入侵》运行的函数。通过创建模块game_functions,可避免alien_invasion.py太长,并使 其逻辑更容易理解。

12.5.1 函数 check_events()

我们将首先把管理事件的代码移到一个名为check_events()的函数中,以简化run_game()并 隔离事件管理循环。通过隔离事件循环,可将事件管理与游戏的其他方面(如更新屏幕)分离。 将check_events()放在一个名为game_functions的模块中:

game_functions.py
import sys
import pygame
def check_events():"""响应按键和鼠标事件"""for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit() 

这个模块中导入了事件检查循环要使用的sys和pygame。当前,函数check_events()不需要任 何形参,其函数体复制了alien_invasion.py的事件循环。 下面来修改alien_invasion.py,使其导入模块game_functions,并将事件循环替换为对函数 check_events()的调用:

alien_invasion.py
import pygame
from settings import Settings
from ship import Ship
import game_functions as gf
def run_game():--snip--# 开始游戏主循环while True:gf.check_events()# 让最近绘制的屏幕可见--snip-- 

在主程序文件中,不再需要直接导入sys,因为当前只在模块game_functions中使用了它。出 于简化的目的,我们给导入的模块game_functions指定了别名gf。

12.5.2 函数 update_screen()

为进一步简化run_game(),下面将更新屏幕的代码移到一个名为update_screen()的函数中, 并将这个函数放在模块game_functions.py中:

game_functions.py
--snip--
def check_events():--snip--
def update_screen(ai_settings, screen, ship):"""更新屏幕上的图像,并切换到新屏幕"""# 每次循环时都重绘屏幕screen.fill(ai_settings.bg_color)ship.blitme()# 让最近绘制的屏幕可见pygame.display.flip()

新函数 update_screen() 包含三个形参: ai_settings 、 screen 和 ship 。现在需要将 alien_invasion.py的while循环中更新屏幕的代码替换为对函数update_screen()的调用:

alien_invasion.py
--snip--# 开始游戏主循环while True:gf.check_events()gf.update_screen(ai_settings, screen, ship)
run_game()

这两个函数让while循环更简单,并让后续开发更容易:在模块game_functions而不是 run_game()中完成大部分工作。 鉴于我们一开始只想使用一个文件,因此没有立刻引入模块game_functions。这让你能够了 解实际的开发过程:一开始将代码编写得尽可能简单,并在项目越来越复杂时进行重构。 对代码进行重构使其更容易扩展后,可以开始处理游戏的动态方面了!

12.6 驾驶飞船

下面来让玩家能够左右移动飞船。为此,我们将编写代码,在用户按左或右箭头键时作出响 应。我们将首先专注于向右移动,再使用同样的原理来控制向左移动。通过这样做,你将学会如 何控制屏幕图像的移动。

12.6.1 响应按键

每当用户按键时,都将在Pygame中注册一个事件。事件都是通过方法pygame.event.get()获 取的,因此在函数check_events()中,我们需要指定要检查哪些类型的事件。每次按键都被注册 为一个KEYDOWN事件。 检测到KEYDOWN事件时,我们需要检查按下的是否是特定的键。例如,如果按下的是右箭头 键,我们就增大飞船的rect.centerx值,将飞船向右移动:

game_ functions.py
def check_events(ship):"""响应按键和鼠标事件"""
for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()
1 elif event.type == pygame.KEYDOWN:
2 if event.key == pygame.K_RIGHT:#向右移动飞船
3 ship.rect.centerx += 1

我们在函数check_events()中包含形参ship,因为玩家按右箭头键时,需要将飞船向右移动。 在函数check_events()内部,我们在事件循环中添加了一个elif代码块,以便在Pygame 检测到 KEYDOWN事件时作出响应(见)。我们读取属性event.key,以检查按下的是否是右箭头键 (pygame.K_RIGHT)(见)。如果按下的是右箭头键,就将ship.rect.centerx的值加1,从而将飞 船向右移动(见)。 在alien_invasion.py中,我们需要更新调用的check_events()代码,将ship作为实参传递给它:

alien_invasion.py
 # 开始游戏主循环while True:gf.check_events(ship)gf.update_screen(ai_settings, screen, ship)

如果现在运行alien_invasion.py,则每按右箭头键一次,飞船都将向右移动1像素。这是一个 开端,但并非控制飞船的高效方式。下面来改进控制方式,允许持续移动。

12.6.2 允许不断移动

玩家按住右箭头键不放时,我们希望飞船不断地向右移动,直到玩家松开为止。我们将让游 戏检测pygame.KEYUP事件,以便玩家松开右箭头键时我们能够知道这一点;然后,我们将结合使 用KEYDOWN和KEYUP事件,以及一个名为moving_right的标志来实现持续移动。 飞船不动时,标志moving_right将为False。玩家按下右箭头键时,我们将这个标志设置为 True;而玩家松开时,我们将这个标志重新设置为False。 飞船的属性都由Ship类控制,因此我们将给这个类添加一个名为moving_right的属性和一个 名为update()的方法。方法update()检查标志moving_right的状态,如果这个标志为True,就调 整飞船的位置。每当需要调整飞船的位置时,我们都调用这个方法。 下面是对Ship类所做的修改:

ship.py
class Ship():def __init__(self, screen):--snip--# 将每艘新飞船放在屏幕底部中央self.rect.centerx = self.screen_rect.centerxself.rect.bottom = self.screen_rect.bottom# 移动标志
1 self.moving_right = False
2 def update(self):"""根据移动标志调整飞船的位置"""if self.moving_right:self.rect.centerx += 1def blitme(self):--snip-- 

在方法__init__()中,我们添加了属性self.moving_right,并将其初始值设置为False(见)。 接下来,我们添加了方法update(),它在前述标志为True时向右移动飞船(见)。 下面来修改check_events(),使其在玩家按下右箭头键时将moving_right设置为True,并在 玩家松开时将moving_right设置为False:

game_functions.py
def check_events(ship):"""响应按键和鼠标事件"""for event in pygame.event.get():--snip--elif event.type == pygame.KEYDOWN:if event.key == pygame.K_RIGHT:
1 ship.moving_right = True
2 elif event.type == pygame.KEYUP:if event.key == pygame.K_RIGHT:ship.moving_right = False 

在处,我们修改了游戏在玩家按下右箭头键时响应的方式:不直接调整飞船的位置,而只 是将moving_right设置为True。在处,我们添加了一个新的elif代码块,用于响应KEYUP事件: 玩家松开右箭头键(K_RIGHT)时,我们将moving_right设置为False。 最后,我们需要修改alien_invasion.py中的while循环,以便每次执行循环时都调用飞船的 方法update():

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

飞船的位置将在检测到键盘事件后(但在更新屏幕前)更新。这样,玩家输入时,飞船的位 置将更新,从而确保使用更新后的位置将飞船绘制到屏幕上。如果你现在运行alien_invasion.py并按住右箭头键,飞船将不断地向右移动,直到你松开为止。

12.6.3 左右移动

飞船能够不断地向右移动后,添加向左移动的逻辑很容易。我们将再次修改Ship类和函数 check_events()。下面显示了对Ship类的方法__init__()和update()所做的相关修改:

ship.py
 def __init__(self, screen):--snip--# 移动标志self.moving_right = Falseself.moving_left = Falsedef update(self):"""根据移动标志调整飞船的位置"""if self.moving_right:self.rect.centerx += 1if self.moving_left:self.rect.centerx -= 1

在方法__init__()中,我们添加了标志self.moving_left;在方法update()中,我们添加了一 个if代码块而不是elif代码块,这样如果玩家同时按下了左右箭头键,将先增大飞船的 rect.centerx值,再降低这个值,即飞船的位置保持不变。如果使用一个elif代码块来处理向左 移动的情况,右箭头键将始终处于优先地位。从向左移动切换到向右移动时,玩家可能同时按住 左右箭头键,在这种情况下,前面的做法让移动更准确。 我们还需对check_events()作两方面的调整:

game_functions.py
def check_events(ship):"""响应按键和鼠标事件"""for event in pygame.event.get():--snip--elif event.type == pygame.KEYDOWN:if event.key == pygame.K_RIGHT:ship.moving_right = Trueelif event.key == pygame.K_LEFT:ship.moving_left = Trueelif event.type == pygame.KEYUP:if event.key == pygame.K_RIGHT:ship.moving_right = Falseelif event.key == pygame.K_LEFT:ship.moving_left = False 

如果因玩家按下K_LEFT键而触发了KEYDOWN事件,我们就将moving_left设置为True;如果因 玩家松开K_LEFT而触发了KEYUP事件,我们就将moving_left设置为False。这里之所以可以使用elif代码块,是因为每个事件都只与一个键相关联;如果玩家同时按下了左右箭头键,将检测到 两个不同的事件。 如果此时运行alien_invasion.py,将能够不断地左右移动飞船;如果你同时按左右箭头键,飞 船将纹丝不动。 下面来进一步优化飞船的移动方式:调整飞船的速度;限制飞船的移动距离,以免它移到屏 幕外面去。


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

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

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

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

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

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

相关文章

RESTful简介与C/C++实现

一、RESTful简介 RESTful,全称为Representational State Transfer,是一种软件架构风格和设计理念,而不是一种标准。它主要用于Web服务的设计和开发,强调资源的状态表示和状态转移。RESTful风格的设计使得Web服务更加简洁、清晰和…

msvcp120.dll丢失的多种详细有效解决方法

在计算机使用过程中,我们可能会遇到一些错误提示,其中之一就是“msvcp120.dll丢失”。那么,msvcp120.dll到底是什么?为什么会出现丢失的情况?丢失后会对电脑产生什么影响?本文将为您详细解答这些问题&#…

HarmonyOS笔记1

修改字体颜色 在Text里边,按一下 . 就行了,按点号会自动提示 fontColor 函数参数给‘#36D’可以把‘Hello World’调成蓝色 onClick(()>{}) 按钮 如何打印第二句话 Text方法 2023年12月21日11:26:52

项目从0到1,架构选型 :单体架构优先考虑

当我听到关于团队使用微服务架构的故事时,我注意到了一个共同的现象。 几乎所有成功的微服务故事都是从一个过于庞大的庞然大物开始的,后来这个庞然大物被拆分了我所听说的几乎所有从零开始构建微服务系统的案例,最终都陷入了严重的麻烦。 …

强烈推荐的前端学习资源,先收藏!

今天分享一些个人收藏的前端学习资源,按一下几个维度简单划分了下,有 3D、框架、构建工具等等。由于这些地址都是我个人收藏的,所以带有一些强烈的主观意识,还有很多优秀的网址没有收录进来,会不断更新的,欢…

系统分析师(软考)知识点整理(二)

会计相关 会计是指记录、分类、汇总、计量和报告发送在企业经济活动中的财务数据的行为 #mermaid-svg-YBI5YPWzqWhRB4kI {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-YBI5YPWzqWhRB4kI .error-icon{fill:#552222…

亚马逊鲲鹏系统引爆广告点击率提升秘籍

在竞争激烈的电商市场,提高广告点击率成为各大卖家争相追求的目标。而如今,亚马逊鲲鹏系统的强大功能再次为卖家们打开了广告优化的新大门。其中,搜索广告功能更是成为提高关键词排名的利器。本文将详细介绍如何通过亚马逊鲲鹏系统实现点击广…

多维时序 | MATLAB实现KOA-CNN-BiGRU-Multihead-Attention多头注意力机制多变量时间序列预测

多维时序 | MATLAB实现KOA-CNN-BiGRU-Multihead-Attention多头注意力机制多变量时间序列预测 目录 多维时序 | MATLAB实现KOA-CNN-BiGRU-Multihead-Attention多头注意力机制多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 MATLAB实现KOA-CNN-B…

linux | 软连接与硬链接 | 实测

很多知识,我们都是通过学习其他博主的博客,可是学习的过程 常常需要辩证的去辨别真伪。这很耗精力,最好的方法就是实践去检测。 软链接 和 应链接 在 linux 上操作非常重要 常见场景:最重要的就是,做备份,尤…

Talk | 约翰霍普金斯大学博士生魏晨: De-Diffusion-文本是不同模态的沟通桥梁

本期为TechBeat人工智能社区第557期线上Talk。 北京时间12月20日(周三)20:00,约翰霍普金斯大学博士生—魏晨的Talk已准时在TechBeat人工智能社区开播! 她与大家分享的主题是: “De-Diffusion-文本是不同模态的沟通桥梁题”,介绍了她的团队在如…

Linux---进程状态

目录 一、系统进程状态介绍 1.运行状态 2.阻塞状态 3.挂起状态 二、Linux中的进程状态 1.R (running) 2.S (sleeping) 3.D(disk sleep) 4.T(stopped) 5.t(tracing stop) 6.X(dead&am…

OpenHarmony应用开发环境搭建指南

OpenHarmony的应用开发主要是基于Deveco Studio(目前只支持Windows及Mac平台)搭配相应的SDK进行,现对开发环境的搭建进行说明。 1:Deveco下载安装 下载对应平台的安装包即可。接下来以Windows平台为例,进行开发环境的搭建。 下载…

楼宇对讲、可视门铃案例分析

语音通话芯片:D34018,D34118,D5020,D31101; D34018 单片电话机通话电路,合并了必 需的放大器、衰减器和几种控制 功能,包括发送和接收衰减器、 背景噪声电平检测系统和一个衰 减器控制系统,对发送和接收电 平好于背景噪声做出反…

PyCharm添加自动函数文档注释

目录 1、背景2、开启PyCharm自动函数文档注释 1、背景 规范的函数文档注释有助于他人理解代码,便于团队协作、提高效率。但如果我们自己手写函数文档注释将非常耗时耗力。PyCharm安装后默认没有开启自动化函数文档注释,需要我们开启 2、开启PyCharm自动…

反序列化 [SWPUCTF 2021 新生赛]ez_unserialize

打开题目 查看源代码 得到提示&#xff0c;那我们用御剑扫描一下看看 我们知道有个robots.txt&#xff0c;访问一下得到 那我们便访问一下 cl45s.php看看 得到网站源代码 <?phperror_reporting(0); show_source("cl45s.php");class wllm{public $admin;public …

55.0/CSS 的应用(详细版)

目录 55.1.1 设计边框样式 55.1.2 调整边框的粗细 55.1.3 边框颜色 55.1.4 复合设置边框 55.2 模块的边距 55.3 模块的内边距 55.4 层的应用 55.4.1 层的建立 55.4.2 浮动——float 55.4.3 清除浮动 55.4.4 层的定位 55.4.5 设置层的溢出——overflow 55.4.6 设置鼠…

Linux开发工具——vim篇

vim开发工具的使用 文章目录 vim开发工具的使用认识vimvim常用三种模式vim正常模式命令集模式切换移动光标删除文字赋值替换撤销上一次操作更改跳到指定的行 vim末行模式命令集列出行号跳到文件中的某一行&#xff1a;保存文件离开vim查找字符&#xff1a; 总结题外话&#xff…

spring使用@Autowired @Lazy 注解 解决循环依赖

今天在启动项目时报错&#xff1a;org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name ‘colorController’: Unsatisfied dependency expressed through field ‘projectService’; nested exception is org.springframework.…

使用Dropzone提升开发效率的全方位指南

开发过程中&#xff0c;文件上传、图像处理、脚本执行等任务常常是不可或缺的环节。为了提升开发效率&#xff0c;开发者需要一个强大且灵活的工具。在这方面&#xff0c;Dropzone 是一个非常优秀的选择。本文将介绍如何在各种使用场景下&#xff0c;利用 Dropzone 工具来提高开…

【数据结构和算法】子数组最大平均数 I

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、题目描述 二、题解 2.1 滑动窗口含义 2.2 滑动窗口一般解法 2.3 方法一&#xff1a;滑动窗口 三、代码 3.1 方法一&#…