Python游戏开发-超级海盗!!!

article/2025/3/5 7:11:57

开发环境配置

安装python环境后,下载pygame模块,使用如下命令

pip install pygame

注:该项目使用了一些新特性,使用3.10以上的版本

游戏项目介绍

游戏分为两个模块,分别是编辑模块和关卡模块,在编辑模块下,玩家可拖动地图菜单中的不同地图元素,对游戏界面进行地图的布局,在关卡模式下,玩家可控制角色对自己布局的地图关卡进行闯关

该游戏是一款类似于马里奥的闯关游戏,不同的是,玩家可自己设计游戏关卡进行闯关

游戏项目演示

项目源码获取在下面文章末尾获取 

游戏部分功能介绍

游戏模式切换

main.py为该程序的入口文件,editor.py为编辑模式的功能实现,level.py为关卡模式的功能实现,三者的关系如下

图片

在main.py中定义了一个标识符(self.editor_active)用于游戏两种模式的切换,默认该值为True,即运行程序,先进入编辑模式,编辑完成后,按下Enter键,则调用toggle()函数,将该值改为False,在main程序的循环体执行中,进入关卡模式

  #main.py中的Main类def run(self):while True:dt = self.clock.tick() / 1000# 通过检查self.editor_active的值,决定是运行编辑器还是关卡if self.editor_active:self.editor.run(dt)else:self.level.run(dt)self.transition.display(dt)pygame.display.update
 #main.py中的Main类def toggle(self):print('进入toggle,切换游戏的模式状态')self.editor_active = not self.editor_active# 通过检查self.editor_active的值,判断是否需要启动编辑器音乐if self.editor_active:self.editor.editor_music.play()

toggle函数的调用过程是较复杂的,程序运行后,首先调用了editor.run(dt),进入编辑模式,后调用Editor类中的event_loop()函数,该函数会及时响应玩家的事件操作(鼠标和键盘),当玩家在键盘中输入Enter键时,调用switch函数改变游戏模式状态

图片

Translation类作为main类的一个属性,在执行display()方法时,若属性transition.ative的值为True时(默认为False),进入if分支内,调用了main中的toggle()函数,改变了editor_active属性的值

 #Translation类#用于在游戏窗口中绘制过渡效果def display(self, dt):if self.active:self.border_width += 1000 * dt * self.directionif self.border_width >= self.threshold:self.direction = -1self.toggle()if self.border_width < 0:self.active = Falseself.border_width = 0self.direction = 1pygame.draw.circle(self.display_surface, 'black',self.center, self.radius, int(self.border_width))

游戏分数显示

为了提升游戏的体验感,增加游戏分数显示的功能,当玩家对关卡设计完成后,进行关卡挑战,玩家控制的角色只要接触到硬币,则右上角的游戏分数增加,按金币增加两分,银币增加一分进行计算

在level.py中的Level类的__init__()方法中添加属性score,用于记录游戏分数

# 游戏分数
self.score = 0

Player(玩家角色Sprite)类,在创建Level类时,作为level对象中的一个类属性被创建,同时地图上的其它(Sprite)类也被创建,这些精灵类都继承了通用的角色类Generic,而Generic继承Sprite

"""
通用的角色类,包含了角色的基本属性和方法
"""
class Generic(pygam,ere.sprite.Sprite):def __init__(self, pos, surf, group, z = LEVEL_LAYERS['main']):super().__init__(group)self.image = surfself.rect = self.image.get_rect(topleft = pos)self.z = z

这些精灵类都交给pygame.sprite.Group进行管理,它是一个可以容纳多个精灵对象的容器,作为Level类的一个属性,方便进行对象的获取

self.coin_sprites = pygame.sprite.Group()   # 硬币
self.shell_sprites = pygame.sprite.Group()  # 敌人

