《Python编程从入门到实践》day22
# 昨日知识点回顾
方法重构、驾驶飞船左右移动、全屏显示
飞船不移动解决,问题出在移动变量x更新
# Ship.pysnipdef update(self):"""根据移动标志调整飞船的位置"""# 更新飞船而不是rect对象的x值# 如果飞船右移的标志和飞船外接矩形右边缘的x坐标 小于 屏幕右边缘x坐标,开始右移if self.moving_right and self.rect.right < self.screen_rect.right:self.x += self.settings.ship_speed# self.rect.x += self.settings.ship_speed# 如果飞船左移的标志和飞船外接矩形左边缘的x坐标 大于于 0,开始左移if self.moving_left and self.rect.left > 0:self.x -= self.settings.ship_speed# self.rect.x -= self.settings.ship_speed# 根据self.x 更新rect对象self.rect.x = self.x
# 今日知识点学习
12.8 射击
12.8.1 添加子弹设置
# Settings.py
class Settings():"""存储《外星人入侵》的所有设置的类"""def __init__(self):"""初始化游戏的设置"""# 屏幕设置self.screen_width = int(1200)self.screen_height = int(800)self.bg_color = (230, 230, 230)# 飞船设置self.ship_speed = 1.5# 子弹设置self.bullet_speed = 1.0self.bullet_width = 3self.bullet_height = 15self.bullet_color = (60, 60, 60)
12.8.2 创建Bullet类
#bullet.py
import pygame
from pygame.sprite import Spriteclass Bullet(Sprite):"""管理飞船所发射的子弹"""def __init__(self, ai_game):"""在飞船当前位置创建一个子弹对象"""super().__init__()self.screen = ai_game.screenself.settings = ai_game.settingsself.color = self.settings.bullet_color# 在(0,0)处创建一个表示子弹的矩形,再设置正确的位置self.rect = pygame.Rect(0, 0, self.settings.bullet_width, self.settings.bullet_height)self.rect.midtop = ai_game.ship.rect.midtop# 存储用小数表示的子单位置self.y = float(self.rect.y)def update(self):"""向上移动子弹"""# 更新表示子弹位置的小数值self.y -= self.settings.bullet_speed# 更新表示子弹的rect位置self.rect.y = self.ydef draw_bullet(self):"""在屏幕上绘制子弹"""pygame.draw.rect(self.screen, self.color, self.rect)
12.8.3 将子弹存储在编组中
#主程序
import sys
import pygame
from Settings import Settings
from Ship import Shipclass 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().heightpygame.display.set_caption("Alien Invasion")self.ship = Ship(self)# 创建用于存储子弹的编组self.bullets = pygame.sprite.Group()def run_game(self):"""开始游戏的主循环"""while True:self._check_events()self.ship.update()# 更新子弹的位置self.bullets.update()self._update_screen()
12.8.4 开火
import sys
import pygame
from Settings import Settings
from Ship import Ship
from bullet import Bulletclass 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().heightpygame.display.set_caption("Alien Invasion")self.ship = Ship(self)self.bullets = pygame.sprite.Group()def run_game(self):"""开始游戏的主循环"""while True:self._check_events()self.ship.update()self.bullets.update()self._update_screen()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)def _check_keydown_events(self, event):"""响应按键"""if event.key == pygame.K_RIGHT:self.ship.moving_right = Trueelif event.key == pygame.K_LEFT:self.ship.moving_left = Trueelif event.key == pygame.K_q:sys.exit()elif event.key == pygame.K_SPACE:self._fire_bullet()def _check_keyup_events(self, event):"""响应松开"""if event.key == pygame.K_RIGHT:self.ship.moving_right = Falseelif event.key == pygame.K_LEFT:self.ship.moving_left = Falsedef _fire_bullet(self):"""创建一颗子弹,并将其加入编组bullets中"""new_bullet = Bullet(self)self.bullets.add(new_bullet)def _update_screen(self):"""更新屏幕上的图像,并切换到新屏幕。"""self.screen.fill(self.settings.bg_color)self.ship.blitme()for bullet in self.bullets.sprites():bullet.draw_bullet()# 让最近绘制的屏幕可见pygame.display.flip()if __name__ == '__main__':# 创建游戏实例并运行游戏ai = AlienInvasion()ai.run_game()
12.8.5 删除消失的子弹
def run_game(self):"""开始游戏的主循环"""while True:self._check_events()self.ship.update()self.bullets.update()# 删除消失的子弹for bullet in self.bullets.copy():if bullet.rect.bottom <= 0:self.bullets.remove(bullet)print(len(self.bullets))self._update_screen()
12.8.6 限制子弹的数量
#Settings.py
# snip
# 子弹设置self.bullet_speed = 1.0self.bullet_width = 3self.bullet_height = 15self.bullet_color = (60, 60, 60)self.bullets_allowed = 3#主程序
# snipdef _fire_bullet(self):"""创建一颗子弹,并将其加入编组bullets中"""if len(self.bullets) < self.settings.bullets_allowed:new_bullet = Bullet(self)self.bullets.add(new_bullet)
12.8.7 创建方法_update_bullets()
def run_game(self):"""开始游戏的主循环"""while True:self._check_events()self.ship.update()self.bullets.update()self._update_bullets()# # 删除消失的子弹# for bullet in self.bullets.copy():# if bullet.rect.bottom <= 0:# self.bullets.remove(bullet)# print(len(self.bullets))self._update_screen()def _update_bullets(self):"""更新子弹的位置并消除消失的子弹"""# 更新子弹的位置self.bullets.update()# 删除消失的子弹for bullet in self.bullets.copy():if bullet.rect.bottom <= 0:self.bullets.remove(bullet)
运行结果:

