《Python编程从入门到实践》day25

news2024/12/25 22:34:55

# 昨日知识点回顾

如何创建多行外星人

碰撞结束游戏

创建game_stats.py跟踪统计信息

# 今日知识点学习

第14章 记分

14.1 添加Play按钮

        14.1.1 创建Button类

import pygame.font

# button.py
class Button:
    
    def __init__(self, ai_game, msg):
        """初始化按钮的属性"""
        self.screen = ai_game.screen
        self.screen_rect = self.screen.get_rect()
        
        # 设置按钮的尺寸和其他属性
        self.width, self.height = 200, 50
        self.button_color = (0, 255, 0)
        self.text_color = (255, 255, 255)
        self.font = pygame.font.SysFont(None, 48)
        
        # 创建按钮的rect对象,并使其居中
        self.rect = pygame.Rect(0, 0, self.width, self.height)
        self.rect.center = self.screen_rect.center
        
        # 按钮的标签只需创建一次
        self._prep_msg(msg)
        
    def _prep_msg(self, msg):
        """将msg渲染为图像,并使其在按钮上居中"""
        # 方法font.render()接受一个布尔实参,该实参制定开启还是关闭反锯齿功能(反锯齿让文本的边缘更平滑)
        # 后面两个实参分别是文本颜色和背景色(如果没有指定背景色,pygame渲染文本时将使用透明背景)
        self.msg_image = self.font.render(msg, True, self.text_color, self.button_color)
        self.msg_image_rect = self.msg_image.get_rect()
        self.msg_image_rect.center = self.rect.center
        
    def draw_button(self):
        # 绘制一个用颜色填充的按钮,再绘制文本
        self.screen.fill(self.button_color, self.rect)
        # screen.blit传递一幅图像以及与该图像相关联的rect
        self.screen.blit(self.msg_image, self.msg_image_rect)

        14.1.2 在屏幕上绘制按钮        

# 主程序
import sys
from time import sleep

import pygame

from Settings import Settings
from game_stats import GameStats
from button import Button
from Ship import Ship
from alien import Alien
from bullet import Bullet


class AlienInvasion:
    """管理游戏资源和行为的类"""
    def __init__(self):
        """初始化游戏并创建游戏资源"""
        pygame.init()

        self.settings = Settings()
        # 非全屏运行
        self.screen = pygame.display.set_mode((self.settings.screen_width, self.settings.screen_height))

        # 全屏运行
        # self.screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN)
        # self.settings.screen_width = self.screen.get_rect().width
        # self.settings.screen_height = self.screen.get_rect().height
        # 设置当前窗口标题
        pygame.display.set_caption("Alien Invasion")

        # 创建一个用于存储游戏统计信息的实例
        self.stats = GameStats(self)
        self.ship = Ship(self)
        # 创建子弹精灵组
        self.bullets = pygame.sprite.Group()
        # 创建外星人精灵组
        self.aliens = pygame.sprite.Group()

        self._create_fleet()

        # 创建Play按钮
        self.play_button = Button(self, "Play")

-----snip-----
    def _update_screen(self):
        """更新屏幕上的图像,并切换到新屏幕。"""
        self.screen.fill(self.settings.bg_color)
        self.ship.blitme()
        for bullet in self.bullets.sprites():
            bullet.draw_bullet()
        self.aliens.draw(self.screen)

        # 如果游戏处于非活动状态,就绘制Play按钮
        if not self.stats.game_active:
            self.play_button.draw_button()

        # 让最近绘制的屏幕可见
        pygame.display.flip()
-----snip-----

        运行结果:(Play按钮出现)

         14.1.3 开始游戏

# 主程序
----snip----
    def _check_events(self):
        """响应按键和鼠标事件"""
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
            elif event.type == pygame.KEYDOWN:
                self._check_keydown_events(event)

            elif event.type == pygame.KEYUP:
                self._check_keyup_events(event)

            elif event.type == pygame.MOUSEBUTTONDOWN:
                # 玩家鼠标点击Play按钮做出响应
                # pygame.mouse.get_pos()返回玩家单击时鼠标(x,y)元组
                mouse_pos = pygame.mouse.get_pos()
                self._check_play_button(mouse_pos)

    def _check_play_button(self, mouse_pos):
        """在玩家单击Play按钮时开始新游戏"""
        if self.play_button.rect.collidepoint(mouse_pos):
            self.stats.game_active = True
----snip----

        14.1.4 重置游戏

# 主程序

    def _check_play_button(self, mouse_pos):
        """在玩家单击Play按钮时开始新游戏"""
        if self.play_button.rect.collidepoint(mouse_pos):
            # 重置游戏统计信息
            self.stats.reset_stats()
            self.stats.game_active = True

            # 清空余下的外星人和子弹
            self.aliens.empty()
            self.bullets.empty()

            # 创建一群新的外星人并让飞船居中
            self._create_fleet()
            self.ship.center_ship()

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

