导语

不知道红白机上的《魂斗罗》是不是小伙伴儿们小时候的经典回忆呢?反正梦雅那时候貌似是有

的,BUT 女孩子一般是不玩儿这类游戏的!!

(哎呀,梦雅是不是偷偷保住了我年龄的秘密…)⛲⛲

魂斗罗是一款经典动作射击闯关类游戏,在当时的游戏市场上,可以说是一款相当有挑战难度的游戏。毕竟那时候消息闭塞,压根没有攻略之说,更何况那时年少,玩游戏图的是爽快,很多人也不会刻意去深度研究卡位、战斗技巧等,就是最基础的突突突、闪闪闪,于是就有了N种死亡经历。

今天梦雅带大家来看看如何打造Python像素版本的经典游戏——魂斗罗吧!

像素风游戏类型之前也有几款的话比如:《我的世界》、《坦克大战》、《超级马里奥》…可以

看文末的文章汇总哈!往期的资料素材等都在顾木子的主页左侧信息获取哈!

正文

这边是一个简易版本的魂斗罗哈,有大佬自行优化一波!纯分享给大家娱乐。

大家都知道Python版本的游戏编写基本上都是Pygame游戏模块,今天就用的这个哈。

游戏规则:上下左右大家熟悉的——ASDW键,K跳跃,J放枪子儿。

打完一个小兵一个大boss就闯关成功了。嗯哼——超简单,有手就玩得赢的游戏23333!

一、准备中

1)素材准备

像素风格人物人物形象(仅部分)

背景图展示:

主要人物素材:

(部分图)

2)环境安装

这款简易版本的《魂斗罗游戏》木木子环境设置的是:Python3、Pycharm、Pygame部分自带的不说了哈。

模块安装:

pip install -i https://pypi.douban.com/simple/ +模块名

二、正式敲代码

1)游戏敌方boss出场以及定义。

