关于“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 = 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.mfbz.cn/a/267414.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

TCGA超过1G的病理wsi数据下载-gdc-client

使用网页端下载TCGA超过1G的病理wsi数据,数据下载到1G后就不能完整下载。遂采用gdc-client下载。 Win 环境下新建这个文件夹放在系统盘进行储存,否则会报错:ERROR: Unable to write state file: [WinError 17] 系统无法将文件移到不同的磁盘…

Node 源项目定制化、打包并使用全过程讲解

👨🏻‍💻 热爱摄影的程序员 👨🏻‍🎨 喜欢编码的设计师 🧕🏻 擅长设计的剪辑师 🧑🏻‍🏫 一位高冷无情的编码爱好者 大家好,我是全栈工…

WGCLOUD快速部署方案 - 批量给Linux安装agent

有时候我们的Linux服务器比较多,一个一个安装比较花费时间,还要WGCLOUD提供了一个辅助工具wgcloud-bach-agent,可以批量给Linux服务器上传agent安装包,并自动解压和启动agent,可以大大减少我们的部署工作和时间 下载和…

无约束优化问题求解(4):牛顿法后续

目录 前言SR1, DFP, BFGS之间的关系 BB方法Reference 前言 Emm,由于上一篇笔记的字数超过了要求(这还是第一次- -),就把后续内容放到这篇笔记里面了,公式的标号仍然不变,上一篇笔记的连接在这:…

C++之多层 if-else-if 结构优化(三)

C之多层 if-else-if 结构优化(二)-CSDN博客 接上面的内容继续讲解多层 if-else-if结构优化 8、利用规则执行器来进行优化 8.1 业务场景介绍 if (未注册用户){return false; }if (是否国外用户) {return false; }if (刷单用户) {return false; }if (未付费用户 && 不…

中国肺癌情形

写在前面 再看下中国肺癌的情形 综述 文章名期刊影响因子Non-small cell lung cancer in ChinaCancer Commun16.2 摘要 风险因子:吸烟史、家族史、放射暴露、空气污染、慢性肺病 晚期PD-1/PD-L1抑制剂单药使用或联合化疗药物作为标准治疗。局部肺癌晚期&#xf…

铁山靠之——HarmonyOS基础 - 1.0

HarmonyOS学习第一章 一、HarmonyOS简介1.1 安装和使用DevEco Studio1.2 环境配置1.3 项目创建1.4 运行程序1.5 基本工程目录1.5.1 工程级目录1.5.2 模块级目录1.5.3 app.json51.5.4 module.json51.5.5 main_pages.json 二、TypeScript快速入门2.1 简介2.2 基础类型2.2.1 布尔值…

Python 爬虫之下载视频(三)

批量下载某B主视频 文章目录 批量下载某B主视频前言一、基本思路二、确定遍历循环结构三、基本思路中第12步三、基本思路中第345步总结 前言 上一篇讲了如何去获取标题和视频链接。这篇就跟大家讲一下如何去下载这些视频。本篇会以标题和 视频链接 为突破口,来寻找…

day09

文章目录 一、jQuery简介1. 介绍2. 使用1)引入2)工厂函数 - $()3)原生JS对象与jQuery对象4)jQuery获取元素5)操作元素内容6)操作标签属性7)操作标签样式8)根据层级结构获取元素9&…

Cisco 将收购 Cilium 母公司 Isovalent,预计 2024 年第 3 季度完成

本文地址:Cisco 将收购 Cilium 母公司 Isovalent,预计 2024 年第 3 季度完成 | 深入浅出 eBPF 2023 年 12 月 21 日,Isovalent 公司 CTO & 联合创始人 Thomas Graf 和 Cisco 安全业务集团高级副总裁兼总经理 Tom Gillis 分别在各自公司网…

解决Unity物体速度过快无法进行碰撞检测(碰撞检测穿透)

