导语
哈喽哈喽!下午好~我是木木子。
前面介绍了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 |已有文章汇总 | 持续更新,直接看这篇就够了
(更多内容+源码都在文章汇总哦!!欢迎阅读~)