import pygameimport randomfrom pygame.sprite import Spriteimport datetimeclass Game_Boss(Sprite):    def __init__(self,game_settings,screen,player):
super().__init__()
self.pos_i = 0.0
self.pos_j = 0.0
self.pos_k = 0.0
self.game_settings = game_settings
self.screen = screen
self.image = pygame.image.load('图片/boss/left/move/bz1.png')
self.rect = self.image.get_rect()
self.rect.x = self.game_settings.screen_width-self.rect.width
self.rect.bottom = 370
self.x = float(self.rect.x)#敌人的位置
self.speed_factor = self.game_settings.enemy_speed_factor
self.boss_start_Y = 370#开始boss人物的高度
self.boss_Y = self.boss_start_Y
self.attack1_order = 0
self.player = player
self.mx = self.x
def blitme(self):
self.screen.blit(self.image,self.rect)
def update(self):
if self.game_settings.boss_alive:
self.direction()
self.rand_att()
if  self.game_settings.attack_1:
if self.game_settings.boss_direction == 1:
self.attack_1('left')
else:
self.attack_1('right')
elif self.game_settings.attack_2:
if self.game_settings.boss_direction == 1:
self.attack_2('left')
else:
self.attack_2('right')
elif self.game_settings.boss_jump:
self.jump()
elif self.game_settings.boss_run:
if self.game_settings.boss_direction == 1:
self.run('left')
else:
self.run('right')
elif self.player.rect.centerx > self.rect.x:
self.x += self.speed_factor
self.rect.x = self.x
self.move('right')
elif self.player.rect.centerx < self.rect.x:
self.x -= self.speed_factor
self.rect.x = self.x
self.move('left')
else:
self.boom()
self.game_settings.game_win = True
def rand_att(self):
random.seed(datetime.datetime.now())
if self.game_settings.attack_1 == False and self.game_settings.attack_2 == False and self.game_settings.boss_jump == False and self.game_settings.boss_run == False:
self.rand_num = random.randint(1,70)
if self.rand_num == 1:
self.game_settings.attack_1 = True
elif self.rand_num == 2:
self.game_settings.attack_2 = True
elif self.rand_num == 3:
self.game_settings.boss_jump =True
elif self.rand_num == 4:
self.game_settings.boss_run = True
def attack_1(self,direction):
self.rect.bottom = 410#做此动作时人物的位置
self.names1 = locals()
self.players1 = []
for self.j in range(0,34):
self.names1['player_
image%s' %self.j] = pygame.image.load('图片/boss/'+direction+'/attack_1/%s.png' %self.j)          self.players1.append(self.names1['player_image%s' %self.j])
self.image = self.players1[int(self.pos_i)]
self.pos_i += 0.5
if self.pos_i >= 34.0 :#循环完成后:
self.pos_i = 0.0
self.game_settings.attack_1 = False
def attack_2(self,direction):
self.rect.bottom = 355
self.names1 = locals()
self.players1 = []
for self.j in range(0,30):
self.names1['player_image%s' %self.j] = pygame.image.load('图片/boss/'+direction+'/attack_2/%s.png' %self.j)
self.players1.append(self.names1['player_image%s' %self.j])
self.image = self.players1[int(self.pos_i)]
self.pos_i += 0.5
if self.pos_i >= 30:
self.pos_i = 0.0
self.game_settings.attack_2 = False
def move(self,direction):#循环图片
self.rect.bottom = 370
self.names1 = locals()
self.players1 = []
for self.j in range(1,7):
self.names1['player_image%s' %self.j] = pygame.image.load('图片/boss/'+direction+'/move/bz%s.png' %self.j)
self.players1.append(self.names1['player_image%s' %self.j])
self.image = self.players1[int(self.pos_i)]
self.pos_i += 0.1#图片变化速率
if self.pos_i > 6.0:#敌人bag有4个动作
self.pos_i = 0.0
def run(self,direction):
self.rect.bottom = 400
self.names1 = locals()
self.players1 = []
for self.j in range(0,6):
self.names1['player_image%s' %self.j] = pygame.image.load('图片/boss/'+direction+'/run/%s.png' %self.j)
self.players1.append(self.names1['player_image%s' %self.j])
self.image = self.players1[int(self.pos_i)]
self.pos_i += 0.3
if self.pos_i >= 6:
self.pos_i = 0.0
self.game_settings.boss_run = False
if self.player.rect.centerx > self.rect.x :#or self.x < self.mx:
self.x += 6
self.rect.x = self.x
elif self.player.rect.centerx < self.rect.x :#or self.x > self.mx:
self.x -= 6
self.rect.x = self.x
def jump(self):
self.rect.bottom = self.boss_Y
if self.game_settings.boss_jump_vel < 0:
self.game_settings.boss_jump_vel += 0.6#跳跃上升的增加的速率
elif self.game_settings.boss_jump_vel > 0:
self.game_settings.boss_jump_vel += 0.8#跳跃下降增加的速率
self.boss_Y += self.game_settings.boss_jump_vel
if self.boss_Y > self.boss_start_Y:
self.game_settings.boss_jump = False#结束跳跃
self.boss_Y = self.boss_start_Y
self.game_settings.boss_jump_vel = -12.0#恢复跳跃开始的速度
if self.player.rect.centerx > self.rect.x :#or self.x < self.mx:
self.x += self.speed_factor
self.rect.x = self.x
elif self.player.rect.centerx < self.rect.x :#or self.x > self.mx:
self.x -= self.speed_factor
self.rect.x = self.x
self.names1 = locals()
self.players1 = []
for self.j in range(3,10):
self.names1['player_image%s' %self.j] = pygame.image.load('图片/boss/left/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.4#跳跃旋转速率
if self.pos_j >= 7:#跳跃有7个动作
self.pos_j = 0.0
def direction(self):
if self.player.rect.centerx > self.rect.x:
self.game_settings.boss_direction = -1
else:
self.game_settings.boss_direction = 1
def boom(self):
self.names1 = locals()
self.players1 = []
for self.j in range(1,4):
self.names1['player_image%s' %self.j] = pygame.image.load('图片/boss/boom%s.png' %self.j)            self.players1.append(self.names1['player_image%s' %self.j])
self.image = self.players1[int(self.pos_k)]
self.pos_k += 0.05
if self.pos_k >= 3.0:
#self.game_settings.boom_end = True
self.game_settings.boss_boom_end = True

2)玩家定义的子弹设置

import pygamefrom pygame.sprite import Sprite class Bullet(Sprite):
def __init__(self,game_settings,screen,player):
super().__init__()
self.game_settings = game_settings
self.player = player
self.screen = screen
self.image = pygame.image.load('图片/bullet1.png')
self.rect = self.image.get_rect()
self.rect.left = player.rect.right-20#开始子弹默认往右射击
if self.player.player_direction == -1:
self.rect.right = player.rect.left+20
self.rect.centery = player.rect.centery-15
if self.player.player_down:
self.rect.centery = player.rect.centery
#调整子弹位置
if self.player.player_up:
self.rect.bottom = player.rect.top+20
self.x = float(self.rect.x)
self.y = float(self.rect.y)
self.mx = self.x
#mx为保存初始x的坐标
self.my = self.y
self.speed_factor = game_settings.bullet_speed_factor
def update(self):
if self.y<self.my or self.y == self.my and self.x == self.mx and self.player.player_up:
self.y -= self.speed_factor
self.rect.y = self.y
elif self.x < self.mx or self.x == self.mx and self.player.player_direction == -1:
self.x -= self.speed_factor
self.rect.x = self.x
elif self.x>self.mx or self.x == self.mx:#默认为右方向
self.x += self.speed_factor
self.rect.x = self.x
def blit_bullet(self):
self.screen.blit(self.image,self.rect)

3)主程序

