导语

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

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

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

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

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

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

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

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

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

正文

一、原理简介

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

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

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

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

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

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

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

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

型)。

三、代码展示

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

1)main.py主程序

from mySprite import *#初始化def init():pygame.init()global isRunisRun = Trueglobal text_font, over_font, over_render, restar_render, startext_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_groupback_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 = 2elif keys_pressed[pygame.K_LEFT]:fly.speed = -2else: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.rectboom = Boom(rect.centerx, rect.centery)boom_group.add(boom)pygame.mixer.music.load('./img/bao.mp3')pygame.mixer.music.play(1)fly.score += 3global score_renderscore_render = text_font.render(str(fly.score), 1, (172, 209, 204), None)enemies = pygame.sprite.spritecollide(fly, enemy_group, True)if enemies:global isRunisRun = FalseSCREEN.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 pygamefrom pygame import spriteimport randomWINDOW = 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 = speeddef 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.heightdef 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  WINDOW.width:self.rect.right = WINDOW.widthelif self.rect.x = WINDOW.height:self.kill()# 爆炸效果精灵class Boom(MySprite):def __init__(self, x, y):super().__init__('./img/boom.png')# 设定爆炸效果的位置self.rect.centerx = xself.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 |已有文章汇总 | 持续更新,直接看这篇就够了

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