# 主程序
    def _check_play_button(self, mouse_pos):
        """在玩家单击Play按钮时开始新游戏"""
        # game_active为False时游戏才开始并显示Play按钮
        button_clicked = self.play_button.rect.collidepoint(mouse_pos)
        if button_clicked and not self.stats.game_active:
            # 重置游戏统计信息
            self.stats.reset_stats()
            self.stats.game_active = True

            # 清空余下的外星人和子弹
            self.aliens.empty()
            self.bullets.empty()

            # 创建一群新的外星人并让飞船居中
            self._create_fleet()
            self.ship.center_ship()

        14.1.6 隐藏鼠标光标

# 主程序
    def _check_play_button(self, mouse_pos):
        """在玩家单击Play按钮时开始新游戏"""
        # game_active为False时游戏才开始并显示Play按钮
        button_clicked = self.play_button.rect.collidepoint(mouse_pos)
        if button_clicked and not self.stats.game_active:
            # 重置游戏统计信息
            self.stats.reset_stats()
            self.stats.game_active = True

            # 清空余下的外星人和子弹
            self.aliens.empty()
            self.bullets.empty()

            # 创建一群新的外星人并让飞船居中
            self._create_fleet()
            self.ship.center_ship()

            # 隐藏鼠标光标
            pygame.mouse.set_visible(False)

    def _ship_hit(self):
        """响应飞船被外星人撞到"""
        if self.stats.ships_left > 0:
            # 将Ship_left减1
            self.stats.ships_left -= 1

            # 清空余下的外星人和子弹
            self.aliens.empty()
            self.bullets.empty()

            # 创建一批新的外星人,并将飞船放到屏幕底部的中央
            self._create_fleet()
            self.ship.center_ship()

            # 暂停
            sleep(0.5)
        else:
            self.stats.game_active = False
            # 游戏结束,重新显示光标
            pygame.mouse.set_visible(True)

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

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

相关文章

按键配合LDO实现开关功能

今天给大家分享一个学到的按键开关电路,适合没有足够空间给自锁开关的场景,既可以用于USB供电控制也可以用于电池供电控制。话不多说上电路图先。 核心任务就是通过按键控制LDO芯片的使能管脚的电平状态,这枚NCP芯片高电平使能,VB…

基于Nios软件实现流水灯+串口输出

基于NIOS-II软核实现流水灯串口输出 引言: ​ 在现代电子设计领域,FPGA(现场可编程门阵列)因其灵活性和并行处理能力而成为实现复杂数字系统的首选平台。Nios II,作为Altera(现为Intel旗下)提供…

2016-2021年全国范围的2.5m分辨率的建筑屋顶数据

一、论文介绍 摘要:大规模且多年的建筑屋顶面积(BRA)地图对于解决政策决策和可持续发展至关重要。此外,作为人类活动的细粒度指标,BRA可以为城市规划和能源模型提供帮助,为人类福祉带来好处。然而&#xf…

WordPress原创插件:超链接点击访问统计

WordPress原创插件:超链接点击访问统计 https://download.csdn.net/download/huayula/89296775

ICode国际青少年编程竞赛- Python-4级训练场-while语句综合

ICode国际青少年编程竞赛- Python-4级训练场-while语句综合 1、 for i in range(4):while not Flyer[i].disappear():wait()Spaceship.step(6)Spaceship.turnLeft()2、 Dev.turnLeft() for i in range(4):Spaceship.step(2)while Flyer[i].disappear():wait()Dev.step(4)Dev.…

Go实现树莓派读取at24c02 eeprom读写数据