'''csdn:顾木子吖'''import pygameimport sysfrom pygame.locals import *from settings import Settingsfrom game_player import Game_Player import game_functions as gffrom pygame.sprite import Groupfrom game_stats import GameStatsfrom game_boss import Game_Bossfrom button import Buttondef run_game():
bg = pygame.image.load("图片/map01.jpeg")
game_settings = Settings()
pos_x = 0#地图移动o
pygame.init()   screen = pygame.display.set_mode(      (game_settings.screen_width,game_settings.screen_height))
pygame.display.set_caption("经典像素风游戏——魂斗罗")
stats = GameStats(game_settings)
player = Game_Player(game_settings,screen)
bullets = Group()
boss = Group()
enemys = Group()
win_button = Button(game_settings,screen,"YOU WIN")
gf.create_legion(game_settings,screen,enemys)
gf.create_boss(game_settings,screen,player,boss)
while True:
pygame.mouse.set_visible(False)
gf.check_events(game_settings,screen,player,bullets)        gf.update_player(game_settings,stats,player,enemys)     gf.update_bullet(game_settings,bullets,screen,enemys,boss)          gf.update_enemys(game_settings,enemys)
gf.update_boss(game_settings,boss)      gf.update_screen(game_settings,bg,pos_x,screen,player,bullets,enemys,boss,win_button)
if player.moving_right and player.center > player.screen_rect.centerx and game_settings.boss_appear == False:
game_settings.screen_rolling = True
pos_x -= 5#屏幕滚动速度
else:
game_settings.screen_rolling = Falserun_game()

****等等等等…游戏代码太多了。

三、效果展示

我的速度调得比较快哈,自己调慢点儿。

1)Part 1 初始化界面♀️

2)Part 2 打BOSS♂️

3)Part 3 胜利

总结

嘿!新一轮的小游戏就写到这里结束啦,如需完整的资料项目点下方链接哦~

我还得想想下一个写什么内容呢——苦思冥想中。你们玩儿,我先撤了。

往期的资料源码素材等私信小编06即可免费拿!