在Level类中声明get_coin()方法,用于检测角色是否触碰到硬币,pygame.sprite.spritecollide用于检测两个精灵对象是否发生碰撞,并返回碰撞列表,之所以调用两次,第一次用于获取碰撞的硬币对象信息,第二次设置为为True用于将碰撞的精灵删除

  def get_coins(self):# pygame.sprite.spritecollide:检测玩家和硬币的碰撞# 返回和玩家发生碰撞的硬币精灵的列表,同时将这些硬币精灵从 self.coin_sprites 精灵组中移除(设置碰撞为 True)collided_coins1 = pygame.sprite.spritecollide(self.player, self.coin_sprites, False)len = collided_coins1.__len__()if(len > 0):coin_type = collided_coins1[0].coin_typeprint(f'碰撞1:{collided_coins1[0].coin_type}')if coin_type == 'silver':print(self.score)self.score += 1elif coin_type == 'gold':print(self.score)self.score += 2else:self.player.life += 1print(f'生命数:{self.player.life}')collided_coins = pygame.sprite.spritecollide(self.player, self.coin_sprites, True)for sprite in collided_coins:print('碰撞')self.coin_sound.play()Particle(self.particle_surfs, sprite.rect.center, self.all_sprites)

此时游戏分数功能的记录已经完善,但还需要在游戏窗口中展示,在level.py中定义了CameraGroup类,继承自pygame.sprite.Group用于管理精灵对象,并在游戏窗口中进行精灵对象的绘制

游戏关卡模式运行时,会调用level.run方法,而run方法中,则调用了CameraGroup类中的update方法,对游戏窗口进行了更新,在调用该方法时,应将游戏分数score传给cameraGroup对象

 #level.run def run(self, dt):# updateself.event_loop()life = self.player.lifeself.all_sprites.score = self.scoreself.all_sprites.life = lifeself.all_sprites.update(dt)self.get_coins()self.get_damage()

故可在CameraGroup类的draw_horizon()添加游戏分数的显示

# 绘制游戏分数
text = pygame.font.Font("../font/LycheeSoda.ttf", 36).render(f'SCORE:{self.score}', True, (255, 255, 255))
self.display_surface.blit(text, (20, 20))

运行结果

图片

游戏生命显示

这里设计为红色宝石为角色的生命数,当触碰到敌人或者被敌人攻击击中后,生命数量减少1,当在游戏地图中触碰到红色宝石,则生命数量增加1

判断用户是否接触到红宝石,在上面的get_coin方法中已经完成,在Player类的属性中添加life属性,设置游戏角色的血量,同时将该属性值传给cameraGroup对象,与上面游戏分数的做法一样

#sprite.py中的Player类
# 设置血条
self.life = 2

在Player类中声明damage方法,用于减少角色生命数量,而真正角色碰撞受伤的逻辑在level中实现

  """Player类受到伤害时的操作,使玩家向上移动并启动无敌计时器"""def damage(self):if not self.invul_timer.active:print('受伤')self.invul_timer.activate()self.direction.y -= 1.5self.life -= 1
  #Level类def get_damage(self):# 检测角色是否与敌人发生碰撞collision_sprites = pygame.sprite.spritecollide(self.player, self.damage_sprites, False, pygame.sprite.collide_mask)if collision_sprites:self.hit_sound.play()self.player.damage()

运行结果如上图所示

游戏结束

当玩家生命数量为0时,则游戏结束,同时在游戏窗口中显示GAME OVER字体提示,在CameraGroup类中判断life的值即可

      # 绘制生命(用宝石数量代表生命数量)image = pygame.image.load("../graphics/items/diamond/0.png")image_rect = image.get_rect()image_rect.center = (30,80)text2 = pygame.font.Font("../font/LycheeSoda.ttf", 36).render(f':× {self.life}', True, (255, 255, 255))self.display_surface.blit(text2, (50, 65))self.display_surface.blit(image, image_rect)if self.life <= 0:text = pygame.font.Font('../font/LycheeSoda.ttf', 120).render('GAME  OVER', True, (215, 55, 74))self.display_surface.blit(text, (400, 250))

图片

项目源码获取在下面文章末尾获取