步骤 启用i2c 参考 Go实现树莓派读取bh1750光照强度 代码 package mainimport ("fmt""periph.io/x/conn/v3/i2c" )type AT24C02Device struct {dev *i2c.Dev }func NewAT24C02Device(addr uint16, bus i2c.BusCloser) (*AT24C02Device, error) {var (d…

【HDFS】关于HDFS-17497:在commit block时更新quota

链接:https://github.com/apache/hadoop/pull/6765 Ticket标题:The number of bytes of the last committed block should be calculated into the file length。 HDFS里,一个在写入的文件可能包含多个commited状态的块。 但是计算文件大小的时候,最后一个commited block并…

Yii2 自动生成php代码

文档地址:入门(Getting Started): 用 Gii 生成代码(Generating Code with Gii) - Yii 2.0 权威指南 - 文档 - Yii Framework 中文网 找到配置文件,以我的项目为例: 因为的是开启了路由美化所以访…

大数据面试题第一期*4

题1、HDFS存储机制 (1)客户端向namenode请求上传文件 ,namenode检查目标文件是否已存在 ,父目录是否存在。 (2)namenode返回是否可以上传。 (3)客户端请求第一个 block上传到哪几个d…

JavaFX布局-HBox

JavaFX布局-HBox 常用属性alignmentspacingchildrenmarginpaddinghgrow 实现方式Java实现Xml实现 综合案例 HBox按照水平方向排列其子节点改变窗口大小,不会该部整体布局窗口太小会遮住内部元素,不会产生滚动条 常用属性 alignment 对齐方式 new HBox().setAlign…

Vue3人员选择组件封装

一、组件介绍 人员组件在各系统的应用都是比较广泛的&#xff0c;因此可以将其封装为可配置的人员组件&#xff0c;根据不同角色权限显示对应的人员供选择&#xff0c;代码目前只是一部分&#xff0c;需要源码的私聊。 二、直接上代码 use.vue 父组件 <div class&q…

OpenGL导入的纹理图片错位

在OpenGL中导入图片的纹理照片的函数为 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, p_w, p_h, 0, GL_BGR, GL_UNSIGNED_BYTE, pic_data);其中p_w, p_h为图片的宽和高&#xff0c;pic_data为指向图片存储空间的的地址(unsigned char *类型) 在OpenGL中图片默认是4字节对齐的&…

QCC3071/QCC3081/QCC3083/QCC3084/QCC5171/QCC5181/QCC3091/QCC3095平台LDAC解码

QCC3071/QCC3081/QCC3083/QCC3084/QCC5171/QCC5181/QCC3091/QCC3095平台LDAC解码 LDAC Decoder Evaluation Kit for QCC5181 and QCC5171 (The 5181 Kit) 随着Qualcomm DSP向下开放&#xff0c;QCC3071/QCC3081/QCC3083/QCC3084目前可以可以实现LDAC Decoder。 QCC3071/QCC3…

Scala编程入门:从零开始的完整教程

目录 引言环境准备创建第一个Scala项目基本语法高阶概念进阶资源结语 引言 Scala是一种强大的、静态类型的、多范式编程语言&#xff0c;它结合了面向对象和函数式编程的特点。本教程将指导您如何从零开始学习Scala&#xff0c;并搭建一个简单的开发环境。让我们开始探索Scala…

JavaEE初阶-多线程4

文章目录 一、单例模式1.1 饿汉模式1.2 懒汉模式 二、阻塞队列1.1 生产者消费者模型1.1.1 现实生活举例1.1.2 生产者消费模型的两个优势1.1.2.1 解耦合1.1.2.2 削峰填谷 1.2 阻塞队列代码1.2.1 使用java标准库的阻塞队列实现生产者消费者模型1.2.2 实现自己的阻塞队列 一、单例…

瑞芯微 rk3588 Linux系统备份还原 StepbyStep

1.系统备份 1.1 将瑞芯微平台嵌入式系统的root ssh 权限开通 step1:sudo vi /etc/ssh/sshd_config step2: 找到PermitRootLogin,把开关打开&#xff1a; PermitRootLogin yes step3:重启ssh服务 sudo systemctl restart sshd 1.2.使用瑞芯微的打包脚本把嵌入式系统系统打包 这…

类和对象中篇

类的六个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。空类中什么都没有吗&#xff1f;并不是的&#xff0c;任何一个类在我们不写的情况下&#xff0c;都会自动生成下面6个默认成员函数 ①初始化和清理&#xff1a;构造函数和析构函数 ②拷贝复制&#x…

[Markdown]是时候该学学使用markdown写文章了

&#x1f495;&#x1f495;&#x1f495;欢迎各位来到我的博客&#xff0c;今天我们的主题是markdown&#xff0c;你将在这里学习到最全的markdown知识&#x1f495;&#x1f495;&#x1f495; 你还在使用富文本编辑器写文档或文章吗&#xff1f; 你还在用word一点一点地进行…

QX----mini51单片机学习---(7)矩阵键盘

目录 1矩阵键盘的识别 2相关c语言 3实践编程 1矩阵键盘的识别 假设按列扫描按下S6P30&#xff1a;0P34&#xff1a;1然后高流向低&#xff0c;P34&#xff1a;0&#xff0c;刚开始是0xf0&#xff1a;1111 0000 后面是0xe0&#xff1a;1110 0000 &#xff0c;当是0xe0能确…

基于Qt的Model-View显示树形数据

目标 用qt的模型-视图框架实现树型层次节点的显示&#xff0c;从QAbstractItemModel派生自己的模型类MyTreeItemModel&#xff0c;用boost::property_tree::ptree操作树型数据结构&#xff0c;为了演示&#xff0c;此处只实现了个只读的模型 MyTreeItemModel的定义 #pragma o…