当前位置: 首页 > news >正文

6_游戏框架搭建

游戏框架搭建

目标 —— 使用 面相对象 设计 飞机大战游戏类

目标

  • 明确主程序职责
  • 实现主程序类
  • 准备游戏精灵组

01. 明确主程序职责

  • 回顾 快速入门案例,一个游戏主程序的 职责 可以分为两个部分:
    • 游戏初始化
    • 游戏循环
  • 根据明确的职责,设计 PlaneGame 类如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XjdDRQn0-1629756640490)(media/15025159832322/009_%E6%B8%B8%E6%88%8F%E4%B8%BB%E7%A8%8B%E5%BA%8F.png)]

提示 根据 职责 封装私有方法,可以避免某一个方法的代码写得太过冗长

如果某一个方法编写的太长,既不好阅读,也不好维护!

  • 游戏初始化 —— __init__() 会调用以下方法:
方法职责
__create_sprites(self)创建所有精灵和精灵组
  • 游戏循环 —— start_game() 会调用以下方法:
方法职责
__event_handler(self)事件监听
__check_collide(self)碰撞检测 —— 子弹销毁敌机、敌机撞毁英雄
__update_sprites(self)精灵组更新和绘制
__game_over()游戏结束

02. 实现飞机大战主游戏类

2.1 明确文件职责

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZJVxQPuk-1629756640492)(media/15025159832322/011_%E7%A8%8B%E5%BA%8F%E6%96%87%E4%BB%B6%E8%81%8C%E8%B4%A3.png)]

  • plane_main
    1. 封装 主游戏类
    2. 创建 游戏对象
    3. 启动游戏
  • plane_sprites
    • 封装游戏中 所有 需要使用的 精灵子类
    • 提供游戏的 相关工具

代码实现

  • 新建 plane_main.py 文件,并且设置为可执行
  • 编写 基础代码
import pygame
from plane_sprites import *class PlaneGame(object):"""飞机大战主游戏"""def __init__(self):print("游戏初始化")def start_game(self):print("开始游戏...")if __name__ == '__main__':# 创建游戏对象game = PlaneGame()# 开始游戏game.start_game()

2.3 游戏初始化部分

  • 完成 __init__() 代码如下:
def __init__(self):print("游戏初始化")# 1. 创建游戏的窗口self.screen = pygame.display.set_mode((480, 700))# 2. 创建游戏的时钟self.clock = pygame.time.Clock()# 3. 调用私有方法,精灵和精灵组的创建self.__create_sprites()def __create_sprites(self):pass

使用 常量 代替固定的数值

  • 常量 —— 不变化的量
  • 变量 —— 可以变化的量

应用场景

  • 在开发时,可能会需要使用 固定的数值,例如 屏幕的高度700
  • 这个时候,建议 不要 直接使用固定数值,而应该使用 常量
  • 在开发时,为了保证代码的可维护性,尽量不要使用 魔法数字

常量的定义

  • 定义 常量 和 定义 变量 的语法完全一样,都是使用 赋值语句
  • 常量命名 应该 所有字母都使用大写单词与单词之间使用下划线连接

常量的好处

  • 阅读代码时,通过 常量名 见名之意,不需要猜测数字的含义
  • 如果需要 调整值,只需要 修改常量定义 就可以实现 统一修改

提示:Python 中并没有真正意义的常量,只是通过命名的约定 —— 所有字母都是大写的就是常量,开发时不要轻易的修改!

代码调整

  • plane_sprites.py 中增加常量定义
import pygame# 游戏屏幕大小
SCREEN_RECT = pygame.Rect(0, 0, 480, 700)
  • 修改 plane_main.py 中的窗口大小
self.screen = pygame.display.set_mode(SCREEN_RECT.size)

2.4 游戏循环部分

  • 完成 start_game() 基础代码如下:
def start_game(self):"""开始游戏"""print("开始游戏...")while True:# 1. 设置刷新帧率self.clock.tick(60)# 2. 事件监听self.__event_handler()# 3. 碰撞检测self.__check_collide()# 4. 更新精灵组self.__update_sprites()# 5. 更新屏幕显示pygame.display.update()def __event_handler(self):"""事件监听"""for event in pygame.event.get():if event.type == pygame.QUIT:PlaneGame.__game_over()def __check_collide(self):"""碰撞检测"""passdef __update_sprites(self):"""更新精灵组"""pass@staticmethod
def __game_over():"""游戏结束"""print("游戏结束")pygame.quit()exit()

03. 准备游戏精灵组

3.1 确定精灵组

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MCWHj6wp-1629756640493)(media/15025159832322/010_%E7%B2%BE%E7%81%B5%E7%BB%84%E7%A1%AE%E5%AE%9A.png)]

3.2 代码实现

  • 创建精灵组方法
def __create_sprites(self):"""创建精灵组"""# 背景组self.back_group = pygame.sprite.Group()# 敌机组self.enemy_group = pygame.sprite.Group()# 英雄组self.hero_group = pygame.sprite.Group()
  • 更新精灵组方法
def __update_sprites(self):"""更新精灵组"""for group in [self.back_group, self.enemy_group, self.hero_group]:group.update()group.draw(self.screen)

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

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

vue如何实现数据双向绑定,我的阿里手淘面试经历分享,看这篇文章准没错!

前言 全网唯一一份,对标阿里P7年薪60w的Android高级工程师学习进阶路线(图未完全展开,怕大家看不清楚): 本篇文章都会围绕这份脑图来写,详细的介绍你处于哪个阶段该如何进阶,以及年薪层次高低对…...

LeetCode练习——其他(有效的括号)

给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 解法一&#…...

链表求和。

