Python+Pygame实现经典魂斗罗游戏

 更新时间:2022年05月05日 15:01:10   作者:Python小二  
《魂斗罗》(Contra)是由Konami于1987年推出的一系列卷轴射击类单机游戏。本文将利用Python中的Pygame库实现这一经典游戏,感兴趣的可以了解一下

今天分享一个经典小游戏魂斗罗的 Python 版实现。

一、效果展示

二、操作说明

A:向左

D:向右

W:跳起

S:趴下

J:射击

P:退出程序

目前游戏还是比较初级的版本,有兴趣的小伙伴可以自行修改完善。

三、核心代码

class Game_Player():
 def __init__(self,game_settings,screen):

  self.screen = screen
  self.game_settings = game_settings
  self.image = pygame.image.load('images/PR/player.png')
  self.rect = self.image.get_rect()
  self.screen_rect = self.screen.get_rect()
  self.screen_center_pos = self.screen_rect.centerx
  self.rect.centerx = self.screen_rect.centerx
  self.rect.bottom = 380
  self.center = float(self.rect.centerx)
  self.moving_right = False
  self.moving_left = False
  self.player_moving = False
  self.pos_i = 0.0#跑步画面改变速度
  self.pos_j = 0.0#跳跃的改变初始速度
  self.pos_n = 0.0#射击
  self.pos_d = 0.0
  self.player_direction = 1#1为右,-1为左
  self.player_down = False
  self.player_up = False
  self.player_jump = False
  self.player_start_Y = 380#开始人物的高度
  self.player_Y = self.player_start_Y
  self.player_shooting = False

 def update(self):
  if self.game_settings.player_is_alive:
   if self.moving_right and self.rect.right < self.screen_rect.right:
    if self.game_settings.boss_appear:
     self.center += self.game_settings.player_speed
    elif self.center > self.screen_center_pos:
     self.center += 0
    else:
     self.center += self.game_settings.player_speed
   if self.moving_left and self.rect.left > 0:
    self.center -= self.game_settings.player_speed
   self.rect.centerx = self.center

   self.update_image_moving()
  else:
   self.update_die()

 def update_die(self):
  self.names = locals()
  self.players = []
  for self.i in range(1,3):
   self.names['player_image%s' %self.i] = pygame.image.load('images/PR/death%s.png' %self.i)
   self.players.append(self.names['player_image%s' %self.i])
  self.image = self.players[int(self.pos_d)]
  self.pos_d += 0.1
  if self.pos_d > 2.0:
   self.pos_d = 0.0
   self.game_settings.player_die_end = True


 def update_image_moving_direction(self,direction):#循环图片
  if self.player_shooting == True:
   self.names = locals()
   self.players = []
   for self.i in range(1,4):
    self.names['player_image%s' %self.i] = pygame.image.load('images/'+direction+'/shooting%s.png' %self.i)
    self.players.append(self.names['player_image%s' %self.i])
   self.image = self.players[int(self.pos_n)]
   self.pos_n += 0.1#射击时跑步速率
   if self.pos_n > 3.0:#射击时跑步有3个动作
    self.pos_n = 0.0
  else:
   self.names = locals()
   self.players = []
   for self.i in range(1,6):
    self.names['player_image%s' %self.i] = pygame.image.load('images/'+direction+'/player%s.png' %self.i)
    self.players.append(self.names['player_image%s' %self.i])
   self.image = self.players[int(self.pos_i)]
   self.pos_i += 0.1#跑步速率
   if self.pos_i > 5.0:#跑步有5个动作
    self.pos_i = 0.0

 def update_image_jump(self,direction):#循环图片
  if self.game_settings.player_is_alive:
   if self.player_jump == True:
    self.names1 = locals()
    self.players1 = []
    for self.j in range(1,5):
     self.names1['player_image%s' %self.j] = pygame.image.load('images/'+direction+'/jump%s.png' %self.j)
     self.players1.append(self.names1['player_image%s' %self.j])
    self.image = self.players1[int(self.pos_j)]
    self.pos_j += 0.3#跳跃旋转速率
    if self.pos_j > 4.0:#跳跃有4个动作
     self.pos_j = 0.0
  else:
   self.update_die()


 def update_image_moving(self):
  if self.player_moving:
   if self.moving_right:
    self.update_image_moving_direction('PR')#PR是向右的图片
   elif self.moving_left:
    self.update_image_moving_direction('PL')

 def get_player_state(self,player_state):#检测player的状态是否为趴下,向上,跳跃等
  if self.player_direction == 1:
   self.image = pygame.image.load('images/PR/'+player_state+'.png')
  if self.player_direction == -1:
   self.image = pygame.image.load('images/PL/'+player_state+'.png')
  self.rect = self.image.get_rect()
  self.rect.centerx = self.center

 def get_player_down(self):
  self.get_player_state('down')
  self.rect.bottom = self.player_start_Y
  self.screen.blit(self.image,self.rect)

 def get_player_up(self):
  self.get_player_state('up')
  self.rect.bottom = self.player_start_Y
  self.screen.blit(self.image,self.rect)

 def get_player_jump(self):
  self.get_player_state('jump1')
  self.rect.bottom = self.player_Y
  if self.game_settings.jump_vel < 0:
   self.game_settings.jump_vel += 0.6#跳跃上升的增加的速率
  elif self.game_settings.jump_vel > 0:
   self.game_settings.jump_vel += 0.8#跳跃下降增加的速率
  self.player_Y += self.game_settings.jump_vel
  if self.player_Y > self.player_start_Y:
   self.player_jump = False
   self.player_Y = self.player_start_Y
   self.game_settings.jump_vel = -14.0#恢复跳跃开始的速度
   if self.player_direction == 1:
    self.image = pygame.image.load('images/PR/player.png')
    self.reset_player()
   if self.player_direction == -1:
    self.image = pygame.image.load('images/PL/player.png')
    self.reset_player()
  if self.player_jump == True:#判断是否处于跳跃状态来决定是否旋转跳跃的图像
   if self.player_direction == 1:
    self.update_image_jump('PR')
   if self.player_direction == -1:
    self.update_image_jump('PL')
  self.screen.blit(self.image,self.rect)

 def reset_player(self):
  self.rect = self.image.get_rect()
  self.rect.centerx = self.center
  self.rect.bottom = self.player_start_Y
  self.screen.blit(self.image,self.rect)

 def blitme(self):
  if self.player_jump:
   self.get_player_jump()
  elif self.player_down:
   self.get_player_down()
  elif self.player_up:
   self.get_player_up()
  else:
   self.reset_player()

 def revive_player(self):
  self.center = self.screen_rect.centerx
  self.game_settings.player_is_alive = True