http://chatgpt.dhexx.cn/article/liUZw0iP.shtml

相关文章

chatgpt赋能python:Python编译成Java字节码:一个全新的可能性

Python编译成Java字节码&#xff1a;一个全新的可能性 Python作为一种高级编程语言&#xff0c;有其独特的优点和特点&#xff0c;被广泛应用于各个领域。然而&#xff0c;随着Python在企业级应用中的广泛应用&#xff0c;性能和安全等方面的问题也越来越凸显出来。这时&#…

鲲鹏法(一)python环境搭建

简单总结一下python的开发环境&#xff08;偏科学计算一些&#xff09;&#xff0c;Pycharm等之后再补了 python环境搭建 一.Python二.IPython三.Jupyter1.Jupyder QtConsole(了解即可)2.Jupyder Notebook3.Jupyder Lab4.单元类型5.编辑单元6.Markdown单元7.输出显示8.nbconver…

【预测模型-ELM预测】基于原子搜索算法优化极限学习机预测matlab代码

​1 简介 针对变压器故障的特征,结合变压器油中气体分析法以及三比值法.提出了基于原子搜索算法改进极限学习机的故障诊断方法.由于输入层与隐含层的权值和阈值是随机产生.传统的极限学习机可能会使隐含层节点过多,训练过程中容易产生过拟合现象.该方法运用原子搜索算法对极限…

ELMo模型解读

在反复的看了ELMo源码和参考网上各路大神的经验之后&#xff0c;终于对ELMo的架构有了比较清楚的认识。总结一下自己对ELMo的理解&#xff0c;其实还有很多细节没有搞清楚。 一.模型架构 下面是我画的一个架构简图&#xff0c;对于ELMo不管你输入的是词还是字符&#xff0c;它…

【预测模型】基于粒子群算法PSO优化极限学习机ELM实现数据预测matlab源码

1 模型 为了提高空气质量预测精度,提出一种基于粒子群算法优化极限学习机的空气质量预测模型.运用粒子群算法优化极限学习机的初始权值和偏置,在保证预测误差最小的情况下实现空气质量最优预测.选择平均绝对百分比误差,均方根误差和平均绝对误差作为评价指标,通过PSO-ELM和ELM…

多元分类预测 | Matlab麻雀算法(SSA)优化极限学习机(ELM)的分类预测,多特征输入模型。SSA-ELM分类预测模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 麻雀算法(SSA)优化极限学习机(ELM)的分类预测,多特征输入模型。SSA-ELM分类预测模型 多特征输入单输出的二分类及多分类模型。程序内注释详细,直接替换数据就可以用。程序语言为matlab,程序可出分类效果图,迭代…

多元分类预测 | Matlab粒子群算法(PSO)优化极限学习机(ELM)的分类预测,多特征输入模型。PSO-ELM分类预测模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元分类预测 | Matlab粒子群算法(PSO)优化极限学习机(ELM)的分类预测,多特征输入模型。PSO-ELM分类预测模型 多特征输入单输出的二分类及多分类模型。程序内注释详细,直接替换数据就可以用。程序语言为matlab,…

【预测模型-ELM分类】基于极限学习机ELM+OSELM+KELM+半监督SSELM+USELM实现数据集分类附matlab代码

1 内容介绍 极限学习机是由黄广斌等&#xff3b;13&#xff3d;提出的一种针对前馈神经网络设计的机器学习算法。该算法结构简单、计算速率快。ELM的关键在于找到输出和输出之间的映射空间。首先确定隐含层之间的连接权值w和隐含层神经元的偏置b。选择一个无限可微的函数作为隐…

多元分类预测 | Matlab鲸鱼算法(WOA)优化极限学习机(ELM)的分类预测,多特征输入模型。WOA-ELM分类预测模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元分类预测 | Matlab鲸鱼算法(WOA)优化极限学习机(ELM)的分类预测,多特征输入模型。WOA-ELM分类预测模型 多特征输入单输出的二分类及多分类模型。程序内注释详细,直接替换数据就可以用。程序语言为matlab,程…

