当前位置:网站首页>【Pygame实战】飞机射击大作:宇宙激战一触即发...这款超经典的射击游戏也该拿出来重启了~
【Pygame实战】飞机射击大作:宇宙激战一触即发...这款超经典的射击游戏也该拿出来重启了~
2022-07-23 10:40:00 【顾木子吖】
导语
哈喽哈喽!下午好~我是木木子。
前面介绍了Python制作的足球比赛、滑雪、魂斗罗、超级玛丽等几十款游戏,效果都还不错,
反响挺热烈。果然还是游戏比较吸引大家的眼球吖!
所有文章完整的素材+源码都在
粉丝白嫖源码福利,请移步至CSDN社区或文末公众hao即可免费。

于是今天大家继续来一起学习使用Python制作一款非常好玩有趣科技感十足的游戏:宇宙激战
太空游戏。既有趣味儿性,又能学习编程,主要是孩子们肯定会喜欢滴~
游戏玩家将驾驶一艘星际飞船,穿梭于绚丽而斑驳的宇宙之中,面对各种任务与挑战,它能完
成这次任务嘛?我们不妨来猜猜看或者你能自己试试嘛?!让我们进入今天的主题叭!
正文
一、原理简介
首先游戏的背景,大家可以看到,有几个需要实现的地方:
第一是背景,因为游戏的背景是一直在变化的,所以必须是动态的背景;
第二个是音乐,有子弹击中的音乐,导弹击中和撞击的爆炸音乐;
第三个是飞船,包括我方主舰、敌方飞船等,另外还有大boss的导弹攻击,我方主舰可以发射
子弹攻击敌方飞船(击毁一艘敌机三分),也可以撞击敌方飞船,我方主舰一旦被击中或者撞
击,将扣除一次生命值(这里设置的只有一次可调试),生命值减为0,则Game Over!
二、素材(图片、音乐等)
主要有这么几个角色,飞船(包括我方主舰、敌方飞船等不同造型)、子弹、导弹等道具(不同造
型)。

三、代码展示
主要为两块儿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
四、效果展示
1)不同的背景

2)撞击结束
游戏规则:方向键左右即可移动,R重玩。

总结
游戏倒计时三秒内上线的消息,我知道🤭栗子知道🤭木子知道🤭梨子知道🤭
顾木子知道🤭你是在等以上人员全部进场完毕,你才知道你才进的吗?
【元宇宙星际宇宙激战小游戏正式开服】…………万倍启航(宣)
智行易经暗合道,所言非虚皆应验。实话实说我不懂,就是无我误入道。
赶紧找我拿素材源码试试叭!我在十万火急处等你啦
完整的免费源码领取处:找我吖!文末公众hao可自行领取,滴滴我也可!
推荐往期文章——
项目1.0 超级玛丽
程序员自制游戏:超级玛丽100%真实版,能把你玩哭了~【附源码】
项目1.1 扫雷
Pygame实战:据说这是史上最难扫雷游戏,没有之一,你们感受下......
项目1.3 太空机甲游戏
Pygame实战:牛,几千行代码实现《机甲闯关冒险游戏》,太牛了(保存起来慢慢学)
项目1.4 水果忍者
【Pygame实战】风靡全球的切水果游戏升级版“水果忍者”上线啦,你敢来PK嘛?
项目2.0 联网、人机一体五子棋游戏
文章汇总——
项目1.0 Python—2021 |已有文章汇总 | 持续更新,直接看这篇就够了
(更多内容+源码都在文章汇总哦!!欢迎阅读~)

边栏推荐
- supervisord安装使用
- Error | cannot read property '_ normalized‘ of undefined
- Redis | 非常重要的中间件
- The exclamation point of vscode +tab shortcut key cannot be used, and the solution to the problem of a-soul-live2d plug-in
- Kettle實現共享數據庫連接及插入更新組件實例
- AVX指令集加速矩阵乘法
- 修改ssh命令行[[email protected]]#颜色
- Leetcode: 17. letter combination of phone number
- Shell脚本案例---3
- [heuristic divide and conquer] the inverse idea of heuristic merging
猜你喜欢
随机推荐
uniapp实现横向点击滑动菜单
supervisord安装使用
百度工程师眼中的云原生可观测性追踪技术
查找论文源代码
基於matlab的CBOC信號調制解調仿真,輸出其相關性,功率譜以及頻偏跟踪
用FFT加速特殊矩阵的矩阵向量乘运算
VSCode 更新後與tab相關快捷鍵無法使用
Live classroom system 01 database table design
Deep learning single image 3D face reconstruction
[heuristic divide and conquer] the inverse idea of heuristic merging
leetcode-设置交集大小至少为2
Les raccourcis clavier liés à l'onglet ne peuvent pas être utilisés après la mise à jour du vscode
基于matlab的BOC调制解调的同步性能仿真,输出跟踪曲线以及不同超前滞后码距下的鉴别曲线
numpy和pytorch的版本对应关系
bgp选路原则
Simulink simulation of ESP three-phase SVPWM controller
[solve the exception] Flink uploads the jar package to the cluster environment, and the operation report does not serialize the exception
Full backpack!
深度学习单图三维人脸重建
Kettle implémente une connexion de base de données partagée et insère une instance de composant de mise à jour



![[untitled]](/img/6c/df2ebb3e39d1e47b8dd74cfdddbb06.gif)