Pygame实战:多年后“魂斗罗”像素风归来 不止是经典与情怀相关推荐

  1. 【Pygame小游戏】魂斗罗经典BOSS都回来了 准备好再次击败他们了吗?(附源码)

    前言

  2. 学习 Python 之 Pygame 开发魂斗罗(八)

    学习 Python 之 Pygame 开发魂斗罗(八) 继续编写魂斗罗 1. 创建敌人类 2. 增加敌人移动和显示函数 3. 敌人开火 4. 修改主函数 5. 产生敌人 6. 使敌人移动 继续编写魂斗 ...

  3. 学习 Python 之 Pygame 开发魂斗罗(十四)

    学习 Python 之 Pygame 开发魂斗罗(十四) 继续编写魂斗罗 1. 创建桥类 2. 在主类中加入一些类变量 3. 显示桥 4. 解决玩家与桥的碰撞体问题 5. 解决敌人与桥的碰撞体问题 继 ...

  4. 学习 Python 之 Pygame 开发魂斗罗(十一)

    学习 Python 之 Pygame 开发魂斗罗(十一) 继续编写魂斗罗 1. 改写主类函数中的代码顺序 2. 修改玩家初始化 3. 显示玩家生命值 4. 设置玩家碰到敌人死亡 5. 设置敌人子弹击中 ...

  5. 超有趣的Python实战:将图片转成像素风!

    之前在交流群有人问过这样一个问题: 当时我介绍了一个名为 Tiler 的 GitHub 开源库.这个 Python 项目很骚气!一秒生成可爱像素风图片! 今天小五就给大家实战演示一下,如何将一个普通表 ...

  6. 学习 Python 之 Pygame 开发魂斗罗(二)

    学习 Python 之 Pygame 开发魂斗罗(二) 魂斗罗的需求 开始编写魂斗罗 1. 搭建主类框架 2. 设置游戏运行遍历和创建窗口 3. 获取窗口中的事件 4. 创建角色 5. 完成角色更新函 ...

  7. 学习 Python 之 Pygame 开发魂斗罗(九)

    学习 Python 之 Pygame 开发魂斗罗(九) 继续编写魂斗罗 1. 在子弹类中修改敌人发射子弹的位置 2. 创建显示敌人子弹的函数 3. 解决敌人不会向下掉落的问题 4. 给敌人碰撞体组增加 ...

  8. 学习 Python 之 Pygame 开发魂斗罗(四)

    学习 Python 之 Pygame 开发魂斗罗(四) 继续编写魂斗罗 1. 创建子弹类 2. 根据玩家方向和状态设置子弹发射的位置 (1). 站立向右发射子弹 (2). 站立向左发射子弹 (3). ...

  9. 学习 Python 之 Pygame 开发魂斗罗(一)

    学习 Python 之 Pygame 开发魂斗罗(一) Pygame 回忆Pygame 1. 使用pygame创建窗口 2. 设置窗口背景颜色 3. 获取窗口中的事件 4. 在窗口中展示图片 (1). ...

最新文章

  1. [NOIP2015]子串
  2. 解决达梦数据库新增大字段报错问题
  3. 解析错误:相邻的JSX元素必须包装在一个封闭标签中
  4. nltk 文本预处理
  5. An overview of gradient descent optimization algorithms
  6. ARP协议SMTP协议MIME
  7. python def函数报错详解_python所有内置函数的定义详解
  8. 有关手游设计ICON的几点建议
  9. 面试官:如何实现 List 集合去重?
  10. 想做大牛,Java开发的必备技术点你了解了吗?
  11. asp.net使用My97 Date Picker时设置默认起始时间为n年之前的今天
  12. 微信小程序template模板 ,提高效率第二篇
  13. 产品配件类目税目分类_商品和服务税收分类编码表-2017版
  14. 如何制作媲美memz的炫酷特效恶搞程序
  15. 不可不知的设计师接活报价公式
  16. 2.数据分析-面板数据变系数模型
  17. matlab画某个变量的全球分布
  18. 【逗老师带你学IT】PRTG安装教程-部署简单功能强大的监控软件
  19. 软件工程与计算II-23-软件工程职业基础
  20. GBase 数据同步工具RTSync

热门文章

  1. kill掉僵尸进程的方法(kill -9 <PPID>)
  2. 友元函数和互为友元类
  3. JQuery实现数据录入表格以及删除与编辑功能
  4. STL容器的emplace操作
  5. 特斯拉改用AMD「全家桶」?AMD 发布3D堆叠技术,明年量产5纳米!
  6. 大二学生HTML期末作业、个人主页网页制作作业
  7. 相机标定和ORBSLAM2/VINS测试
  8. 基于Cortex-A9地铁闸机改造升级解决方案
  9. centos 文档内容编辑命令
  10. sqlyog注释的快捷键-先收藏