• 【Pygame实战】飞机射击大作:宇宙激战一触即发...这款超经典的射击游戏也该拿出来重启了~


    导语

     哈喽哈喽!下午好~我是木木子。

    前面介绍了Python制作的足球比赛、滑雪、魂斗罗、超级玛丽等几十款游戏,效果都还不错,

    反响挺热烈。果然还是游戏比较吸引大家的眼球吖!

    所有文章完整的素材+源码都在👇👇

    粉丝白嫖源码福利,请移步至CSDN社区或文末公众hao即可免费。

    于是今天大家继续来一起学习使用Python制作一款非常好玩有趣科技感十足的游戏:宇宙激战

    太空游戏。既有趣味儿性,又能学习编程,主要是孩子们肯定会喜欢滴~

    游戏玩家将驾驶一艘星际飞船,穿梭于绚丽而斑驳的宇宙之中,面对各种任务与挑战,它能完

    成这次任务嘛?我们不妨来猜猜看或者你能自己试试嘛?!👇让我们进入今天的主题叭!

    💮💮💮💮💮💮💮💮💮💮💮💮💮💮💮💮💮💮💮💮💮💮💮💮💮💮💮

    正文

    一、原理简介

    首先游戏的背景,大家可以看到,有几个需要实现的地方:

    第一是背景,因为游戏的背景是一直在变化的,所以必须是动态的背景;

    第二个是音乐,有子弹击中的音乐,导弹击中和撞击的爆炸音乐;

    第三个是飞船,包括我方主舰、敌方飞船等,另外还有大boss的导弹攻击,我方主舰可以发射

    子弹攻击敌方飞船(击毁一艘敌机三分),也可以撞击敌方飞船,我方主舰一旦被击中或者撞

    击,将扣除一次生命值(这里设置的只有一次可调试),生命值减为0,则Game Over!

    二、素材(图片、音乐等)

    主要有这么几个角色,飞船(包括我方主舰、敌方飞船等不同造型)、子弹、导弹等道具(不同造

    型)。

    三、代码展示

    主要为两块儿py下面都给大家贴出来了哈👇

    1)main.py主程序

    1. from mySprite import *
    2. # 初始化
    3. def init():
    4. pygame.init()
    5. global isRun
    6. isRun = True
    7. global text_font, over_font, over_render, restar_render, star
    8. text_font = pygame.font.SysFont('arial', 20)
    9. over_font = pygame.font.SysFont('arial', 40)
    10. over_render = over_font.render('Game Over', 1, (255, 20, 20), None)
    11. restar_render = text_font.render('Press R key for restart game', 1, (80, 209, 80), None)
    12. star = pygame.image.load('./img/star.png')
    13. bg0 = Background()
    14. bg1 = Background(True)
    15. global back_group, fly, fly_group, score_render, enemy_group, boom_group
    16. back_group = sprite.Group(bg0, bg1)
    17. fly = Fly()
    18. fly_group = sprite.Group(fly)
    19. score_render = text_font.render(str(fly.score), 1, (172, 209, 204), None)
    20. enemy_group = sprite.Group()
    21. boom_group = sprite.Group()
    22. pygame.time.set_timer(10, 1000)
    23. pygame.time.set_timer(15, 500)
    24. # 处理事件
    25. def dealEvent():
    26. GAMECLOCK.tick(70)
    27. for event in pygame.event.get():
    28. if event.type == pygame.QUIT:
    29. exit()
    30. if isRun:
    31. if event.type == 10:
    32. enemy = Enemy()
    33. enemy_group.add(enemy)
    34. elif event.type == 15:
    35. fly.fire()
    36. keys_pressed = pygame.key.get_pressed()
    37. if keys_pressed[pygame.K_r]:
    38. main_game()
    39. if keys_pressed[pygame.K_RIGHT]:
    40. fly.speed = 2
    41. elif keys_pressed[pygame.K_LEFT]:
    42. fly.speed = -2
    43. else:
    44. fly.speed = 0
    45. # 碰撞检测-精灵组之间的-精灵与精灵组之间的
    46. def checkCollide():
    47. bullet_shot_enemy = pygame.sprite.groupcollide(fly.bullets, enemy_group, True, True)
    48. if bullet_shot_enemy:
    49. pygame.mixer.init()
    50. for bullet in bullet_shot_enemy:
    51. rect = bullet.rect
    52. boom = Boom(rect.centerx, rect.centery)
    53. boom_group.add(boom)
    54. pygame.mixer.music.load('./img/bao.mp3')
    55. pygame.mixer.music.play(1)
    56. fly.score += 3
    57. global score_render
    58. score_render = text_font.render(str(fly.score), 1, (172, 209, 204), None)
    59. enemies = pygame.sprite.spritecollide(fly, enemy_group, True)
    60. if enemies:
    61. global isRun
    62. isRun = False
    63. SCREEN.blit(over_render,
    64. ((WINDOW.width - over_render.get_width()) / 2,
    65. (WINDOW.height - over_render.get_height()) / 2 - 10))
    66. SCREEN.blit(restar_render, ((WINDOW.width - restar_render.get_width()) / 2,
    67. (WINDOW.height - restar_render.get_height()) / 2 + over_render.get_height()))
    68. pygame.display.update()
    69. # 精灵绘制更新
    70. def update():
    71. if isRun:
    72. back_group.draw(SCREEN)
    73. back_group.update()
    74. fly_group.draw(SCREEN)
    75. fly_group.update()
    76. fly.bullets.draw(SCREEN)
    77. fly.bullets.update()
    78. enemy_group.draw(SCREEN)
    79. enemy_group.update()
    80. boom_group.draw(SCREEN)
    81. boom_group.update()
    82. boom_group.empty()
    83. SCREEN.blit(score_render, (WINDOW.width - 60, 20))
    84. SCREEN.blit(star, (WINDOW.width - 85, 20))
    85. pygame.display.update()
    86. # 主函数
    87. def main_game():
    88. init()
    89. while True:
    90. dealEvent()
    91. checkCollide()
    92. update()
    93. main_game()

    2)MySprite.py

    1. import pygame
    2. from pygame import sprite
    3. import random
    4. WINDOW = pygame.Rect(0, 0, 466, 700)
    5. SCREEN = pygame.display.set_mode(WINDOW.size)
    6. pygame.display.set_caption('FlyFight')
    7. GAMECLOCK = pygame.time.Clock() # 游戏时钟
    8. #我的精灵
    9. class MySprite(sprite.Sprite):
    10. def __init__(self, img_name, speed=1):
    11. super().__init__()
    12. self.image = pygame.image.load(img_name)
    13. self.rect = self.image.get_rect()
    14. self.speed = speed
    15. def update(self):
    16. self.rect.y += self.speed
    17. #背景精灵
    18. class Background(MySprite):
    19. def __init__(self, next=False):
    20. super().__init__('./img/background.png')
    21. if next:
    22. self.rect.y = -self.rect.height
    23. def update(self):
    24. super().update()
    25. if self.rect.y >= 700:
    26. self.rect.y = -self.rect.height
    27. # 子弹精灵
    28. class Bullet(MySprite):
    29. def __init__(self):
    30. super().__init__('./img/bullet.png', -2)
    31. def update(self):
    32. super().update()
    33. if self.rect.bottom < 0:
    34. self.kill()
    35. # 侦察机精灵
    36. class Fly(MySprite):
    37. def __init__(self):
    38. super().__init__('./img/fly.png', 0)
    39. # 设定侦察机的初始位置
    40. self.rect.centerx = WINDOW.centerx
    41. self.rect.bottom = WINDOW.bottom-10
    42. # 定义子弹精灵组
    43. self.bullets = pygame.sprite.Group()
    44. self.score = 0
    45. def update(self):
    46. self.rect.x += self.speed
    47. if self.rect.right > WINDOW.width:
    48. self.rect.right = WINDOW.width
    49. elif self.rect.x < 0:
    50. self.rect.x = 0
    51. def fire(self):
    52. bullet = Bullet()
    53. # 设定子弹的初始位置
    54. bullet.rect.centerx = self.rect.centerx
    55. bullet.rect.bottom = self.rect.y
    56. self.bullets.add(bullet)
    57. # 敌机精灵
    58. class Enemy(MySprite):
    59. def __init__(self):
    60. super().__init__('./img/enemy.png')
    61. # 分身秘术,设定速度和位置
    62. self.speed = random.randint(2, 3)
    63. self.rect.bottom = 0
    64. x = WINDOW.width - self.rect.width
    65. self.rect.x = random.randint(0, x)
    66. def update(self):
    67. super().update()
    68. if self.rect.y >= WINDOW.height:
    69. self.kill()
    70. # 爆炸效果精灵
    71. class Boom(MySprite):
    72. def __init__(self, x, y):
    73. super().__init__('./img/boom.png')
    74. # 设定爆炸效果的位置
    75. self.rect.centerx = x
    76. self.rect.centery = y

    四、效果展示

    1)不同的背景

    2)撞击结束

    游戏规则:方向键左右即可移动,R重玩。

    ​总结

    💮💮💮💮💮💮💮💮💮💮💮💮💮💮💮💮💮💮💮💮💮💮💮💮💮💮💮

    游戏倒计时三秒内上线的消息,我知道🤭栗子知道🤭木子知道🤭梨子知道🤭

    顾木子知道🤭你是在等以上人员全部进场完毕,你才知道你才进的吗?🐷🐷🐷

    【元宇宙星际宇宙激战小游戏正式开服】…………万倍启航(宣)💮💮💮

    智行易经暗合道,所言非虚皆应验。实话实说我不懂,就是无我误入道。

    赶紧找我拿素材源码试试叭!我在十万火急处等你啦👇👇👇👇👇👇

    🎯完整的免费源码领取处:找我吖!文末公众hao可自行领取,滴滴我也可!

    🔨推荐往期文章——

    项目1.0  超级玛丽

    程序员自制游戏:超级玛丽100%真实版,能把你玩哭了~【附源码】

    项目1.1   扫雷

     Pygame实战:据说这是史上最难扫雷游戏,没有之一,你们感受下......

    项目1.3  太空机甲游戏

    Pygame实战:牛,几千行代码实现《机甲闯关冒险游戏》,太牛了(保存起来慢慢学)

    项目1.4  水果忍者

    【Pygame实战】风靡全球的切水果游戏升级版“水果忍者”上线啦,你敢来PK嘛?

    项目2.0  联网、人机一体五子棋游戏

    Pygame实战:下五子棋吗?信不信我让你几步你也赢不了?

    🎄文章汇总——

    项目1.0 Python—2021 |已有文章汇总 | 持续更新,直接看这篇就够了

    (更多内容+源码都在文章汇总哦!!欢迎阅读~)

  • 相关阅读:
    内存学习(3):DRAM的基础存储结构(存储层级、读写过程,刷新与暂存)
    深度解读昇腾CANN多流并行技术,提高硬件资源利用率
    CSS 渐变彩色字体
    Shell命令笔记2
    docker compose搭建elasticsearch7集群
    《打造高可用PostgreSQL:策略与工具》
    第十五届蓝桥杯省赛第二场C/C++B组A题【进制】题解(AC)
    中集集团全球港航人工智能高科技独角兽中集飞瞳贯彻国家关于世界一流水平的超大型智能港口,全球顶尖AI核心技术超一流智能港口解决方案
    string类的模拟实现
    ​企业该如何做好源代码防泄密工作
  • 原文地址:https://blog.csdn.net/weixin_55822277/article/details/125751709