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

news2024/11/19 13:14:38

目录

scoreboard.py

game_functions.py

game_functions.py

14.3.8 显示等级

game_stats.py

scoreboard.py

scoreboard.py

scoreboard.py

game_functions.py

game_functions.py

alien_invasion.py

14.3.9 显示余下的飞船数

ship.py

scoreboard.py


 

我们将最高得分圆整到最近的10的整数倍(1),并添加了用逗号表示的千分位分隔符(见 2)。然后,我们根据最高得分生成一幅图像(见3),使其水平居中(见4),并将其top属性设 置为当前得分图像的top属性(见5)。

现在,方法show_score()需要在屏幕右上角显示当前得分,并在屏幕顶部中央显示最高得分:

scoreboard.py

 def show_score(self):
 """在屏幕上显示当前得分和最高得分"""
 self.screen.blit(self.score_image, self.score_rect)
 self.screen.blit(self.high_score_image, self.high_score_rect) 

为检查是否诞生了新的最高得分,我们在game_functions.py中添加一个新函数check_high_ score():

game_functions.py

函数check_high_score()包含两个形参:stats和sb。它使用stats来比较当前得分和最高得 分,并在必要时使用sb来修改最高得分图像。在处,我们比较当前得分和最高得分,如果当前 得分更高,就更新high_score的值,并调用prep_high_score()来更新包含最高得分的图像。 在check_bullet_alien_collisions()中,每当有外星人被消灭,都需要在更新得分后调用 check_high_score():

game_functions.py
def check_bullet_alien_collisions(ai_settings, screen, stats, sb, ship,
 aliens, bullets):
 --snip--
 if collisions:
 for aliens in collisions.values():
 stats.score += ai_settings.alien_points * len(aliens)
 sb.prep_score()
 check_high_score(stats, sb)
 --snip-- 

字典collisions存在时,我们根据消灭了多少外星人来更新得分,再调用check_high_ score()。 第一次玩这款游戏时,当前得分就是最高得分,因此两个地方显示的都是当前得分。但再次 开始这个游戏时,最高得分出现在中央,而当前得分出现在右边,如图14-4所示。

14.3.8 显示等级

为在游戏中显示玩家的等级,首先需要在GameStats中添加一个表示当前等级的属性。为确 保每次开始新游戏时都重置等级,在reset_stats()中初始化它:

game_stats.py
 def reset_stats(self):
 """初始化随游戏进行可能变化的统计信息"""
 self.ships_left = self.ai_settings.ship_limit
 self.score = 0
 self.level = 1

为让Scoreboard能够在当前得分下方显示当前等级,我们在__init__()中调用了一个新方法 prep_level():

scoreboard.py
 def __init__(self, ai_settings, screen, stats):
 --snip--
 # 准备包含得分的初始图像
 self.prep_score()
 self.prep_high_score()
 self.prep_level() 

prep_level()的代码如下:

scoreboard.py
 def prep_level(self):
 """将等级转换为渲染的图像"""
1 self.level_image = self.font.render(str(self.stats.level), True,
 self.text_color, self.ai_settings.bg_color)
 # 将等级放在得分下方
 self.level_rect = self.level_image.get_rect()
2 self.level_rect.right = self.score_rect.right
3 self.level_rect.top = self.score_rect.bottom + 10

方法prep_level()根据存储在stats.level中的值创建一幅图像(见),并将其right属性设 置为得分的right属性(见)。然后,将top属性设置为比得分图像的bottom属性大10像素,以便 在得分和等级之间留出一定的空间(见)。 我们还需要更新show_score():

scoreboard.py
 def show_score(self):
 """在屏幕上显示飞船和得分"""
self.screen.blit(self.score_image, self.score_rect)
self.screen.blit(self.high_score_image, self.high_score_rect)
 self.screen.blit(self.level_image, self.level_rect)

在这个方法中,添加了一行在屏幕上显示等级图像的代码。 我们在check_bullet_alien_collisions()中提高等级,并更新等级图像: game_functions.py

def check_bullet_alien_collisions(ai_settings, screen, stats, sb, ship,
 aliens, bullets):
 --snip--
 if len(aliens) == 0:
 # 如果整群外星人都被消灭,就提高一个等级
 bullets.empty()
 ai_settings.increase_speed()
 # 提高等级