【ELM数据预测】基于matlab粒子群算法优化ELM数据预测(含前后对比)【含Matlab源码 449期】

✅博主简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;Matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;海神之光 &#x1f3c6;代码获取方式&#xff1a; 海神之光Matlab王者学习之路—代码获取方式 ⛳️座右铭&#xff1a;…

elmo模型详解

elmo模型结构 如下所示是elmo模型结构图&#xff1a; 在输入中可以采用worc2vec模型 训练的词向量。 其实总的来说&#xff0c;elmo模型就是若干bilstm的堆积&#xff0c;然后训练得到的&#xff0c; 对于某一个单词[公式]&#xff0c;一个L层的双向语言模型biLM由2L1个向量表…

多元分类预测 | Matlab灰狼算法(GWO)优化极限学习机(ELM)的分类预测,多特征输入模型。GWO-ELM分类预测模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元分类预测 | 灰狼算法(GWO)优化极限学习机(ELM)的分类预测,多特征输入模型。GWO-ELM分类预测模型 多特征输入单输出的二分类及多分类模型。程序内注释详细,直接替换数据就可以用。程序语言为matlab,程序可出…

ELMo模型简介

word2vec是一种静态词嵌入方法&#xff0c;它不会随着上下文场景的变化而变化。但一词多义在现实中太常见了&#xff0c;因此这种静态嵌入的局限性在很多场景显得力不从心。而ELMo就是为解决这些问题提出的&#xff0c;它的提出意味着从词嵌入(Word Embedding)时代进入了语境词…

【ELM回归预测】基于matlab粒子群算法优化ELM回归预测【含Matlab源码 1722期】

✅博主简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;Matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;海神之光 &#x1f3c6;代码获取方式&#xff1a; 海神之光Matlab王者学习之路—代码获取方式 ⛳️座右铭&#xff1a;…

【预测模型】基于 Elm神经网络的电力负荷预测模型matlab源码

1. 算法概述 **\ ELM算法针对的问题是单隐层的前馈神经网络(single-hidden layer feedforward neural networks&#xff0c;SLFNs)&#xff0c;算法特点在于输入层到隐层的权重W和偏差B可以随机设定&#xff0c;隐层激励函数具有无限可微的特征即可(常用的有radial basis、sine…

【预测模型-ElM分类】基于松鼠算法优化ElM神经网络实现数据分类附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

模型学习 - ELM

本学弱喜欢在本子上记笔记&#xff0c;但字迹又丑。 望看不懂我的字的大佬不要喷我&#xff0c;看得懂的大佬批评指正。

【预测模型-ELM预测】基于蚁群算法优化极限学习机预测matlab代码

1 简介 针对变压器故障的特征,结合变压器油中气体分析法以及三比值法.提出了基于蚁群算法改进极限学习机的故障诊断方法.由于输入层与隐含层的权值和阈值是随机产生.传统的极限学习机可能会使隐含层节点过多,训练过程中容易产生过拟合现象.该方法运用蚁群算法对极限学习机的输…

【预测模型-ELM分类】基于鲸鱼算法优化核极限学习机实现数据分类附matlab代码

1 内容介绍 极限学习机&#xff08;&#xff45;&#xff58;&#xff54;&#xff52;&#xff45;&#xff4d;&#xff45; &#xff4c;&#xff45;&#xff41;&#xff52;&#xff4e;&#xff49;&#xff4e;&#xff47; &#xff4d;&#xff41;&#xff43;&…

【ELM预测】基于极限学习机ELM实现数据预测matlab源码

一、极限学习机的概念 极限学习机(Extreme Learning Machine) ELM&#xff0c;是由黄广斌提出来的求解单隐层神经网络的算法。 ELM最大的特点是对于传统的神经网络&#xff0c;尤其是单隐层前馈神经网络(SLFNs)&#xff0c;在保证学习精度的前提下比传统的学习算法速度更快。 二…