相关文章:
《Python编程从入门到实践》day22
# 昨日知识点回顾 方法重构、驾驶飞船左右移动、全屏显示 飞船不移动解决,问题出在移动变量x更新 # Ship.pysnipdef update(self):"""根据移动标志调整飞船的位置"""# 更新飞船而不是rect对象的x值# 如果飞船右移的标志和飞船外接…...
介绍 ffmpeg.dll 文件以及ffmpeg.dll丢失怎么办的五种修复方法
ffmpeg.dll 是一个动态链接库文件,属于 FFmpeg运行库。它在计算机上扮演着非常重要的角色,因为它提供了许多应用程序和操作系统所需的功能和组件。当 ffmpeg.dll 文件丢失或损坏时,可能会导致程序无法正常运行,甚至系统崩溃。下面…...
AI换脸原理(6)——人脸分割介绍
一、介绍 人脸分割是计算机视觉和图像处理领域的一项重要任务,它主要涉及到将图像中的人脸区域从背景或其他非人脸区域中分离出来。这一技术具有广泛的应用场景,如人脸识别、图像编辑、虚拟背景替换等。 在计算机视觉(CV)领域,经典的分割技术可以主要划分为三类:语义分…...
【C++并发编程】(二)线程的创建、分离和连接
文章目录 (二)线程的创建、分离和链接创建线程:示例线程的分离(detach)和连接(join) (二)线程的创建、分离和链接 创建线程:示例 线程(Thread&a…...
利用生成式AI重新构想ITSM的未来
对注入 AI 的生成式 ITSM 的需求,在 2023 年 Gartner AI 炒作周期中,生成式 AI 达到预期值达到顶峰后,三分之二的企业已经将生成式 AI 集成到其流程中。 你问为什么这种追求?在预定义算法的驱动下,IT 服务交付和管理中…...
完美解决AttributeError: module ‘backend_interagg‘ has no attribute ‘FigureCanvas‘
遇到这种错误通常是因为matplotlib的后端配置问题。在某些环境中,尤其是在某些特定的IDE或Jupyter Notebook环境中,可能会因为后端配置不正确而导致错误。错误信息提示 module backend_interagg has no attribute FigureCanvas 意味着当前matplotlib的后…...
CMakeLists.txt语法规则:条件判断中表达式说明一
一. 简介 前面学习了 CMakeLists.txt语法中的 部分常用命令,常量变量,双引号的使用。 前面一篇文章也简单了解了 CMakeLists.txt语法中的条件判断,文章如下: CMakeLists.txt语法规则:条件判断说明一-CSDN博客 本文…...
《QT实用小工具·五十三》会跑走的按钮
1、概述 源码放在文章末尾 该项目实现了会逃跑的按钮: 两个按钮,一个为普通按钮,另一个为会跑走的按钮 鼠标移到上面时,立刻跑掉 针对鼠标、键盘、触屏进行优化 随机交换两个按钮的文字、偶尔钻到另一个按钮下面、鼠标移开自…...
Servlet的几种用法?
serlet 1.定义:Serlet是使用Java编写的运行在服务器端的程序 2.Servlet主要是用于处理浏览器端发送的Http请求,并返回一个响应 3.Servlet开发需要使用到的包: java.servlet java.servlet.http 一.Servlet注册 1.xml方式 <servlet>…...
Golang | Leetcode Golang题解之第69题x的平方根
题目: 题解: func mySqrt(x int) int {if x 0 {return 0}C, x0 : float64(x), float64(x)for {xi : 0.5 * (x0 C/x0)if math.Abs(x0 - xi) < 1e-7 {break}x0 xi}return int(x0) }...
AR人脸美妆SDK解决方案,让妆容更加贴合个人风格
美妆行业正迎来前所未有的变革,为满足企业对高效、精准、创新的美妆技术需求,美摄科技倾力打造了一款企业级AR人脸美妆SDK解决方案,为企业打开美妆领域的新世界大门。 革命性的人脸美妆技术 美摄科技的AR人脸美妆SDK解决方案,不…...
Python-100-Days: Day09 Object-oriented programming(OOP) Upgrade
1.property装饰器 之前有讨论过, Python中属性和方法访问权限的问题,不建议将属性设置为私有的,倘若直接将属性暴露给外界也是存在问题的。例如,我们没有办法检查赋给属性的值是否有效。之前的建议是将属性命名以单下划线开头&am…...
虹科Pico汽车示波器 | 免拆诊断案例 | 2010款凯迪拉克SRX车发动机无法起动
故障现象 一辆2010款凯迪拉克SRX车,搭载LF1发动机,累计行驶里程约为14.3万km。该车因正时链条断裂导致气门顶弯,大修发动机后试车,起动机运转有力,但发动机没有着机迹象;多起动几次,火花塞会变…...
ECC 号码总结
1、问题背景 在手机开发过程中,经常遇见各种紧急号码问题,在此特意总结下紧急号码相关知识。 2、紧急号码来源 在MTK RILD EccNumberSource.h中,定义了如下几种紧急号码来源。 按优先级排序介绍如下 2.1、SOURCE_NETWORK 网络下发ÿ…...
《大疆二次开发》EMQX和MQTT部署
EMQX 服务器 基础知识 概念 EMQX (Erlang/Enterprise/Elastic MQTT Broker) ;EMQ/EMQX就是MQTT Broker的一种实现;一款开源的大规模分布式 MQTT 消息服务器,功能丰富,专为物联网和实时通信应用而设计;支持多种协议&…...
【网络】滑动窗口和拥塞窗口
滑动窗口和拥塞窗口是TCP协议中两个重要的窗口概念,它们分别用于流量控制和拥塞控制,在功能和作用上有所不同。 滑动窗口(Sliding Window) 滑动窗口是用于流量控制的机制,它定义了发送方和接收方之间的数据传输量。T…...
数据库知识初步汇总
创建标签表格: CREATE TABLE IF NOT EXISTS labels (标签ID INTEGER PRIMARY KEY,标签名称 TEXT );创建文本与标签的关联表格: CREATE TABLE IF NOT EXISTS 文本标签 (文本ID INTEGER,标签ID INTEGER,FOREIGN KEY (文本ID) REFERENCES texts(编号),FOR…...
Moby简介:openEuler 中的开源docker引擎
Moby 是一个开源的容器化引擎,它提供了创建和管理容器所需的核心功能。在 openEuler 系统中,Moby 作为容器技术的实现之一,它允许用户利用容器化技术来部署、运行和移植应用程序。 Moby 的功能和作用: 1. **容器创建**ÿ…...
分布式光纤测温DTS的测温范围是多少?
分布式光纤测温DTS的测温范围不仅仅取决于光缆的感温能力,还受到多种复杂因素的影响。尽管高温光缆可以耐高温,低温光缆可以耐低温,甚至镀金光缆能够耐受高达700摄氏度的极高温度,然而,这些因素并不能完全解释测温范围…...
Java实现裁剪PDF
目录 安装Java PDF库 Java裁剪PDF页面 Java裁剪PDF页面并将结果保存为图片、HTML、Excel等格式 裁剪PDF页面是一项常见的任务,它可以用来调整文档的尺寸和去除不需要的边距或白边。通过裁剪页面,你可以优化文档的布局和展示效果,使其更符合…...
【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...
【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...
