关于制作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键盘接口电路方案选择与…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...
SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...
使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...
RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