到此这篇关于Python+Pygame实现经典魂斗罗游戏的文章就介绍到这了,更多相关Python Pygame魂斗罗内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python免杀技术shellcode的加载与执行

    python免杀技术shellcode的加载与执行

    本文主要介绍了python免杀技术shellcode的加载与执行,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • pycharm新建Vue项目的方法步骤(图文)

    pycharm新建Vue项目的方法步骤(图文)

    这篇文章主要介绍了pycharm新建Vue项目的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • Python通过matplotlib绘制动画简单实例

    Python通过matplotlib绘制动画简单实例

    这篇文章主要介绍了Python通过matplotlib绘制动画简单实例,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • Python中Pickle模块和base64模块的使用解析

    Python中Pickle模块和base64模块的使用解析

    这篇文章主要介绍了Python中Pickle模块和base64模块的使用解析,pickle模块是python的标准模块,提供了对于python数据的序列化操作,可以将数据转换为bytes类型,其序列化速度比json模块要高,需要的朋友可以参考下
    2023-09-09
  • Python assert语句的简单使用示例

    Python assert语句的简单使用示例

    这篇文章主要给大家介绍了关于Python assert语句的简单使用,文中通过示例代码介绍的非常详细,对大家学习或者使用Python具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-07-07
  • Windows下Anaconda2安装NLTK教程

    Windows下Anaconda2安装NLTK教程

    这篇文章主要为大家详细介绍了Windows下Anaconda2安装NLTK的教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09
  • 使用matlab 判断两个矩阵是否相等的实例

    使用matlab 判断两个矩阵是否相等的实例

    这篇文章主要介绍了使用matlab 判断两个矩阵是否相等的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05
  • Python使用minidom读写xml的方法

    Python使用minidom读写xml的方法

    这篇文章主要介绍了Python使用minidom读写xml的方法,实例分析了使用minidom模块操作XML文件的相关技巧,需要的朋友可以参考下
    2015-06-06
  • python 与c++相互调用实现

    python 与c++相互调用实现

    这篇文章主要介绍了python 与c++相互调用实现,我们都知道c++运算速度快于python,python又简单易写,很多人就会想到将两者结合,接下俩小编要给大家介绍的就是python 与c++相互调用实现,,需要的朋友可以参考一下
    2022-03-03
  • 使用python实现离散时间傅里叶变换的方法

    使用python实现离散时间傅里叶变换的方法

    这篇文章主要介绍了使用python实现离散时间傅里叶变换的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09

最新评论