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

news2025/1/11 14:31:04

目录

​编辑

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 = 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指定的位置。


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

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

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

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

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

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

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

相关文章

【动态规划算法】之打家劫舍Ⅱ

2.打家劫舍 II 和上一个比不同的就是,现在房屋围了一圈,第一个和最后一个相连 这道题目和198.打家劫舍 (opens new window)是差不多的,唯一区别就是成环了。 对于一个数组,成环的话主要有如下三种情况: 情况一&…

人工智能:从基础到前沿

人工智能:从基础到前沿 引言 当我们谈论“人工智能”(AI)时,我们其实是在谈论一个涵盖了众多学科、技术和应用的广阔领域。从计算机视觉到自然语言处理,从机器人学到深度学习,AI已经成为我们生活中不可或…

【OAuth2】授权框架的四种授权方式详解

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《OAuth 2》。🎯🎯 &#x1…

超维空间S2无人机使用说明书——21、VINS视觉定位仿真

引言:为了实现室内无人机的定位功能,S系列无人机配置了VINS-FUSION定位环境,主要包含了仿真跑数据集和实际操作部分。为了提前熟悉使用原理,可以先使用仿真环境跑数据集进行学习和理解 硬件:1080P显示器、Jetson orin…

PYQT的使用入门

上一章节:VSCode安装PYQT5-CSDN博客 QTDesigner初识 vscode导航栏右键,新建ui文件,弹出QT Designer。 完成创建后,可以在新窗口中进行UI布局。 QTDesigner左侧为组件库,中间为UI布局界面,右侧分别为对象…

Anylogic Pro 8.8.x for Mac / for Linux Crack

Digital twins – a step towards a digital enterprise AnyLogic是唯一一个支持创建模拟模型的方法的模拟建模工具:面向过程(离散事件)、系统动态和代理,以及它们的任何组合。AnyLogic提供的建模语言的独特性、灵活性和强大性使…

Redis数据库——键空间

一.服务器中的数据库 Redis服务器将所有数据库都保存在服务器状态redis.h/redisServer结构的db数组中,db数组的每一个项都是一个redis.h/redisDb结构,每一个RedisDb结构代表一个数据库。 在初始化服务器时,程序会根据服务器状态的dbnum属性来…

喷淋实验--嵌入式实训

喷淋实验--嵌入式实训 1.MQTT通信原理 采集信息: 小程序/Linux 订阅者 1703161172612/AIOTSIM2APP 元宇宙 发布者 1703161172612/AIOTSIM2APP Linux订阅的主题是元宇宙发布的主题 控制设备: 小程序/Linux 发布者 1703161172612/APP2AIOTSIM 元宇宙 订阅者…

java并发编程八 CAS 与 volatile和原子整数与原子引用

文章目录 CAS 与 volatile慢动作分析volatile为什么无锁效率高CAS 的特点 原子整数原子引用不安全实现安全实现-使用锁安全实现-使用 CAS CAS 与 volatile 在java并发编程七六中,可以看到的 AtomicInteger 的解决方法,内部并没有用锁来保护共享变量的线…

前端扫盲:什么是API网关?为什么它有用?

API 通常被称为应用程序从后端服务访问数据和业务逻辑的前门。API 本质上是一个软件向其他人或程序提供的接口,允许他们与该软件进行交互。 在创建 API 时,需要选择编程语言(Java、Python、PHP 等)来编写 API 逻辑,还需要将 API 部署到服务器…

前端项目为什么需要 TypeScript 来强化?

什么是TypeScript? TypeScript 是一个为开发大规模应用程序而设计的语言。它是 JavaScript 的一个超集,包含 JavaScript 全部的功能,并扩展了一些新的特性。具体来说,TypeScript 增加了如类型注解和编译时类型检查等特性: let n…

制作自己的 Docker 容器

软件开发最大的麻烦事之一,就是环境配置。用户必须保证操作系统的设置,各种库和组件的安装,只有它们都正确,软件才能运行。docker从根本上解决问题,软件安装的时候,把原始环境一模一样地复制过来。 以 koa-…

分布式事务三阶段提交3PC详解

文章目录 概述工作流程优缺点总结代码样例 概述 3PC 利用超时机制解决了 2PC 同步阻塞问题,避免资源被永久锁定,进一步加强了整个事务过程可靠性。但 3PC 同样无法应对类似宕机问题,只不过出现多数据源中数据不一致问题概率更小。 a. 概念&a…

Python中json模块的使用与pyecharts绘图的基本介绍

文章目录 json模块json与Python数据的相互转化 pyecharts模块pyecharts基本操作基础折线图配置选项全局配置选项 json模块的数据处理折线图示例示例代码 json模块 json实际上是一种数据存储格式,是一种轻量级的数据交互格式,可以把他理解成一个特定格式…

Spark编程实验三:Spark SQL编程

目录 一、目的与要求 二、实验内容 三、实验步骤 1、Spark SQL基本操作 2、编程实现将RDD转换为DataFrame 3、编程实现利用DataFrame读写MySQL的数据 四、结果分析与实验体会 一、目的与要求 1、通过实验掌握Spark SQL的基本编程方法; 2、熟悉RDD到DataFram…

springboot实现发送邮件开箱即用

springboot实现发送邮件开箱即用 环境依赖包yml配置Service层Controller层测试 环境 jdk17 springboot版本3.2.1 依赖包 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId><ver…

【OAuth2】:赋予用户控制权的安全通行证--原理篇

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于OAuth2的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.什么是OAuth? 二.为什么要用OAuth?…

第11章 GUI Page400~402 步骤二 画直线

运行效果&#xff1a; 源代码&#xff1a; /**************************************************************** Name: wxMyPainterApp.h* Purpose: Defines Application Class* Author: yanzhenxi (3065598272qq.com)* Created: 2023-12-21* Copyright: yanzhen…

《每天一分钟学习C语言·九》引用,指针函数,函数指针等

1、 普通全局变量——作用域是整个源程序&#xff08;含有多个源文件&#xff0c;在各个源文件中都有效&#xff09; static全局变量——作用域在当前源文件 2、 引用 &#xff08;1&#xff09;申明引用的同时必须要初始化 &#xff08;2&#xff09;引用变量是目标变量的一个…

Windows 11中显示文件扩展名的方法与Windows 10大同小异,但前者更人性化

默认情况下&#xff0c;Windows 11会隐藏已知文件类型的文件扩展名。这可能会使在不首先打开文件的情况下很难识别文件类型。 幸运的是&#xff0c;你可以将Windows 11配置为显示已知文件类型的扩展名。该方法类似于Windows 10&#xff0c;但该选项现在组织在下拉菜单中&#…