解决Unity物体速度过快无法进行碰撞检测(碰撞检测穿透) 一、解决碰撞检测穿透方法一Collision Detection碰撞检测总结: 二、解决碰撞检测穿透方法二 一、解决碰撞检测穿透方法一 首先我们知道只要是跟碰撞相关的基本都是离不开刚体 Rigidbod…

LuaTable转C#的列表List和字典Dictionary

LuaTable转C#的列表List和字典Dictionaty 介绍lua中创建表测试lua中list表表转成List表转成Dictionary 键值对表表转成Dictionary 多类型键值对表表转成Dictionary 总结 介绍 之前基本都是从C#中的List或者Dictionary转成luaTable,很少会把LuaTable转成C#的List或者…

.net core webapi 大文件上传到wwwroot文件夹

1.配置staticfiles(program文件中) app.UseStaticFiles();2.在wwwroot下创建upload文件夹 3.返回结果封装 namespace webapi;/// <summary> /// 统一数据响应格式 /// </summary> public class Results<T> {/// <summary>/// 自定义的响应码&#xff…

基于Flask、MySQL和Echarts的*市CPI和物价水平数据可视化分析

基于Flask、MySQL和Echarts的*市CPI和物价水平数据可视化分析 引言&#xff1a; 在当前社会经济背景下&#xff0c;CPI&#xff08;居民消费价格指数&#xff09;和物价水平的波动对市场和居民生活产生直接影响。本文将介绍一款基于Flask、MySQL和Echarts的数据可视化系统&…

Nature 新研究发布,GPT 驱动的机器人化学家能够自行设计和进行实验,这对科研意味着什么?

文章目录 前言揭秘Coscientist不到四分钟&#xff0c;设计并改进了程序能力越大&#xff0c;责任越大 前言 有消息称&#xff0c;AI 大模型 “化学家” 登 Nature 能够自制阿司匹林、对乙酰氨基酚、布洛芬&#xff0c;甚至连复杂的钯催化交叉偶联反应&#xff0c;也能完成。 …

20231222给NanoPC-T4(RK3399)开发板的适配Android11的挖掘机方案并跑通AP6398SV

20231222给NanoPC-T4(RK3399)开发板的适配Android11的挖掘机方案并跑通AP6398SV 2023/12/22 7:54 简略步骤&#xff1a;rootrootrootroot-X99-Turbo:~/3TB$ cat Android11.0.tar.bz2.a* > Android11.0.tar.bz2 rootrootrootroot-X99-Turbo:~/3TB$ tar jxvf Android11.0.tar.…

『OPEN3D』1.1 点云处理

目录 1.open3d中的点云IO 2.点云的可视化 3 点云voxel下采样 4. 顶点法线估计 5.最小外界矩 6. 凸包计算 7. 点云距离计算 8. DBSCAN clustering聚类 9. RANSAC(Random Sample Consensus) 10. 点云平面分割 11. 隐藏点移除 12.outliers移除 13 最远点采样&#xf…

安全、高效的MySQL DDL解决方案

MySQL作为目前应用最广泛的开源关系型数据库&#xff0c;是许多网站、应用和商业产品的主要数据存储。在生产环境&#xff0c;线上数据库常常面临着持续的、不断变化的表结构修改&#xff08;DDL&#xff09;&#xff0c;如增加、更改、删除字段和索引等等。其中一些DDL操作在M…

Vue3中的混入(mixins)

本文主要介绍Vue3中的混入&#xff08;mixins&#xff09;。 目录 一、在普通写法中使用混入&#xff1a;二、在setup写法中使用混入&#xff1a; 混入是Vue中一种用于在组件中共享可复用功能的特性。在Vue 3中&#xff0c;混入的使用方式有所改变。 一、在普通写法中使用混入…

MongoDB安装部署

二、安装部署 2.1 下载 下载地址&#xff1a;MongoDB Enterprise Server Download | MongoDB 当前最新版本6.0.9&#xff0c;5.0.9对Mac m1需要centos 8.2版本。选择docker安装。 2.2 docker-ce安装 # 安装docker # 默认repo源没有docker-ce安装包&#xff0c;需要新的rep…
最新文章