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

简介: 关于“Python”的核心知识点整理大全39

14.1.5 将 Play 按钮切换到非活动状态

当前,Play按钮存在一个问题,那就是即便Play按钮不可见,玩家单击其原来所在的区域时, 游戏依然会作出响应。游戏开始后,如果玩家不小心单击了Play按钮原来所处的区域,游戏将重 新开始! 为修复这个问题,可让游戏仅在game_active为False时才开始:

game_functions.py

def check_play_button(ai_settings, screen, stats, play_button, ship, aliens,
 bullets, mouse_x, mouse_y):
 """玩家单击Play按钮时开始新游戏"""
1 button_clicked = play_button.rect.collidepoint(mouse_x, mouse_y)
2 if button_clicked and not stats.game_active:
 #重置游戏统计信息
 --snip--

标志button_clicked的值为True或False(见1),仅当玩家单击了Play按钮且游戏当前处于非活 动状态时,游戏才重新开始(见2)。为测试这种行为,可开始新游戏,并不断地单击Play按钮原 来所在的区域。如果一切都像预期的那样工作,单击Play按钮原来所处的区域应该没有任何影响。

14.1.6 隐藏光标

为让玩家能够开始游戏,我们要让光标可见,但游戏开始后,光标只会添乱。为修复这种问 题,我们在游戏处于活动状态时让光标不可见:

game_functions.py

def check_play_button(ai_settings, screen, stats, play_button, ship, aliens,
 bullets, mouse_x, mouse_y):
 """在玩家单击Play按钮时开始新游戏"""
 button_clicked = play_button.rect.collidepoint(mouse_x, mouse_y)
 if button_clicked and not stats.game_active:
 # 隐藏光标
 pygame.mouse.set_visible(False)
 --snip--

通过向set_visible()传递False,让Pygame在光标位于游戏窗口内时将其隐藏起来。 游戏结束后,我们将重新显示光标,让玩家能够单击Play按钮来开始新游戏。相关的代码 如下:

game_functions.py

def ship_hit(ai_settings, screen, stats, ship, aliens, bullets):
 """响应飞船被外星人撞到"""
 if stats.ships_left > 0:
 --snip--
 else:
 stats.game_active = False
 pygame.mouse.set_visible(True)

在ship_hit()中,我们在游戏进入非活动状态后,立即让光标可见。关注这样的细节让游戏 显得更专业,也让玩家能够专注于玩游戏而不是费力搞明白用户界面。

14.2 提高等级

当前,将整群外星人都消灭干净后,玩家将提高一个等级,但游戏的难度并没有变。下面 来增加一点趣味性:每当玩家将屏幕上的外星人都消灭干净后,加快游戏的节奏,让游戏玩起 来更难。

14.2.1 修改速度设置

我们首先重新组织Settings类,将游戏设置划分成静态的和动态的两组。对于随着游戏进行 而变化的设置,我们还确保它们在开始新游戏时被重置。settings.py的方法__init__()如下:

settings.py

def __init__(self):
 """初始化游戏的静态设置"""
 # 屏幕设置
 self.screen_width = 1200
 self.screen_height = 800 
 self.bg_color = (230, 230, 230)
 # 飞船设置
 self.ship_limit = 3
 # 子弹设置
 self.bullet_width = 3
 self.bullet_height = 15
 self.bullet_color = 60, 60, 60
 self.bullets_allowed = 3
 # 外星人设置
 self.fleet_drop_speed = 10
 # 以什么样的速度加快游戏节奏
1 self.speedup_scale = 1.1
2 self.initialize_dynamic_settings()

我们依然在__init__()中初始化静态设置。在处,我们添加了设置speedup_scale,用于控 制游戏节奏的加快速度:2表示玩家每提高一个等级,游戏的节奏就翻倍;1表示游戏节奏始终不 变。将其设置为1.1能够将游戏节奏提高到够快,让游戏既有难度,又并非不可完成。最后,我 们调用initialize_dynamic_settings(),以初始化随游戏进行而变化的属性(见)。 initialize_dynamic_settings()的代码如下:

settings.py

def initialize_dynamic_settings(self):
 """初始化随游戏进行而变化的设置"""
 self.ship_speed_factor = 1.5
 self.bullet_speed_factor = 3
 self.alien_speed_factor = 1
 # fleet_direction为1表示向右;为-1表示向左
 self.fleet_direction = 1

这个方法设置了飞船、子弹和外星人的初始速度。随游戏的进行,我们将提高这些速度,而 每当玩家开始新游戏时,都将重置这些速度。在这个方法中,我们还设置了fleet_direction,使 得游戏刚开始时,外星人总是向右移动。每当玩家提高一个等级时,我们都使用increase_speed() 来提高飞船、子弹和外星人的速度:

settings.py

def increase_speed(self):
 """提高速度设置"""
 self.ship_speed_factor *= self.speedup_scale
 self.bullet_speed_factor *= self.speedup_scale
 self.alien_speed_factor *= self.speedup_scale

为提高这些游戏元素的速度,我们将每个速度设置都乘以speedup_scale的值。 在check_bullet_alien_collisions()中,我们在整群外星人都被消灭后调用increase_speed() 来加快游戏的节奏,再创建一群新的外星人:

game_functions.py

def check_bullet_alien_collisions(ai_settings, screen, ship, aliens, bullets):
 --snip--
 if len(aliens) == 0:
 # 删除现有的子弹,加快游戏节奏,并创建一群新的外星人
 bullets.empty()
 ai_settings.increase_speed()
 create_fleet(ai_settings, screen, ship, aliens)

通过修改速度设置ship_speed_factor、alien_speed_factor和bullet_speed_factor的值,足 以加快整个游戏的节奏!

14.2.2 重置速度

每当玩家开始新游戏时,我们都需要将发生了变化的设置重置为初始值,否则新游戏开始时, 速度设置将是前一次游戏增加了的值:

game_functions.py

def check_play_button(ai_settings, screen, stats, play_button, ship, aliens,
 bullets, mouse_x, mouse_y):
 """在玩家单击Play按钮时开始新游戏"""
 button_clicked = play_button.rect.collidepoint(mouse_x, mouse_y)
 if button_clicked and not stats.game_active:
 # 重置游戏设置
 ai_settings.initialize_dynamic_settings()
 # 隐藏光标
 pygame.mouse.set_visible(False)
 --snip--

现在,游戏《外星人入侵》玩起来更有趣,也更有挑战性。每当玩家将屏幕上的外星人消灭 干净后,游戏都将加快节奏,因此难度会更大些。如果游戏的难度提高得太快,可降低 settings.speedup_scale的值;如果游戏的挑战性不足,可稍微提高这个设置的值。找出这个设 置的最佳值,让难度的提高速度相对合理:一开始的几群外星人很容易消灭干净;接下来的几群 消灭起来有一定难度,但也不是不可能;而要将更靠后的外星人群消灭干净几乎不可能。

14.3 记分

下面来实现一个记分系统,以实时地跟踪玩家的得分,并显示最高得分、当前等级和余下的 飞船数。 得分是游戏的一项统计信息,因此我们在GameStats中添加一个score属性:

game_stats.py

class GameStats():
 --snip--
 def reset_stats(self):
 """初始化随游戏进行可能变化的统计信息"""
 self.ships_left = self.ai_settings.ship_limit
 self.score = 0

为在每次开始游戏时都重置得分,我们在reset_stats()而不是__init__()中初始化score。

14.3.1 显示得分

为在屏幕上显示得分,我们首先创建一个新类Scoreboard。就当前而言,这个类只显示当前 得分,但后面我们也将使用它来显示最高得分、等级和余下的飞船数。下面是这个类的前半部分, 它被保存为文件scoreboard.py:

scoreboard.py

import pygame.font
class Scoreboard():
 """显示得分信息的类"""
1 def __init__(self, ai_settings, screen, stats):
 """初始化显示得分涉及的属性"""
 self.screen = screen
 self.screen_rect = screen.get_rect()
 self.ai_settings = ai_settings
 self.stats = stats
 # 显示得分信息时使用的字体设置
2 self.text_color = (30, 30, 30)
3 self.font = pygame.font.SysFont(None, 48)
 # 准备初始得分图像
4 self.prep_score()

由于Scoreboard在屏幕上显示文本,因此我们首先导入模块pygame.font。接下来,我们在 __init__()中包含形参ai_settings、screen和stats,让它能够报告我们跟踪的值(见1)。然后, 我们设置文本颜色(见2)并实例化一个字体对象(见3)。 为将要显示的文本转换为图像,我们调用了prep_score()(见4),其定义如下:

scoreboard.py

def prep_score(self):
"""将得分转换为一幅渲染的图像"""
1 score_str = str(self.stats.score)
2 self.score_image = self.font.render(score_str, True, self.text_color,
 self.ai_settings.bg_color)
 # 将得分放在屏幕右上角
3 self.score_rect = self.score_image.get_rect()
4 self.score_rect.right = self.screen_rect.right - 20
5 self.score_rect.top = 20

在prep_score()中,我们首先将数字值stats.score转换为字符串(见1),再将这个字符串 传递给创建图像的render()(见2)。为在屏幕上清晰地显示得分,我们向render()传递了屏幕背 景色,以及文本颜色。

我们将得分放在屏幕右上角,并在得分增大导致这个数字更宽时让它向左延伸。为确保得分 始终锚定在屏幕右边,我们创建了一个名为score_rect的rect(见3),让其右边缘与屏幕右边缘 相距20像素(见4),并让其上边缘与屏幕上边缘也相距20像素(见5)。 最后,我们创建方法show_score(),用于显示渲染好的得分图像:

scoreboard.py

def show_score(self):
 """在屏幕上显示得分"""
 self.screen.blit(self.score_image, self.score_rect)

这个方法将得分图像显示到屏幕上,并将其放在score_rect指定的位置。

