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

目录

​编辑

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

game_functions.py

14.1.6 隐藏光标

game_functions.py

game_functions.py

14.2 提高等级

14.2.1 修改速度设置

settings.py

settings.py

settings.py

game_functions.py

14.2.2 重置速度

game_functions.py

14.3 记分

game_stats.py

14.3.1 显示得分

scoreboard.py

scoreboard.py

scoreboard.py

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

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


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 = Falsepygame.mouse.set_visible(True)

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

14.2 提高等级

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

14.2.1 修改速度设置

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

settings.py
 def __init__(self):"""初始化游戏的静态设置"""# 屏幕设置self.screen_width = 1200self.screen_height = 800 self.bg_color = (230, 230, 230)# 飞船设置self.ship_limit = 3# 子弹设置self.bullet_width = 3self.bullet_height = 15self.bullet_color = 60, 60, 60self.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.5self.bullet_speed_factor = 3self.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_scaleself.bullet_speed_factor *= self.speedup_scaleself.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_limitself.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 = screenself.screen_rect = screen.get_rect()self.ai_settings = ai_settingsself.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指定的位置。


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

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

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

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

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

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

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

相关文章

TCP:IP原理

TCP/IP 原理 TCP/IP 协议不是 TCP 和 IP 这两个协议的合称,而是指因特网整个 TCP/IP 协议族。从协议分层模型方面来讲,TCP/IP 由四个层次组成:网络接口层、网络层、传输层、应用层。 网络访问层(Network Access Layer) 网络访问层(Network …

浅析海博深造

文章目录 深造作用 留学种类 选专业 择校 申请流程 申请方式 深造作用 1、个人能力提升(学术专业、语言、新文化或新生活方式) 2、更好的职业发展(起点更高、结交新朋友或扩大社交圈) 3、北京上海落户优惠 4、海外居留福…

1853_emacs_org-mode中的源代码编辑

Grey 全部学习内容汇总: GitHub - GreyZhang/g_org: my learning trip for org-mode 1853_emacs_org-mode的源代码编辑 代码块的编辑可以间接快速进行org-mode中代码块的编辑,而且有着类似纯粹的代码文件编辑的体验。 主题由来介绍 前面通过org-mod…

labelme标注的json文件数据转成coco数据集格式(可处理目标框和实例分割)

这里主要是搬运一下能找到的 labelme标注的json文件数据转成coco数据集格式(可处理目标框和实例分割)的代码,以供需要时参考和提供相关帮助。 1、官方labelme实现 如下是labelme官方网址,提供了源代码,以及相关使用方…

固定效应模型-以stata为工具

固定效应模型-以stata为工具 文章目录 1.固定效应模型2. 模型原理3. `stata`代码实现1.固定效应模型 固定效应模型(Fixed Effects Model)是一种面板数据分析方法,通过引入个体固定效应来控制个体间的异质性,并更准确地估计解释变量对因变量的影响。它在许多经济、社会科学…

Java 基础学习(十六)多线程基础、线程并发安全

1 多线程基础 1.1 进程和线程 1.1.1 什么是进程 进程(Process)是由操作系统执行的计算机程序的实例,是操作系统分配资源的基本单位。操作系统上运行的每一个应用程序都运行在一个进程中。比如计算机上的微信程序,也是运行在进程…

5G边缘计算:解密边缘计算的魔力

引言 你是否曾想过,网络可以更贴心、更智能地为我们提供服务?5G边缘计算就像是网络的小助手,时刻待命在你身边,让数字生活变得更加便捷。 什么是5G边缘计算? 想象一下,边缘计算就像是在离你最近的一层“云…

如何使用arthas监听项目性能耗时?

1.首先需要下载arthas项目 2.下载完成后启动你的项目,再启动我们的arthas:进到我们的bin目录 进到命令行窗口 java -jar arthas-boot.jar运行arthas java -jar arthas-boot.jar找到自己启动的项目对应的编号输入按回车即可,如下图所示 3…

RT-Thread 内核对象管理框架

内核对象管理框架 RT-Thread采用内核对象管理系统来访问/管理所有内核对象,内核对象包含了内核中绝大部分设施,这些内核对象可以是静态分配的静态对象,也可以是从系统内存堆中分配的动态对象。 RT-Thread内核对象包括:线程&…

如何选择合适的数据库?

数据库常常是应用系统中最大的性能瓶颈。一旦部署到生产环境中,就很难迁移,因此为应用系统选择合适的数据库至关重要。​ 做出正确决定的一个重要部分是知道面临哪些选择。数据库领域在过去几年迅速发生了变化,本文将试图探讨以下几个主题&am…

线段树/区间树(java实现版详解附leetcode例题)

目录 什么是线段树 线段树基础表示 创建线段树(Java版详解) 线段树的区间查询 leetcode上的线段树相关问题 leetcode303题.区域和检索-数组不可变 使用线段树解题 不使用线段树解题 leetcode307题.区域和检索-数组可修改 不使用线段树解题 线…

算法模板之队列图文详解

🌈个人主页:聆风吟 🔥系列专栏:算法模板、数据结构 🔖少年有梦不应止于心动,更要付诸行动。 文章目录 📋前言一. ⛳️模拟队列1.1 🔔用数组模拟实现队列1.1.1 👻队列的定…