关于制作Python游戏全过程(汇总1)
目录
前言:
1.plane_sprites模块:
1.1导入模块:
1.1.1pygame:一个用于创建游戏的Python库。
1.1.2random:Python标准库中的一个模块,用于生成随机数。
1.2定义事件代号:
1.2.1ENEMY_EVENT:自定义的敌机出场事件代号,使用pygame.USEREVENT作为基础值。
1.2.2FIRE:自定义的子弹发射事件代号,设置为敌机出场事件代号加1。
1.3基类:GameSprites:
1.3.1GameSprites:所有游戏精灵的基类。
1.3.2__init__:初始化方法,接收图像名称和速度作为参数,并加载图像。
1.3.3update:更新精灵的位置,使其沿y轴向下移动。
1.4背景类:Background:
1.4.1Background:继承自GameSprites的背景类。
1.4.2__init__:除了加载背景图像外,还可以选择是否从屏幕上方开始显示背景。
1.4.3update:除了基本的向下移动外,还负责在背景完全移出屏幕时将其重置到屏幕上方
1.5敌机类:Enemy:
1.5.1Enemy:继承自GameSprites的敌机类。
1.5.2__init__:初始化时设置随机速度和随机水平位置。
1.5.3update:当敌机飞出屏幕时,调用kill方法将其从精灵组中删除
1.6英雄飞机类:Hero:
1.6.1Hero:继承自GameSprites的英雄飞机类。
1.6.2__init__:初始化飞机的位置和子弹精灵组。
1.6.3update:更新飞机的位置,并确保它不会离开屏幕边界。
1.6.4fire:发射子弹的方法,创建子弹并将其添加到子弹精灵组中。
1.7子弹类:Bullet:
1.7.1Bullet:继承自GameSprites的子弹类。
1.7.2__init__:初始化子弹并设置其向上移动的速度。
1.7.3update:当子弹飞出屏幕时,调用kill方法将其从精灵组中删除。
1.7.4__del__:当子弹对象被销毁时调用的方法,打印一条消息。
结语:
前言:
经过了前面几个章节关于Python面向对象的学习,相信大家关于如何写一个面向对象的小游戏的基本内容也已经知道了,而这一篇我也会结合之前文章提到的内容正式开始写关于面向对象的小游戏了,这篇我会结合代码一点一点解释关于面向对象的游戏,当然在我的资源里我也上传了压缩包,感兴趣的小伙伴可以自己下载,或者结合我这几篇的教程和所学的内容也可以自己尝试在pycharm中写一个面向对象的飞机大战的小游戏.接下来就正式开始了:
1.plane_sprites模块:
1.1导入模块:
import pygame
import random
这是对代码的解释:
1.1.1pygame
:一个用于创建游戏的Python库。
1.1.2random
:Python标准库中的一个模块,用于生成随机数。
1.2定义事件代号:
ENEMY_EVENT = pygame.USEREVENT
FIRE = pygame.USEREVENT + 1
这是对代码的解释:
1.2.1ENEMY_EVENT
:自定义的敌机出场事件代号,使用pygame.USEREVENT
作为基础值。
1.2.2FIRE
:自定义的子弹发射事件代号,设置为敌机出场事件代号加1。
1.3基类:GameSprites:
class GameSprites(pygame.sprite.Sprite): def __init__(self, images_name, speed=5): super().__init__() self.image = pygame.image.load(images_name) self.rect = self.image.get_rect() self.speed = speed def update(self): self.rect.y += self.speed
这是对代码的解释:
1.3.1GameSprites
:所有游戏精灵的基类。
1.3.2__init__
:初始化方法,接收图像名称和速度作为参数,并加载图像。
1.3.3update
:更新精灵的位置,使其沿y轴向下移动。
1.4背景类:Background:
class Background(GameSprites): def __init__(self, is_alt=False): super().__init__('images/background.png') if is_alt: self.rect.y = -self.rect.height def update(self): super().update() if self.rect.y >= 700: self.rect.y = -self.rect.height
这是对代码的解释:
1.4.1Background
:继承自GameSprites
的背景类。
1.4.2__init__
:除了加载背景图像外,还可以选择是否从屏幕上方开始显示背景。
1.4.3update
:除了基本的向下移动外,还负责在背景完全移出屏幕时将其重置到屏幕上方
1.5敌机类:Enemy:
class Enemy(GameSprites): def __init__(self): super().__init__('images/enemy1.png') self.speed = random.randint(1, 8) self.rect.x = random.randint(0, 480 - self.rect.width) def update(self): super().update() if self.rect.y >= 700: print('飞出屏幕需要删除...') self.kill()
这是对代码的解释:
1.5.1Enemy
:继承自GameSprites
的敌机类。
1.5.2__init__
:初始化时设置随机速度和随机水平位置。
1.5.3update
:当敌机飞出屏幕时,调用kill
方法将其从精灵组中删除
1.6英雄飞机类:Hero:
class Hero(GameSprites): def __init__(self): super().__init__('images/me1.png', 1) self.rect.x = 240 - self.rect.width / 2 self.rect.y = 700 - self.rect.height - 30 self.upanddown = 0 self.bullet_group = pygame.sprite.Group() def update(self): self.rect.x += self.speed self.rect.y += self.upanddown # 控制飞机不能离开屏幕的代码... def fire(self): print('发射子弹') for i in range(4): bullet = Bullet() bullet.rect.centerx = self.rect.centerx bullet.rect.y = self.rect.y - (i + 1) * 20 self.bullet_group.add(bullet)
这是对代码的解释:
1.6.1Hero
:继承自GameSprites
的英雄飞机类。
1.6.2__init__
:初始化飞机的位置和子弹精灵组。
1.6.3update
:更新飞机的位置,并确保它不会离开屏幕边界。
1.6.4fire
:发射子弹的方法,创建子弹并将其添加到子弹精灵组中。
1.7子弹类:Bullet:
class Bullet(GameSprites): def __init__(self): super().__init__('images/bullet1.png', -2) def update(self): super().update() if self.rect.y < 0 - self.rect.height: self.kill() def __del__(self): print('子弹被销毁')
这是对代码的解释:
1.7.1Bullet
:继承自GameSprites
的子弹类。
1.7.2__init__
:初始化子弹并设置其向上移动的速度。
1.7.3update
:当子弹飞出屏幕时,调用kill
方法将其从精灵组中删除。
1.7.4__del__
:当子弹对象被销毁时调用的方法,打印一条消息。
结语:
关于这个面向对象的小游戏主要是分为了两个模块:
基于pygame
的飞机射击游戏的基础类。这些类包括背景、敌机、英雄飞机和子弹。每个类都从GameSprites
基类继承,它提供了基本的精灵功能和更新方法
这里有两段代码分开调用是为了保持代码的模块化和可读性。Planegame
类封装了游戏的主要逻辑和功能,而 if __name__ == '__main__':
部分则是游戏的入口点。这种结构使得代码更易于理解和维护。
关系上,Planegame
类定义了游戏的所有核心组件和功能,包括初始化窗口、创建精灵和精灵组、事件处理、碰撞检测以及更新和绘制精灵组等。而 if __name__ == '__main__':
部分则是实际运行游戏的代码,它创建了 Planegame
类的一个实例,并调用了该实例的 start_game
方法来启动游戏循环。
不过,由于时间的关系今天我们就先到这里,还有 关于if __name__ == '__main__'的调用部分
,则会在明天继续更新
,也欢迎大家对我的内容进行指点
,这些都是个人关于学习面向对象的总结
,难免有所疏漏,请大家多多包涵,也欢迎大家对我的文章进行指点和斧正
。
相关文章:

关于制作Python游戏全过程(汇总1)
目录 前言: 1.plane_sprites模块: 1.1导入模块: 1.1.1pygame:一个用于创建游戏的Python库。 1.1.2random:Python标准库中的一个模块,用于生成随机数。 1.2定义事件代号: 1.2.1ENEMY_EVENT:自定义的敌机出场事件代号…...

独立站营销新纪元:AI与大数据塑造个性化体验的未来
随着全球互联网的深入发展和数字化转型的不断推进,作为品牌建设和市场营销的重要载体,独立站将迎来新的发展机遇。新技术的涌现,特别是人工智能和大数据等技术的广泛应用,为独立站带来了前所未有的机遇与挑战。本文Nox聚星将和大家…...

C语言项目实战——贪吃蛇
C语言实现贪吃蛇 前言一、 游戏背景二、游戏效果演示三、课程目标四、项目定位五、技术要点六、Win32 API介绍6.1 Win32 API6.2 控制台程序6.3 控制台屏幕上的坐标COORD6.4 GetStdHandle6.5 GetConsoleCursorInfo6.5.1 CONSOLE_CURSOR_INFO 6.6 SetConsoleCursorInfo6.7 SetCon…...

ArmSoM规划开发基于RK3576的开发套件
ArmSoM正计划推出一款新的产品,这款产品将采用强大的RK3576芯片。 本文将为您介绍我们的新产品搭载的RK3576性能参数,以及它如何为您提供卓越的性能和功能。 RK3576处理器 RK3576处理器是一款强大的处理器,具备出色的性能和多样化的功能&a…...

视频剪辑如何提取伴奏?短视频剪辑有妙方
在多媒体处理中,音频的编辑和处理是不可或缺的一部分。很多时候,我们可能想要从一段视频或音频中提取伴奏,或者实现人声的分离,以便于进一步制作或混音。以下,将为您介绍一种简单而有效的方法来实现这一目标。 一、提取…...