分析: 定义三个链表,两个链表负责两组数据的存储,第三个链表负责存储结果,前两个链表每个对应位置上的数据相加,注意进位处理,以及如果两个链表不等长的情况。 代码实现: class Solution3 {pu…...

Apollo学习笔记8-imu-lidarApollo3.0手动标定

imu-lidarApollo3.0手动标定参考文档参考文档 1:https://github.com/ApolloAuto/apollo/blob/r3.0.0/docs/specs/apollo_lidar_imu_calibration_guide.md. 2:https://github.com/ApolloAuto/apollo/blob/r3.0.0/docs/specs/D-kit/Auto_Driving–Sensor_calibration_cn.md. 3:h…...

什么是服务网格(Service Mesh)

本文来说下什么是服务网格 文章目录概述概述...

《零基础安装 Oracle 数据库》RAC集群系列 ❸ 简单两步快速安装 Oracle 18C RAC 数据库

前言 很多朋友吐槽我的脚本不会用,看不懂,哎,一言难尽!于是,我将 [vagrant virtualbox shell脚本] 组合起来,实现了零基础也可安装 Oracle 数据库的方式,我称之为 新手纯享版本,真…...

01_map容器_构造和赋值

map容器 自身按照key值默认排序 map中所有元素都是成对出现,插入数据时候要使用对组 接口: 判断是否为空——empty() 返回元素个数——size() 交换两个集合容器——swap() 插入——insert() (位置迭代器) 记住一种就可以了 //第一种 m.insert(…...

Hadoop Yarn

The fundamental idea of YARN is to split up the functionalities of resource management and job scheduling/monitoring into separate daemons. The idea is to have a global ResourceManager (RM) and per-application ApplicationMaster (AM). An application is eit...

redis加锁、解锁

在Java中,关于锁我想大家都很熟悉。在并发编程中,我们通过锁,来避免由于竞争而造成的数据不一致问题。通常,我们以synchronized 、Lock来使用它。 但是Java中的锁,只能保证在同一个JVM进程内中执行。如果在分布式集群…...

atcoder arc 122 a~b题Many Formulae、Insurance

A题链接 题目大意:不能存在两个及两个以上的减号,所有满足条件的式子之和。 题目思路:当时考试想到一半,就感觉编码能力不太会,然后就没做, 首先我们定义dp[N][2],这种选或不选的问题&#xff0…...

04_set容器_查找和统计

#include<iostream> #include<string> #include<set> using namespace std;//查找 void test01() {set<int>s1;s1.insert(10);s1.insert(30);s1.insert(20);s1.insert(40);set<int>:: iterator pos s1.find(30);if (pos ! s1.end()){cout <&…...

【pandas】根据其他表格列数据更新相应的列字段,apply()操作实例

今天在学习中&#xff0c;遇到一个小问题&#xff0c;需要把主表中的出行网格id&#xff0c;和终点网格id替换成对应的枢纽地点&#xff0c;从表中有每个枢纽对应的id&#xff08;一个枢纽对应多个网格id&#xff09; 1.原始数据如下图 上面是枢纽id,下方是出行信息 2.将数…...

数据库课程设计 大学生综合管理系统

问题描述&#xff1a; 设计并开发一套完整的在校大学生学习的综合管理系统&#xff0c;其中可包括以下几个模块&#xff1a; &#xff08;一&#xff09;选课管理&#xff1a;该系统包括教师、学生、系、课程和教室等信息&#xff0c;基本情况如下&#xff1a; 教师有工作证号…...

第十二周.直播.DGL-KG, LifeSci讲解

文章目录知识图谱背景DGL-KELifeSci双线性系列RESCAL摘要2. Modelling and Notation模型DistMult摘要模型ConvE为什么是2D不是1D卷积模型本文内容整理自深度之眼《GNN核心能力培养计划》公式输入请参考&#xff1a; 在线Latex公式DGL有三个比较知名的开源库&#xff0c;DGL-KG,…...

No qualifying bean of type ‘com.kkb.dao.*Mapper‘ available

没有查找到 *mapper对象程序报错没有查找到 mapper对象 可能造成的原因&#xff1a;缺少相应的注解 在SpringBoot的启动类中缺少 MapperScan SpringBootApplication MapperScan("com.yhp.dao") public class Application {public static void main(String[] args) …...

WPF 简单使用keybd_event模拟触发键盘

主要是添加Win32函数 其次是定义键盘按下&#xff0c;抬起的两个固定值。 [DllImport("User32.dll")]public static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);/// <summary>/// 按下/// </summary>const int KEY…...

java程序员日常工作内容,Java面试题及解析

目录 Kafka的基本介绍Kafka的设计原理分析Kafka数据传输的事务特点Kafka消息存储格式副本&#xff08;replication&#xff09;策略Kafka消息分组&#xff0c;消息消费原理Kafak顺序写入与数据读取消费者&#xff08;读取数据&#xff09; Kafka的基本介绍 Kafka是最初由Lin…...

常用网络数据包丢失的分析与处理

网络管理维护过程中&#xff0c;经常会遇到数据包丢失的情况。用Ping命令进行连接测试&#xff0c;会发现Ping包的延迟远远超过正常值&#xff0c;甚至无法到达&#xff0c;同时伴随着网络服务应用的障碍&#xff0c;比如打开网站的速度太慢&#xff0c;严重时甚至无法打开网页…...

2021-06-23 SpringCloud Zuul网关filter添加或修改传递的参数

场景&#xff1a;通过网关转发服务到具体的ip地址 比如网关验证accessToken&#xff0c;需要拦截访问&#xff0c;然后在url中添加参数&#xff0c;如下 //1、这个是原来的参数数据 String accessToken request.getParameter("accessToken"); //2、转换后的数据 S…...

面试笔试题

1.src和href的区别 &#xff1f; 答:src用于替代当前的元素&#xff0c;而href用于建立这个标签与外部资源之间的关系。 href 是Hypertext Reference的简写&#xff0c;表示超文本引用&#xff0c;指向网络资源所在位置。 常用场景: <a href"http://www.baidu.com&…...

DDD领域驱动设计学习笔记

...

gRPC-go源码剖析五十五之客户端一侧,是如何处理取消功能的?

本篇文章我们深入源码,重点分析一下grpc客户端一侧是如何来处理取消功能的; 1、取消功能是如何触发的?我们以客户端测试用例说明; 进入examples/features/cancellation/client/main.go文件中 1.func main() {2. //---省略掉不相关代码3. c := pb.NewEchoClient(conn...

黑马-数据结构

一、数据结构与算法概述 1.1. 什么是数据结构 1.1.1. 数据结构的内容 一般而言&#xff0c;数据结构的选择首先会从抽象数据类型的选择开始。一个设计良好的数据结构&#xff0c;应该在尽可能使用较少的时间与空间资源的前提下&#xff0c;为各种临界状态下的运行提供支持。数…...

PCB设计中电流与线宽的关系

原文链接&#xff08;点击原文链接更多精彩学习文章和学习内容&#xff09;&#xff1a;http://blog.bools.cn/archives/1262 PCB设计中电流与线宽的关系一、PCB设计铜铂厚度、线宽和电流关系二、PCB电流与线宽三、从图像中确定线宽四、 经验公式五、在PCB设计中线宽选择的经验…...

Redis 内存淘汰机制

Redis 内存淘汰机制 【问题一】 过期字典的方法很好&#xff0c;但还是有可能会出问题。因为定期删除和惰性删除还是有可能造成大量过期的 key 没被删除&#xff0c;堆积在内存中。非常容易就 内存溢出了 Out of memory。 【问题二】 如何保证 Redis 中的数据都是热点数据 &am…...

过一点求圆的两个切线方程标准式

最近在做一个避障算法&#xff0c;其中一个步骤是过一点求圆的两个切线方程&#xff0c;当时居然卡了挺长时间&#xff0c;特来记录一下&#xff0c;顺便复习一遍高中解析几何知识。 假设起始点坐标&#xff0c;圆心坐标&#xff0c;直线方程 把起始点坐标带入 移项 于是直线方…...

Jmeter运行badboy脚本

使用badboy进行录制 这里我使用禅道提bug 导出为Jmeter文件即可 Jmeter运行脚本 使用Jmeter打开jmx文件&#xff0c;添加结果树 点击回放&#xff0c;测试脚本是否正常运行 根据结果树&#xff0c;对脚本进行调试 调试脚本需要自己摸索...

MYSQL数据库

关系型数据库 数据结构模型 数据库模型根据数据模型来划分&#xff0c;而数据库管理系统(Database Management System)有自己的数据结构&#xff0c;目前比较成熟的在数据库系统中的数据模型有&#xff1a;层次模型、网状模型和关系模型。它们之间的根本区别在于数据之间联系…...

【ACWing】1273. 天才的记忆

题目地址&#xff1a; https://www.acwing.com/problem/content/1275/ 从前有个人名叫WNB&#xff0c;他有着天才般的记忆力&#xff0c;他珍藏了许多许多的宝藏。在他离世之后留给后人一个难题&#xff08;专门考验记忆力的啊&#xff01;&#xff09;&#xff0c;如果谁能轻…...

js音乐播放器

场景 &#xff1a;如果只是前端用的话&#xff0c;估计不需要多讲&#xff0c;我的运用场景是“后台推送语音提示” 我的使用方式 :当接受的WebSocket的时候播放他 <audio src"https://www.cbdaojia.com//yuyin/语音1 .mp3" id"music2"></au…...

C++运算符重载【加号、左移、递增、指针、赋值、中括号、关系、函数调用】,统统载了

学习目标 在c对象的学习中&#xff0c;我们会使用到运算符重载&#xff0c;接下来大家一起学习一下吧&#xff01; 学习内容 运算符重载&#xff1a; operator overloading运算符重载是一种形式的C多态 即对已有运算符进行重新定义&#xff0c;赋予新的功能&#xff0c;使其…...

上海亚商投顾:沪指创反弹新高 房地产板块掀涨停潮

上海亚商投顾前言&#xff1a;无惧大盘大跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 市场情绪三大股指今日窄幅震荡&#xff0c;最终尾盘小幅收红。房地产板块午后跳水&#xff0c;首开股份跌停&#xff0c;粤宏…...

Android中的短信收不到问题,手机收不到短信怎么回事?怎么恢复

智能手机用户越来越多&#xff0c;但是智能手机用户也会遇到手机接收不到短信的现象出现,或者是短信会出现延迟接收。手机收不到短信怎么回事?遇到这样的情况&#xff0c;大家也不必着急&#xff0c;下面就来详细介绍下&#xff1a;手机收不到短信怎么回事问题1&#xff1a;无…...

Python发送消息到手机(基于IFTTT)

有时候我们会在后台或服务器执行一些自动化任务&#xff0c;何时执行完成我们需要知道&#xff0c;所以&#xff0c;我们可以在任务执行完成时向手机发送一条消息&#xff0c;手机我们无时无刻都带在身上&#xff0c;所以任务只要执行完我们就可以立马知道&#xff0c;IFTTT和p…...

Python使用腾讯云-短信服务发送手机短信

目前【腾讯云短信】为客户提供【国内短信】、【国内语音】和【海外短信】三大服务&#xff0c;腾讯云短信SDK支持以下操作&#xff1a; 国内短信 国内短信支持操作&#xff1a; • 指定模板单发短信 • 指定模板群发短信• 拉取短信回执和短信回复状态海外短信 海外短信支持…...

ubuntu21.04 Thunderbird上配置163邮箱

一 . 163邮箱端操作 首先在浏览器上登录你的163邮箱,点击设置,选择"POP3/SMTP/IMAP". 确认服务开启 新增登录设备,并保存授权码(这个授权码是后面在客户端上登录163邮箱要用的密码) 二. thunderbird端操作 设置服务器 设置发送服务器 到这一部就算设置成功了....

更新163邮箱自动登陆已经自动发送邮箱

#网易邮箱自动登陆以及发送 from time import sleep from selenium import webdriver driver webdriver.Chrome() driver.get(“https://www.baidu.com/s?tn80035161_2_dg&wd163邮箱”) driver.maximize_window()#窗口最大化 #获取当前的handle名字 handle driver.curren…...

163邮箱 java发送html邮件,java邮件发送 qq与163邮箱互发和qq和163邮箱发送其余邮箱实例...

研究了近一天的时间&#xff0c;经过查阅相关资料&#xff0c;终于对java发送邮件的机制&#xff0c;原理有了一点点的理解&#xff0c;但愿可以帮到你们&#xff01;html1.首先要向你的项目里导入1个jar包&#xff1a;mail-1.4.4.jar便可(实现qq和163邮箱发送其余邮箱(此案例只…...

高防CDN是什么?有什么作用?

高防服务器和高防CDN&#xff0c;对于服务器维护人员来已经是非常熟悉了。但对于刚入行的新手&#xff0c;可能对它们不是那么了解。不知道高防CDN有哪些用途&#xff0c;不知道它是如何防御攻击的。下面给大家详细的介绍下高防CDN. 高防cdn是什么&#xff1f;cdn的含义是内容…...

CDN 是什么 、CDN 引入

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 CDN 的全称是 Content Delivery Network&#xff0c;即内容分发网络。 CDN的基本原理是广泛采用各种缓存服务器&#xff0c;将这些缓存…...

阿里云CDN是什么?阿里云CDN配置与购买优惠教程

阿里云CDN是什么&#xff1a; 阿里云 CDN&#xff08;内容分发网络&#xff09;全称是 Alibaba Cloud Content Delivery Network&#xff0c;建立并覆盖在承载网之上、由分布在不同区域的边缘节点服务器群组成的分布式网络&#xff0c;替代传统以WEB Server为中心的数据传输模…...

什么是CDN,有何作用?

cdn顾名思义是一个英文缩写&#xff0c;全称是contentdeliverynetwork&#xff08;内容分发网络&#xff09;&#xff0c;即服务商通过在世界各地部署大量服务器节点&#xff0c;缓存源站静态资源&#xff08;目标服务器&#xff09;&#xff0c;当用户访问时返回最优线路的资源…...

第2部分 路由器基本配置

目录 2.1 路由器及IOS 简介 2.1.1 路由器简介 2.1.2 IOS 简介 2.1.3 CDP 协议介绍 2.2 路由器基本配置命令汇总 2.1 路由器及IOS 简介 2.1.1 路由器简介 路由器能起到隔离广播域的作用&#xff0c;还能在不同网络间转发数据包。路由器实际上是一台特殊用途的计算机&#…...

【各种**问题系列】CDN是什么?什么是CDN服务器?

一、CDN概述 CDN的全称是Content Delivery Network&#xff0c;即内容分发网络。 CDN是在现有Internet基础上增加一层新的网络架构&#xff0c;通过部署边缘服务器&#xff0c;采用负载均衡、内容分发、调度等功能&#xff0c;使用户可以就近访问获取所需内容&#xff0c;从而解…...

快快网络融合CDN是什么

很多人不懂融合CDN和普通CDN有什么区别&#xff0c;融合cdn其实就是把大厂的cdn整合到了一起&#xff0c;从节点的质量上来说没有太大的区别。大厂他的品牌更可靠一些&#xff0c;融合的话好处在于如果某个大厂出问题了&#xff0c;可以随时切换&#xff0c;不会对公司的业务产…...

到底什么是CDN?

如今这个移动互联网时代&#xff0c;越来越多的人使用手机观看视频&#xff0c;丰富自己的娱乐生活。 可是&#xff0c;大家在追剧的时候&#xff0c;有没有想过一个问题——为什么有时候明明自己手机的网速很快&#xff0c;但观看视频时&#xff0c;仍然卡顿&#xff1f; 回…...

简要说明什么是cdn?

什么是CDN&#xff1f; CDN加速意思就是在用户和我们的服务器之间加一个缓存机制&#xff0c;通过这个缓存机制动态获取IP地址根据地理位置&#xff0c;让用户到最近的服务器访问。 那么CDN是个啥&#xff1f; 全称Content Delivery Network即内容分发网络。 CDN是一组分布在…...

CDN是什么?与DNS有什么关系?及其原理

1.什么是cdn cdn全称是内容分发网络。其目的是让用户能够更快速的得到请求的数据。简单来讲&#xff0c;cdn就是用来加速的&#xff0c;他能让用户就近访问数据&#xff0c;这样就更更快的获取到需要的数据。举个例子&#xff0c;现在服务器在北京&#xff0c;深圳的用户想要获…...

视频网站套上CDN是什么效果?

1、什么是CDN加速&#xff1f; 内容分发网络&#xff08;Content Delivery Network&#xff09;&#xff0c;是在现有 Internet 中增加的一层新的网络架构&#xff0c;由遍布全国的高性能加速节点构成。这些高性能的服务节点都会按照一定的缓存策略存储您的业务内容&#xff0c…...

CDN是什么?如何用Cloudflare CDN加速网站

CDN就是缓存网页文件到全球服务器&#xff0c;这样用户就可以就近选择访问他们所需要的网页数据。它可以最大程度的加速用户访问&#xff0c;比如我们常常把外贸网站放在美国&#xff0c;这样国内访问就比较慢&#xff0c;但是如果使用cdn&#xff0c;用户访问就会变快。 无论…...