1 stats.level += 1
2 sb.prep_level()
 create_fleet(ai_settings, screen, ship, aliens)

如果整群外星人都被消灭,我们就将stats.level的值加1(见),并调用prep_level(),以 确保正确地显示新等级(见)。 为确保开始新游戏时更新记分和等级图像,在按钮Play被单击时触发重置:

game_functions.py
def check_play_button(ai_settings, screen, stats, sb, 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:
 --snip--
 # 重置游戏统计信息
 stats.reset_stats()
 stats.game_active = True
 # 重置记分牌图像
1 sb.prep_score()
 sb.prep_high_score()
 sb.prep_level()
 # 清空外星人列表和子弹列表
 aliens.empty()
 bullets.empty()
 --snip-- 

check_play_button()的定义需要包含对象sb。为重置记分牌图像,我们在重置相关游戏设置 后调用prep_score()、prep_high_score()和prep_level()(见)。 在check_events()中,现在需要向check_play_button()传递sb,让它能够访问记分牌对象:

game_functions.py
def check_events(ai_settings, screen, stats, sb, play_button, ship, aliens,
 bullets):
 """响应按键和鼠标事件"""
 for event in pygame.event.get():
 if event.type == pygame.QUIT:
 --snip--
 elif event.type == pygame.MOUSEBUTTONDOWN:
 mouse_x, mouse_y = pygame.mouse.get_pos()
1 check_play_button(ai_settings, screen, stats, sb, play_button,
 ship, aliens, bullets, mouse_x, mouse_y) 

check_events()的定义需要包含形参sb,这样调用check_play_button()时,才能将sb作为实 参传递给它(见)。 最后,更新alien_invasion.py中调用check_events()的代码,也向它传递sb:

alien_invasion.py
 # 开始游戏主循环
 while True:
 gf.check_events(ai_settings, screen, stats, sb, play_button, ship,
 aliens, bullets)
 --snip--

现在你可以知道升到多少级了,如图14-5所示。


注意

在一些经典游戏中,得分带标签,如Score、High Score和Level。我们没有显示这些标签, 因为开始玩这款游戏后,每个数字的含义将一目了然。要包含这些标签,只需在Scoreboard 中调用font.render()前,将它们添加到得分字符串中即可。


14.3.9 显示余下的飞船数

最后,我们来显示玩家还有多少艘飞船,但使用图形而不是数字。为此,我们在屏幕左上角 绘制飞船图像来指出还余下多少艘飞船,就像众多经典的街机游戏那样。 首先,需要让Ship继承Sprite,以便能够创建飞船编组:

ship.py
import pygame
from pygame.sprite import Sprite
1 class Ship(Sprite):
 def __init__(self, ai_settings, screen):
 """初始化飞船,并设置其起始位置"""
2 super(Ship, self).__init__()
 --snip-- 

在这里,我们导入了Sprite,让Ship继承Sprite (见1),并在__init__()的开头就调用了super()(见2)。

接下来,需要修改Scoreboard,在其中创建一个可供显示的飞船编组。下面是其中的import 语句和方法__init__(): scoreboard.py

import pygame.font
from pygame.sprite import Group
from ship import Ship
class Scoreboard():
 """报告得分信息的类"""
 def __init__(self, ai_settings, screen, stats):
 --snip--
 self.prep_level()
 self.prep_ships()
 --snip-- 

鉴于要创建一个飞船编组,我们导入Group和Ship类。调用prep_level()后,我们调用了 prep_ships()。 prep_ships()的代码如下:

scoreboard.py

 def prep_ships(self):
 """显示还余下多少艘飞船"""
1 self.ships = Group()
2 for ship_number in range(self.stats.ships_left):
 ship = Ship(self.ai_settings, self.screen)
3 ship.rect.x = 10 + ship_number * ship.rect.width
4 ship.rect.y = 10
5 self.ships.add(ship) 

方法prep_ships()创建一个空编组self.ships,用于存储飞船实例(见1)。为填充这个编组, 根据玩家还有多少艘飞船运行一个循环相应的次数(见2)。在这个循环中,我们创建一艘新飞 船,并设置其x坐标,让整个飞船编组都位于屏幕左边,且每艘飞船的左边距都为10像素(见3)。 我们还将y坐标设置为离屏幕上边缘10像素,让所有飞船都与得分图像对齐(见4)。最后,我们 将每艘新飞船都添加到编组ships中(见55)。 现在需要在屏幕上绘制飞船了:

scoreboard.py
def show_score(self):
 --snip--
 self.screen.blit(self.level_image, self.level_rect)
 # 绘制飞船
 self.ships.draw(self.screen)

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

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

相关文章

大数据与人工智能|全面数字化战略与企业数字化转型(第1节 )

要点一:培养跨学科思维 在分析时,需要采用多学科的思维方式 结果不重要,重要的是如何提炼现象、分析问题和得出结论的过程。 1. 介绍了锤子精神和多学科思维方式的重要性。指出了只从自身学科出发解决问题的局限性。 2. 提倡跨学科思维方式&a…

家校互通小程序实战开发02首页搭建

目录 1 创建应用2 搭建首页总结 我们上一篇介绍了家校互通小程序的需求,创建了对应的数据源。有了这个基础的分析之后,我们就可以进入到开发阶段了。开发小程序,先需要创建应用。 1 创建应用 登录控制台,点击创建应用&#xff0c…

2024年深度学习、计算机视觉与大模型面试题综述,六大专题数百道题目

DeepLearning-Interview-Awesome-2024 本项目涵盖了大模型(LLMs)专题、计算机视觉与感知算法专题、深度学习基础与框架专题、自动驾驶、智慧医疗等行业垂域专题、手撕项目代码专题、优异开源资源推荐专题共计6大专题模块。我们将持续整理汇总最新的面试题并详细解析这些题目&a…

元宇宙与VR虚拟现实的未来如何?

从科幻小说到商业现实 自从 Facebook年更名为 Meta 以来,关于元宇宙的热议不断,人们对虚拟世界的兴趣也重新燃起,因为尽管虚拟现实 (VR) 的概念由来已久,但该技术现在才开始真正得以应用。 定义元宇宙和虚拟现实 首先是 The Met…

玩客云 青龙面板

一、刷机 需要的工具,镊子,双公头USB(可以自己做),U盘 青龙面板全教程 | Anubis的小窝 powersee教程 玩客云导航固件使用说明 安装教程 玩客云乱七八糟的坑 静态IP配置 玩客云第二版固件说明 docker 下载器 …

摇杆控制人物移动

摇杆控制人物移动 一、UI搭建二、3d模型搭建三、脚本JoyStickBar.csPlayerController.cs 工程在我资源里名字叫Joystickbar.unitypackage [连接](https://download.csdn.net/download/qq_42194657/12043019?spm1001.2014.3001.5503) 一、UI搭建 JoyStickBar是图片背景 JoySt…

【MATLAB第86期】基于matlab的Catboost多输入单输出分类预测模型 catboost-1.1.1版本

基于matlab的Catboost多输入单输出分类预测模型 catboost-1.1.1版本 运行环境 windows10 matlab2020a catboost版本:catboost-1.1.1 往期: 【MATLAB第20期】基于matlab的Catboost多输入单输出回归预测模型 catboost-1.1.1版本 一、导入数据 采用12输…

sqlilabs第三十六三十七关

Less-36(GET - Bypass MySQL_real_escape_string) 手工注入 单引号闭合(单引号自动转换的编码变了直接输入%27) 自动注入 和上一关一样 Less-37(POST - Bypass MySQL_real_escape_string) 手工注入 这个也是碰到过的情况 接下…

WizFi360-EVB-Pico评估版介绍

文章目录 1 概述2 硬件资源2.1 硬件规格2.2 引脚定义2.3 工作条件 3 参考资料3.1 Datasheet3.2 原理图3.3 尺寸图(单位 : mm) 3.4 参考例程 1 概述 WizFi360-EVB-Pico基于树莓派RP2040,并使用WizFi360增加Wi-Fi连接。它与树莓派Pico板引脚兼容,可用于物联…

城市自贸区/经开区/产业园基于EasyCVR视频技术的可视化、移动化、智能化视频监管方案

一、背景需求 移动互联网的发展激发了用户对轻应用的使用习惯。4G、5G使得无线带宽快速提升,令大流量视频数据流逐渐从PC往手持终端转移。借助智能手持终端也可以实时查看、远程控制、存储录像、抓拍图像,能方便快捷地掌握所关注区域的视频动态。 随着…

prometheus api调用案例(代码+curl)

只有干货哦! 目录 支持的api列表 代码调用 库 k8s集群下的prom 非容器部署的prom调用 curl调用 示例1:查询数据 示例2:热加载配置 示例3:主动删除数据 支持的api列表 源码位置:github.com\prometheus\client_…

鸿蒙操作系统:从手机到物联网,打造全场景智能体验

随着科技的不断发展,人们对于操作系统的需求也在不断升级。鸿蒙操作系统,作为华为推出的新一代智能终端操作系统,凭借其强大的分布式能力、流畅的用户体验以及丰富的应用生态,正逐渐成为人们关注的焦点。 一、鸿蒙操作系统概述 …

【论文笔记】BiFormer: Vision Transformer with Bi-Level Routing Attention

论文地址:BiFormer: Vision Transformer with Bi-Level Routing Attention 代码地址:https://github.com/rayleizhu/BiFormer vision transformer中Attention是极其重要的模块,但是它有着非常大的缺点:计算量太大。 BiFormer提…

AI数字人直播:引领直播行业新风潮,塑造新一轮“风口”

直播行业自从出现以来,就一直在不断地迭代和创新。而如今,随着AI技术的迅猛发展,AI数字人直播成为了一个崭新的赛道,引领着直播行业的新风潮,并有望塑造出新一轮的“风口”。 AI数字人直播,顾名思义&#…

LENOVO联想笔记本小新Pro 14 IRH8 2023款(83AL)电脑原装出厂Win11系统恢复预装OEM系统

链接:https://pan.baidu.com/s/1M1iSFahokiIHF3CppNpL4w?pwdzr8y 提取码:zr8y 联想原厂系统自带所有驱动、出厂主题壁纸、Office办公软件、联想电脑管家等自带的预装软件程序 所需要工具:16G或以上的U盘 文件格式:ISO 文件…

python3遇到Can‘t connect to HTTPS URL because the SSL module is not available.

远程服务器centos7系统上有minicoda3,觉得太占空间,就把整个文件夹删了,原先的Python3也没了,都要重装。 我自己的步骤:进入管理员模式 1.下载Python3的源码: wget https://www.python.org/ftp/python/3.1…

平面灯阵中寻找最大正方形边界 - 华为机试真题题解

分值: 300分 题解: Java / Python / C++ 题目描述 现在有一个二维数组来模拟一个平面灯阵,平面灯阵中每个位置灯处于点亮或熄灭,分别对应数组每个元素取值只能为1或0,现在需要找一个正方形边界,其每条边上的灯都是点亮(对应数组中元素的值为1)的,且该正方形面积最大。 …

Linux第一个小程序-进度条(c语言版)

目录 行缓冲区概念: 行缓冲区代码演示: ​编辑进度条代码 1:memset函数: 2:const char* lable"|/-\\"; 3:usleep C语言 usleep 函数的功能和用法: 4:进度条代码的实…

设置视图的对齐方式

对齐方式 在XML文件中通过属性android:layout_gravity可以指定当前视图的对齐方向,当属性值为top时表示视图朝上对齐,为bottom时表示视图朝下对齐,为left时表示视图靠左对齐,为right时表示视图靠右对齐。如果希望视图既朝上又靠左…

全网最详细的TVBOX带会员版二开图文教程:一、tvbox如意前端后台搭建教程;二、tvbox后台配置教程;三、tvbox源码Android Studio配置修改教程;四、tvbox源码as打包教程

一、TVBOX管理后台源码网站搭建; 搭建测试环境:PHP7.0、Nginx、按照好宝塔、配置解析好域名 1、请将下载好的tvbox源码压缩包进行解压,解压后得到的问题件如图所示 2、请将压缩包内的如图所指文件(1)上传到你的网站…