目录
相关文章
|
1月前
|
测试技术 API Python
【10月更文挑战第1天】python知识点100篇系列(13)-几种方法让你的电脑一直在工作
【10月更文挑战第1天】 本文介绍了如何通过Python自动操作鼠标或键盘使电脑保持活跃状态,避免自动息屏。提供了三种方法:1) 使用PyAutoGUI,通过安装pip工具并执行`pip install pyautogui`安装,利用`moveRel()`方法定时移动鼠标;2) 使用Pymouse,通过`pip install pyuserinput`安装,采用`move()`方法移动鼠标绝对位置;3) 使用PyKeyboard,同样需安装pyuserinput,模拟键盘操作。文中推荐使用PyAutoGUI,因其功能丰富且文档详尽。
|
3月前
|
Python
python知识点
【8月更文挑战第27天】python知识点
3398 2
|
18天前
|
缓存 Java 索引
[Python]知识点
本文主要介绍了Python的一些高级知识点和使用细节,包括pip的使用、内置函数、列表、元组、字典、集合、变量、Lambda表达式、面向对象编程、异常处理、模块及标准库等。文章适合有一定Python基础的读者,重点在于深入理解和掌握Python的高级特性。文中还提供了大量示例代码,帮助读者更好地理解和应用这些知识点。
21 1
[Python]知识点
WK
|
3月前
|
存储 机器学习/深度学习 JSON
Python入门知识点
Python入门覆盖历史、设计理念、变量、数据类型、控制结构等。了解Python的发展,掌握动态类型的灵活性,熟悉整数、浮点数、字符串等数据类型。学会if/else、for/while循环构建逻辑流程,使用def定义函数,lambda快速创建匿名函数。通过类实现面向对象编程,利用模块和包组织代码。掌握try-except处理异常,open()进行文件操作。利用标准库和第三方库增强功能,理解集合、字典、列表推导式的应用,深入魔法方法、递归、装饰器等高级特性,以及上下文管理器和字符串、列表、元组的操作技巧。
WK
34 0
|
1月前
|
安全 Linux 数据安全/隐私保护
python知识点100篇系列(15)-加密python源代码为pyd文件
【10月更文挑战第5天】为了保护Python源码不被查看,可将其编译成二进制文件(Windows下为.pyd,Linux下为.so)。以Python3.8为例,通过Cython工具,先写好Python代码并加入`# cython: language_level=3`指令,安装easycython库后,使用`easycython *.py`命令编译源文件,最终生成.pyd文件供直接导入使用。
python知识点100篇系列(15)-加密python源代码为pyd文件
|
1月前
|
网络协议 数据库连接 Python
python知识点100篇系列(17)-替换requests的python库httpx
【10月更文挑战第4天】Requests 是基于 Python 开发的 HTTP 库,使用简单,功能强大。然而,随着 Python 3.6 的发布,出现了 Requests 的替代品 —— httpx。httpx 继承了 Requests 的所有特性,并增加了对异步请求的支持,支持 HTTP/1.1 和 HTTP/2,能够发送同步和异步请求,适用于 WSGI 和 ASGI 应用。安装使用 httpx 需要 Python 3.6 及以上版本,异步请求则需要 Python 3.8 及以上。httpx 提供了 Client 和 AsyncClient,分别用于优化同步和异步请求的性能。
python知识点100篇系列(17)-替换requests的python库httpx
|
1月前
|
调度 Python
python知识点100篇系列(20)-python协程与异步编程asyncio
【10月更文挑战第8天】协程(Coroutine)是一种用户态内的上下文切换技术,通过单线程实现代码块间的切换执行。Python中实现协程的方法包括yield、asyncio模块及async/await关键字。其中,async/await结合asyncio模块可更便捷地编写和管理协程,支持异步IO操作,提高程序并发性能。协程函数、协程对象、Task对象等是其核心概念。
|
28天前
|
Python Windows
python知识点100篇系列(24)- 简单强大的日志记录器loguru
【10月更文挑战第11天】Loguru 是一个功能强大的日志记录库,支持日志滚动、压缩、定时删除、高亮和告警等功能。安装简单,使用方便,可通过 `pip install loguru` 快速安装。支持将日志输出到终端或文件,并提供丰富的配置选项,如按时间或大小滚动日志、压缩日志文件等。还支持与邮件通知模块结合,实现邮件告警功能。
python知识点100篇系列(24)- 简单强大的日志记录器loguru
|
28天前
|
自然语言处理 Python Windows
python知识点100篇系列(23)- 使用stylecloud生成词云
【10月更文挑战第10天】`stylecloud` 是 `wordcloud` 的优化版,支持使用 Font Awesome 图标自定义词云形状,操作更简便。本文介绍如何安装 `jieba` 和 `stylecloud` 库,并使用它们生成中文词云。通过 `jieba` 进行分词,再利用 `stylecloud` 的 `gen_stylecloud` 方法生成具有特定形状和颜色的词云图像。
python知识点100篇系列(23)- 使用stylecloud生成词云
|
1月前
|
Java Python
> python知识点100篇系列(19)-使用python下载文件的几种方式
【10月更文挑战第7天】本文介绍了使用Python下载文件的五种方法,包括使用requests、wget、线程池、urllib3和asyncio模块。每种方法适用于不同的场景,如单文件下载、多文件并发下载等,提供了丰富的选择。
下一篇
无影云桌面