【Web】浅浅地聊SnakeYaml反序列化两条常见利用链
目录 关于Yaml 关于SnakeYaml SnakeYaml反序列化利用 JdbcRowSetImpl链 ScriptEngineManager链 复现 基本原理 继续深入 关于Yaml 学过SpringBoot开发的师傅都知道,YAML和 Properties 文件都是常见的配置文件格式,用于存储键值对数据。 这里举…...
详解openGauss客户端工具gsql的高级用法
前言: gsql是openGauss提供在命令行下运行的数据库连接工具,可以通过此工具连接服务器并对其进行操作和维护,除了具备操作数据库的基本功能,gsql还提供了若干高级特性,便于用户使用。 gsql的基本功能 连接数据库&…...

开源工业软件:SCADA系统开源
PyScada是一个开源的scada系统 源代码地址 http://www.gitpp.com/huangtomy/pyscada-cn SCADA系统是Supervisory Control And Data Acquisition的缩写,即数据采集与监视控制系统。它是以计算机为基础的DCS与电力自动化监控系统,应用领域非常广&#x…...
关于AI彩票预测算法的设想
本文以双色球选择红色6个号码为例 我们先把问题简化,双色球红色号码一共有33个球。摇奖时,每次随机摇出来一个号码,连续6次,就随机出来了6个红色球号码。 而这6个号码就是一注彩票里的前6个红色球号码。这里不讨论一注彩票里后端…...

设计模式之策略模式实践
设计模式之策略模式实践 先了解一下策略模式的定义是什么?解决什么问题 策略模式是一种行为设计模式,它定义了一系列算法,将每个算法封装成一个类,并使它们可以互相替换。策略模式允许客户端在运行时从可互换的算法中选择一个&a…...
讨论:解决哈希冲突的几种方法
1. 什么是哈希 哈希是通过对数据进行再压缩,提高效率的一种解决方法。 2. 什么时候会产生哈希冲突 通过哈希函数产生的哈希值是有限的,当数据量比较大时经过哈希函数处理后仍然有不同的数据对应相同的值。这时候就产生了哈希冲突。 3. 常见的哈希函数 1&…...

遥感分析时什么情况下需要做大气校正?
经常会遇到这样的问题:什么情况需要做大气校正产生?这个问题取决于传感器和应用目标,总的来说,如果要做光谱分析,那么大气校正是必须要做的。本文对于在什么情况下选择什么样的大气校正方法,给出了一些依据…...
设计模式学习笔记 - 设计原则 - 7.DRY 原则及提高代码复用性
前言 DRY 原则,英文描述为: Don’t Repeat Yourself。中文直译:不要重复自己。将它应用在编程中,可理解为:不要写重读的代码。 可能你认为,这个原则很简单。只要两段代码长得一样,那就是违反 …...
方法的调用
自定函数(方法) 函数(方法): 给定一个具有独立功能的代码片段进行"命名",并通过该该类名调用"方法" main主函数 在当前类中,可以直接调用方法(因为方法使用了static关键字) package study;import java.time.LocalDate; import java.time.format.Date…...

VGW在 Windows 平台上局域网就绪的旁路由器程序
在查阅本篇文章之前可以查看下,本人前两年写的关于VGW软件路由器的文章 Linux 平台上面单网卡 TUN/TAP实现局域网其它设备上网_linux 物理网卡与tun同网段-CSDN博客 VGW软件路由器是一个工作IEEE以太网(L2)链路层的路由器程序,它…...

能源大数据采集,为您提供专业数据采集服务
随着经济的不断发展,能源产业也逐渐成为国民经济的支柱产业之一。而对于能源行业来说,数据采集是一项至关重要的工作。以往,能源企业采集数据主要依靠人工收集、整理,但是这种方式不仅效率低下,而且容易出现数据不准确…...

01_Maven
文章目录 Maven安装MavenMaven的工作流程配置MavenMaven的使用module和project的关系如何用Maven导包 如何用Maven进行项目构建指令介绍clean指令compile指令package指令install指令 Maven的依赖管理如何导包scope作用域依赖传递依赖冲突 使用Maven开发项目Junit如何使用Junit …...

C语言题目练习
目录 前言 1、转置矩阵 1.1 题目 描述 输入描述: 输出描述: 1.2解题 分析: 程序: 2、KiKi判断上三角矩阵 2.1 题目 描述 输入描述: 输出描述: 2.2 解题 分析: 程序: 3、…...
物联网安全|TrustAsia助力PSWG应对全球物联网产品安全合规挑战
万物互联时代,随着物联网连接数快速增长,物联网设备的潜在网络安全隐患也日益增长,可能导致设备故障、数据被盗、篡改、隐私泄露等问题的发生,甚至成为网络攻击的跳板,对互联网基础设施构成严重威胁。 我们看到&#…...

基于单片机的医院输液系统设计
目 录 摘 要 Ⅰ Abstract Ⅱ 引 言 1 1系统方案设计与论证 3 1.1系统硬件结构总体设计方案 3 1.2点滴速度测量电路方案的选择与论证 3 1.3液面检测电路方案的选择与论证 4 1.4通过电机控制滴速电路的方案与论证 4 1.5显示器接口电路方案选择与论证 5 1.6键盘接口电路方案选择与…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...

MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分: 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...