第一次参加猿创征文活动,肯定要 来一波大的!Σ(⊙▽⊙”a!!!
在夏天结束不久之际,让我们再来一波冲浪,感受夏日阳光下程序员的刻苦钻研精神,和无处可放基情。
最近学习了一丁点Pygame技能,感觉有点上头,一波操作创作 “程序猿乘风破浪”游戏一款,希望大家喜欢。

一、游戏展示
所谓: 开局一张图,后面全靠编。先放图片、动画展示一波。
游戏玩法很简单, 按空格猴子↑跳起来,躲开巨浪袭击,时间越长得分越高,碰到巨浪游戏结束统计得分。

游戏展示画面
二、游戏逻辑
为了通俗易懂,这里就不用代码结构的方式解释。游戏大致可以分为四大部分,分别为:
(一)游戏背景
1、天空背景。用多条蓝色横线点缀的白色天空,使用Python代码让 天空背景从右到左不停的移动,从而制造 猴子向右移动的假象。

天空背景
背景精灵代码:
class Background(GameSprite):
"""游戏背景精灵"""
def __init__(self,image_path, is_alt=False):
# 1.调用父类方法实现精灵的创建(image/rect/speed)
super().__init__(image_path)
# 2.判断是否是交替图像,如果是,需要设置初始位置
if is_alt is True:
self.rect.x = self.rect.width
else:
self.rect.x = 0
def update(self):
# 1.调用父类的方法实现
super().update()
# 2.判断是否移出屏幕,如果移出屏幕,将图像设置到屏幕的上方
if self.rect.x
2、海洋背景。海洋背景使用了 内层海洋和 外层海洋两张背景图片,同时让他们的 移动速度与天空背景不一致,两个内层与外层海洋 之间的移动速度也不一致,从而制造游戏的立体层次感, 让2D游戏增加3D的立体感觉。
def __create_sprites(self):
"""创建背景精灵和精灵组"""
# 天空背景
bg1 = Background("./images/background_16_9.png", False)
bg2 = Background("./images/background_16_9.png", True)
self.back_group = pygame.sprite.Group(bg1, bg2)
# 内层海洋背景
sea_bg_1 = Background("./images/sea_bg_1_16_9.png", False)
sea_bg_2 = Background("./images/sea_bg_1_16_9.png", True)
#移动速度
sea_bg_1.speed = 2
sea_bg_2.speed = 2
sea_bg_1.rect.bottom = SCREEN_RECT.height
sea_bg_2.rect.bottom = SCREEN_RECT.height
self.sea_bg_ground_1 = pygame.sprite.Group(sea_bg_1, sea_bg_2)
# 外层海洋背景
sea_bg_3 = Background("./images/sea_bg_2_16_9.png", False)
sea_bg_4 = Background("./images/sea_bg_2_16_9.png", True)
# 移动速度
sea_bg_3.speed = 3
sea_bg_4.speed = 3
sea_bg_3.rect.bottom = SCREEN_RECT.height
sea_bg_4.rect.bottom = SCREEN_RECT.height
self.sea_bg_ground_2 = pygame.sprite.Group(sea_bg_3, sea_bg_4)
(二)猴子游戏精灵(玩家)
1、让猴子精灵上下跳动。使用Python监听键盘时间,当按下键盘空格键时,给猴子精灵一个向上(y轴负值)的速度,当键盘空格键没按下时给猴子精灵一个向下(y轴正值)的速度,这样就可以实现猴子精灵的上下跳动。

主要代码如下:
# 使用键盘提供的方法获取键盘按键 - 按键元组
keys_pressed = pygame.key.get_pressed()
# 判断用户按下键盘空格键
if keys_pressed[pygame.K_SPACE]:
# 跳起
self.man.speed = -10
else:
# 下降
self.man.speed = 10
2、让猴子不能飞出游戏屏幕。使用Python代码监控猴子的位置,当猴子y轴的值小于0(碰到屏幕上边缘)时y轴的值重置为0,当猴子y轴的值大于360(碰到屏幕下边缘)时y轴重置为360。

主要代码如下:
def update(self):
# 猴子在水平方向移动
self.rect.y += self.speed
# 控制猴子不能移出屏幕
if self.rect.y < 0:
self.rect.y = 0
elif self.rect.bottom > self.bottom_to_ground:
self.rect.bottom = self.bottom_to_ground
3、让猴子置与内层海洋和外层海洋之间,增加游戏层次感。在调用Pygame刷新界面函数时,先调用内层海洋刷新函数,再调用猴子精灵刷新函数,最后在调用外层海洋刷新函数,既可以实现预期效果。

主要代码如下:
def __update_sprites(self):
"""刷新各个精灵组"""
# 先刷新内层海洋
self.sea_bg_ground_1.update()
self.sea_bg_ground_1.draw(self.screen)
# 再刷新猴子
self.man_group.update()
self.man_group.draw(self.screen)
# 最后刷新外层海洋
self.sea_bg_ground_2.update()
self.sea_bg_ground_2.draw(self.screen)
(三)巨浪游戏精力(敌人)
1、每个一段时间生成一股巨浪,巨浪由右到左出现,速度有快有慢。首先继承 _pygame.sprite.Sprite_创建巨浪精灵类,使其具有速度speed等属性。
class Wave(GameSprite):
"""海浪精灵"""
def __init__(self):
# 1.调用父类方法,创建海浪精灵,同时指定海浪图片
super().__init__("./images/wave.png")
# 2.指定海浪的初始随机速度
self.speed = random.randint(2, 4)
# 3.指定海浪的初始随机位置
self.rect.x = SCREEN_RECT.width
self.rect.bottom = SCREEN_RECT.height
然后创建 _Pygame_自定义事件 CREATE_WAVE_EVENT。
# 创建海浪的定时器事件常量
CREATE_WAVE_EVENT = pygame.USEREVENT+1
同时使用 _pygame.time.set_timer_创建定时器,每3秒触发一次该事件。
# 4.设置定时器事件——每3秒创建一次海浪
pygame.time.set_timer(CREATE_WAVE_EVENT, 3000)
最后,若事件监听处理函数 发现该事件后,创建一个巨浪精灵并加入精灵组。
elif event.type == CREATE_WAVE_EVENT:
# 创建海浪精灵
wave = Wave()
# 将海浪精灵添加到海浪精灵组
self.wave_group.add(wave)
2、巨浪与猴子碰撞后结束游戏。每帧使用 _def __check_collide(self)_检测猴子精灵与巨浪精灵组 是否出现碰撞,若碰撞了就结束本回合游戏。

碰撞检测代码如下:
def __check_collide(self):
# 1.撞到海浪
waves = pygame.sprite.spritecollide(self.man, self.wave_group, True)
# 2.判断碰撞列表长度
if len(waves) > 0:
# 该回合游戏结束,显示菜单
self.menu_sprite.display = True
self.game_state = 0
3、巨浪移出左屏幕后删除该巨浪。为了节省内存,当没有被碰到的巨浪从右至左移出屏幕左边缘的时候应该删除该巨浪精灵。可以每帧判断巨浪的 右侧是否小于屏幕左边缘实现该删除操作。

(四)定时器和得分
1、自定义定时器事件,每个 1秒数字减 1。游戏默认游玩时间为 30秒,游戏开始后便开始倒数,右上角开始 30,29,28更新数字。和创建巨浪类似,可以先创建一个倒数事件,然后使用定时器每秒触发,最后在监听事件函数中执行刷新数字操作。

主要代码如下:
创建自定义事件 CREATE_I_EVENT。
# 创建游戏倒计时的定时器常量
CREATE_I_EVENT = pygame.USEREVENT+2
同时使用 _pygame.time.set_timer_创建定时器,每1秒触发一次该事件。
# 5.设置定时器事件——倒计时每1秒触发一次
pygame.time.set_timer(CREATE_I_EVENT, 1000)
最后,若事件监听处理函数 发现该事件后,倒计时减 1。
elif event.type == CREATE_I_EVENT:
# 倒计时减1秒
self.countdown_sprite.start_time = self.countdown_sprite.start_time - 1
2、每个一秒加十分。和倒计时一样,只是这里是每秒加十分。
elif event.type == CREATE_I_EVENT:
# 每过1秒加十分
self.score_sprite.score = self.score_sprite.score + 10
3、游戏重新开始时,重置定时器及得分。如果用户点击重新开始游戏,则重置相关属性重新开始游戏。

三、游戏完整源代码
游戏终于搞定了!尼玛啊!又要编程又要写文章,累啊!o(╥﹏╥)o,码文不易,请多多支持,Thanks♪(・ω・)ノ,后续在此基础上再搞一波,丰富游戏玩法。
最后贴上完整源码,素材(部分素材来源网络,如果问题请联系博主处理,谢谢!)只能打包放下载了。
https://download.csdn.net/download/qq616491978/86512478
Original: https://blog.csdn.net/qq616491978/article/details/126769079
Author: 清远小阮
Title: 猿创征文|程序猿乘风破浪 Python Pygame 原创小游戏【源码+解析】
相关阅读
Title: 焱融 YRCloudFile 跨云多源数据管理,直击自动驾驶 “割裂式存储”痛点
*[En]*
**
可见,智能化技术正悄然走进人们生活,自动驾驶也逐渐从 L1-L2 阶段,开始向 L3-L4 级别发展,众多整车厂和自动化驾驶算法系统开发厂商正在积极探索,力求占领行业第一位,拿到自动驾驶这把汽车未来市场宝藏的钥匙。
当前,在整体汽车自动化驾驶行业中,核心竞争力已经从车辆硬件转向自动驾驶决策”AI 大脑”。AI 训练只有在不断迭代更新的过程中,才能逐渐增长”见多识广”的能力,做出准确的判断。其中,提升 AI 自动驾驶算法迭代能力,可谓是各家厂商竞争对抗的关键能力。
实际上,影响 AI 迭代的核心关键主要是, 算法设计和海量的数据。
海量有特征的训练数据是让 AI 具备认识世界的重要环节,从路测数据采集到数据中心的数据预处理、特征数据管理、训练、数据归档等一系列过程都需要高效衔接运行,只要其中一个环节不通畅,或者效率低就会导致整体业务效率下降。因此, AI 算法的竞争背后是 AI 算法内的海量数据竞争,如何完善数据流管理成为了自动化驾驶迭代的关键。

自动化驾驶业务流程图
*[En]*
**
数据多样性
*[En]*
**
数据规模大
*[En]*
**
数据非结构性
*[En]*
**
数据流动性
*[En]*
**
以上是自动化驾驶行业的业务数据特点,为进一步说明这些已知的特征,我们将以一家全球无人驾驶科技公司的解决方案为例,帮助大家了解焱融科技是如何构建该公司 IT 基础平台支撑其业务发展。
割裂式存储难处理
该全球无人驾驶科技公司是一家专注于 L4 级别无人驾驶卡车技术研发与应用的人工智能企业,具备感知、定位、决策、控制等无人驾驶核心功能,能够实现货运卡车在干线物流场景和半封闭枢纽场景下的全无人驾驶。
在该公司的整体业务流程中,包含数据预处理、特征数据管理、训练、归档等多个环节,原始数据需要经过众多环节处理,才能成为业务要求的特征化数据。在使用 YRCloudFile 之前,该公司管理数据的方式是采用割裂式的方式,比如:
- 数据预处理,使用大容量存储
- 特征数据管理,使用高性能存储
- 训练阶段,使用高性能存储
- 归档阶段,使用大容量存储
*[En]*
**
焱融科技支持”跨云多源数据管理”
焱融科技充分了解到该公司全业务流程存储管理的痛点以后,根据自身在行业多年的AI 自动化驾驶领域存储经验,提出了” 混合云存储“解决方案。通过路测取回的原始数据作为共享母版的方式,搭建本地到云端的跨云架构方案,将原先数据流向”大容量存储-高性能存储-大容量存储”的拷贝方式,通过 YRCloudFile DataLoad 技术实现统一管理,按照业务发展需要按需流转,自动化管理,彻底摒弃传统人工或者脚本管理运维的原始方式。
YRCloudFile 通过将数据预处理、特征数据管理、训练、归档业务环节串联起来,达到了真正意义上的流管理方式,使得数据随业务在系统内部流动,单阶段性能比传统架构提升 7 倍左右,实现在数据预处理阶段,计算集群通过向低成本的对象存储读取数据进行业务开展,读取后通过文件层加速,实现后续工作。

YRCloudFile 跨云多源整合业务流程图
*[En]*
**
性能监测传统存储支撑性能最大约为3GB/s,数据预处理环节使存储性能问题成为业务发展的第一个短板,亟需解决。
在使用 YRCloudFile 作为文件层,向下对接对象层后,开启 YRCloudFile DataLoad 功能,同样在数据预处理环节中,性能监测反馈可满载运行 60 个数据预处理任务,20GB/s 的带宽量,前端计算带宽基本打满,此时相较于传统存储,采用 YRCloudFile DataLoad 后性能提升 7 倍左右。而大量素材是通过 YRCloudFile DataLoad 进行了多源整合和加速,并未改变原始数据的存储方式,从性能和成本、管理都得到了很好的平衡,关键实现了业务效率的极大提升。

数据预处理业务并发对比图
另外,数据在进入预处理存储后,就开始了由 YRCloudFile 统一命名管理,实现了数据随业务发展流动,除了能让上文提到的数据预处理环节实现降本增效,还可以帮助后续环节中的多个业务环节利用 YRCloudFile DataLoad 技术功能来提升性能。
例如在生产环节,相比全量提取对比数据的办法,YRCloudFile 采用 DataLoad 技术,可以按需读取生产数据对比数据进行测试,从整体时效性上,具备秒级响应特征,对比传统全量拷贝方式,业务效率提升巨大。
在帮助客户实现业务数据多源整合的同时,YRCloudFile 还通过分层技术功能让客户落地了本地到云端的同步双活方案,达成了业务连续性的要求,并最大化降低 TCO。具体架构如下:

YRCloudFile 分层双活业务架构
在本地算力端部署 YRCloudFile,满足业务加速要求的同时,向下开启对象接口,通过 YRCloudFile 全生命周期管理策略,按照周期管理将冷热数据分开,冷数据自动下刷至对象存储,热数据在 YRCloudFile 的文件层,保障性能稳定和平衡成本支出。在业务调取冷数据时,可以通过透明调取的方式,按照 YRCloudFile 统一命名空间管理。
在此基础上,YRCloudFile 对接云上对象存储,将按照数据生命周期管理的策略,把本地下刷至对象存储的数据同步上传到云上对象存储,实现本地和云端对象存储数据同步。如若业务需要读取冷数据时,YRCloudFile 会根据读取指令将优先读取本地存储目标数据和切片返回给业务端,采用云端不读取的方式,节约数据成本。当本地对象故障时,冷数据同步在云端,那么 YRCloudFile 会检测数据位置,读取云端数据和切片返回给计算。以此来整体保障业务连续性,避免因网络、站点等产生的故障问题。
通过 YRCloudFile DataLoad 技术和多级分层技术,该公司的存储成本直接下降 300% 且性能提升 500%以上,实现在全业务流程中,数据存储的管理对于业务是完全透明的。这也意味着,无论数据如何变动,业务端都无需”操心”。包括归档以后,也是由 YRCloudFile 全生命周期统一管理,达到”跨云多源数据管理”能力。
该公司在采用高性能分布式文件存储 YRCloudFile 的方案后,打破了传统存储的壁垒,全面提升了数据整合能力,并在业务实际使用过程中,配合完善的运维能力,提升整体可维护使用能力,真正做到”最懂自动化驾驶业务的存储系统”。目前,焱融科技已经帮助该公司建立多个数据中心和跨云整体混合云平台,有效优化业务流程,提升整体业务效率。
Original: https://blog.csdn.net/YAN_RONG_TECHNOLOGY/article/details/124382257
Author: YAN_RONG_TECHNOLOGY
Title: 焱融 YRCloudFile 跨云多源数据管理,直击自动驾驶 “割裂式存储”痛点
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/200825/
转载文章受原作者版权保护。转载请注明原作者出处!