导语

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

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

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

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

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

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

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

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

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

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

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

正文

一、原理简介

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

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

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

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

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

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

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

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

型)。

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

三、代码展示

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

1)main.py主程序

from mySprite import *

#  初始化
def init():
    pygame.init()
    global isRun
    isRun = True
    global text_font, over_font, over_render, restar_render, star
    text_font = pygame.font.SysFont('arial', 20)
    over_font = pygame.font.SysFont('arial', 40)
    over_render = over_font.render('Game Over', 1, (255, 20, 20), None)
    restar_render = text_font.render('Press R key for restart game', 1, (80, 209, 80), None)
    star = pygame.image.load('./img/star.png')
    bg0 = Background()
    bg1 = Background(True)
    global back_group, fly, fly_group, score_render, enemy_group, boom_group
    back_group = sprite.Group(bg0, bg1)
    fly = Fly()
    fly_group = sprite.Group(fly)
    score_render = text_font.render(str(fly.score), 1, (172, 209, 204), None)
    enemy_group = sprite.Group()
    boom_group = sprite.Group()
    pygame.time.set_timer(10, 1000)
    pygame.time.set_timer(15, 500)

# 处理事件
def dealEvent():
    GAMECLOCK.tick(70)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            exit()
        if isRun:
            if event.type == 10:
                enemy = Enemy()
                enemy_group.add(enemy)
            elif event.type == 15:
                fly.fire()
    keys_pressed = pygame.key.get_pressed()
    if keys_pressed[pygame.K_r]:
        main_game()
    if keys_pressed[pygame.K_RIGHT]:
        fly.speed = 2
    elif keys_pressed[pygame.K_LEFT]:
        fly.speed = -2
    else:
        fly.speed = 0


#  碰撞检测-精灵组之间的-精灵与精灵组之间的
def checkCollide():
    bullet_shot_enemy = pygame.sprite.groupcollide(fly.bullets, enemy_group, True, True)
    if bullet_shot_enemy:
        pygame.mixer.init()
        for bullet in bullet_shot_enemy:
            rect = bullet.rect
            boom = Boom(rect.centerx, rect.centery)
            boom_group.add(boom)
            pygame.mixer.music.load('./img/bao.mp3')
            pygame.mixer.music.play(1)
            fly.score += 3
            global score_render
            score_render = text_font.render(str(fly.score), 1, (172, 209, 204), None)
    enemies = pygame.sprite.spritecollide(fly, enemy_group, True)
    if enemies:
        global isRun
        isRun = False
        SCREEN.blit(over_render,
                    ((WINDOW.width - over_render.get_width()) / 2,
                     (WINDOW.height - over_render.get_height()) / 2 - 10))
        SCREEN.blit(restar_render, ((WINDOW.width - restar_render.get_width()) / 2,
                                    (WINDOW.height - restar_render.get_height()) / 2 + over_render.get_height()))
        pygame.display.update()

# 精灵绘制更新
def update():
    if isRun:
        back_group.draw(SCREEN)
        back_group.update()
        fly_group.draw(SCREEN)
        fly_group.update()
        fly.bullets.draw(SCREEN)
        fly.bullets.update()
        enemy_group.draw(SCREEN)
        enemy_group.update()
        boom_group.draw(SCREEN)
        boom_group.update()
        boom_group.empty()
        SCREEN.blit(score_render, (WINDOW.width - 60, 20))
        SCREEN.blit(star, (WINDOW.width - 85, 20))
        pygame.display.update()

# 主函数
def main_game():
    init()
    while True:
        dealEvent()
        checkCollide()
        update()

main_game()

2)MySprite.py

import pygame
from pygame import sprite
import random
WINDOW = pygame.Rect(0, 0, 466, 700)
SCREEN = pygame.display.set_mode(WINDOW.size)
pygame.display.set_caption('FlyFight')
GAMECLOCK = pygame.time.Clock()   # 游戏时钟

#我的精灵
class MySprite(sprite.Sprite):
    def __init__(self, img_name, speed=1):
        super().__init__()
        self.image = pygame.image.load(img_name)
        self.rect = self.image.get_rect()
        self.speed = speed

    def update(self):
        self.rect.y += self.speed


#背景精灵
class Background(MySprite):
    def __init__(self, next=False):
        super().__init__('./img/background.png')
        if next:
            self.rect.y = -self.rect.height

    def update(self):
        super().update()
        if self.rect.y >= 700:
            self.rect.y = -self.rect.height

# 子弹精灵
class Bullet(MySprite):
    def __init__(self):
        super().__init__('./img/bullet.png', -2)

    def update(self):
        super().update()
        if self.rect.bottom < 0:
            self.kill()

# 侦察机精灵
class Fly(MySprite):
    def __init__(self):
        super().__init__('./img/fly.png', 0)
        # 设定侦察机的初始位置
        self.rect.centerx = WINDOW.centerx
        self.rect.bottom = WINDOW.bottom-10
        # 定义子弹精灵组
        self.bullets = pygame.sprite.Group()
        self.score = 0

    def update(self):
        self.rect.x += self.speed
        if self.rect.right > WINDOW.width:
            self.rect.right = WINDOW.width
        elif self.rect.x < 0:
            self.rect.x = 0

    def fire(self):
        bullet = Bullet()
        # 设定子弹的初始位置
        bullet.rect.centerx = self.rect.centerx
        bullet.rect.bottom = self.rect.y
        self.bullets.add(bullet)


# 敌机精灵
class Enemy(MySprite):
    def __init__(self):
        super().__init__('./img/enemy.png')
        # 分身秘术,设定速度和位置
        self.speed = random.randint(2, 3)
        self.rect.bottom = 0
        x = WINDOW.width - self.rect.width
        self.rect.x = random.randint(0, x)

    def update(self):
        super().update()
        if self.rect.y >= WINDOW.height:
            self.kill()

# 爆炸效果精灵
class Boom(MySprite):
    def __init__(self, x, y):
        super().__init__('./img/boom.png')
        # 设定爆炸效果的位置
        self.rect.centerx = x
        self.rect.centery = y

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

1)不同的背景

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

2)撞击结束

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

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

​总结

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

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

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

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

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

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

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

🔨推荐往期文章——

项目1.0  超级玛丽

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

项目1.1   扫雷

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

项目1.3  太空机甲游戏

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

项目1.4  水果忍者

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

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

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

🎄文章汇总——

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

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

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

07-20 22:13