【Python游戏】Python实现一个雷霆战机游戏 | 附带源码

前言

今天给大家带来的是一个我们从小就玩过的一个小游戏,雷霆战机,我相信很多小伙伴都是玩过的,特别是跟小编一样的90的小伙伴,还记得之前为了玩这个游戏,可以在网吧打开电脑直接4399,哈哈,也是一段美好的回忆~
现在自己做出来的时候还是觉得挺有成就感的,比较可以自由自在的玩啦!

相关文件

想学Python的小伙伴可以关注小编的公众号【Python日志】
有很多的资源可以白嫖的哈,不定时会更新一下Python的小知识的哈!!
需要源码的小伙伴可以在公众号回复雷霆战机
Python源码、问题解答学习交流群:773162165

开发环境

Python版本:3.6.7
相关模块:
pygame

以及一些python自带的模块。

环境搭建

安装Python并添加到环境变量,pip安装需要的相关模块即可。

效果展示

视频展示

Python实现一款90后的回忆小游戏——雷霆战机

图片展示
在这里插入图片描述
选择难度
在这里插入图片描述
新手上路(简单)
在这里插入图片描述
冰火试炼(一般)
在这里插入图片描述
生而为王(困难)
在这里插入图片描述

代码实现过程

主要代码

import pygame
import plane_main_1, plane_main_2, plane_main_3

#记得改标题
#屏幕的大小
SCREEN_RECT = pygame.Rect(0, 0, 573, 753)

class Menu(object):
    """每个页面的父类"""

    def __init__(self, image, music):

        #设置背景音乐
        pygame.mixer.music.load(music)
        pygame.mixer.music.set_volume(0.4)
        pygame.mixer.music.play(-1)

        #设置屏幕大小
        self.screen = pygame.display.set_mode(SCREEN_RECT.size)
        #设置标题
        pygame.display.set_caption("雷霆战机 公众号:Python日志  学习交流群:773162165")
        #加载传入的图片并获取位置大小
        self.image = pygame.image.load(image)
        self.rect = self.image.get_rect()

    def event(self):
        #遍历所有事件
        for event in pygame.event.get():
            #点击游戏右上角的×关闭游戏
            if event.type == pygame.QUIT:
                pygame.quit()
                exit()
            #按下Esc键关闭游戏
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_ESCAPE:
                    pygame.quit()
                    exit()

        #获取鼠标是否点击和位置
        self.mouse_press = pygame.mouse.get_pressed()
        self.mouse_pos = pygame.mouse.get_pos()

    @staticmethod
    def clicks():
        #点击按钮时播放声音
        pygame.mixer.music.load("./music/mouse.mp3")
        #设置声音大小
        pygame.mixer.music.set_volume(0.5)
        #0为不循环播放,start为从音频的什么时候开始。
        pygame.mixer.music.play(loops=0, start=0.5)
        #500毫秒的时间慢慢退出
        pygame.mixer.music.fadeout(500)


class MainMenu(Menu):
    """游戏主菜单"""

    def __init__(self):
        #加载背景音乐和图片
        music = "./music/menu1.mp3"
        image = "./images/background2.png"
        super().__init__(image, music)

    def update_menu(self):

        while True:

            #调用父类的事件方法
            super().event()

            #加载按钮并获取位置
            start = pygame.image.load("./images/start1.png")
            start_rect = start.get_rect()
            rule = pygame.image.load("./images/rule1.png")
            rule_rect = rule.get_rect()

            # 开始键和查看键位置定位
            start_rect.centerx = SCREEN_RECT.centerx
            start_rect.y = SCREEN_RECT.height * 0.3
            rule_rect.centerx = SCREEN_RECT.centerx
            rule_rect.y = SCREEN_RECT.height * 0.45

            #判断鼠标的横纵坐标是否在按钮图片范围内
            if (start_rect.left < self.mouse_pos[0] < start_rect.right) and (
                            start_rect.top < self.mouse_pos[1] < start_rect.bottom):
                #在图片范围内则更换图片
                start = pygame.image.load("./images/start2.png")
                #按下鼠标左键,触发父类的私有方法发出鼠标声,并跳转页面
                if self.mouse_press[0]:
                    Menu.clicks()
                    GameType().update_menu()

            if (rule_rect.left < self.mouse_pos[0] < rule_rect.right) and (
                            rule_rect.top < self.mouse_pos[1] < rule_rect.bottom):
                rule = pygame.image.load("./images/rule2.png")
                if self.mouse_press[0]:
                    Menu.clicks()
                    RuleMenu().update_menu()

            #更新背景、开始按钮、规则按钮
            self.screen.blit(self.image, self.rect)
            self.screen.blit(start, start_rect)
            self.screen.blit(rule, rule_rect)
            pygame.display.update()


class GameType(Menu):
    """游戏模式选择"""

    def __init__(self):
        music = "./music/type1.mp3"
        image = "./images/background4.png"
        super().__init__(image, music)

    def update_menu(self):

        while True:

            super().event()

            type1 = pygame.image.load("./images/first1.png")
            type1_rect = type1.get_rect()
            type2 = pygame.image.load("./images/second1.png")
            type2_rect = type2.get_rect()
            type3 = pygame.image.load("./images/third1.png")
            type3_rect = type3.get_rect()
            return_picture = pygame.image.load("./images/return5.png")
            return_rect = return_picture.get_rect()

            type1_rect.centerx = SCREEN_RECT.centerx
            type1_rect.y = SCREEN_RECT.height * 0.15
            type2_rect.centerx = type1_rect.centerx
            type2_rect.y = SCREEN_RECT.height * 0.3
            type3_rect.centerx = SCREEN_RECT.centerx
            type3_rect.y = SCREEN_RECT.height * 0.45
            return_rect.x = 10
            return_rect.y = 10

            #调用自己的静态私有方法获取记录
            record1 = self.__record(str(1))
            record2 = self.__record(str(2))

            # 开始模式一
            if (type1_rect.left < self.mouse_pos[0] < type1_rect.right) and (
                            type1_rect.top < self.mouse_pos[1] < type1_rect.bottom):
                type1 = pygame.image.load("./images/first2.png")
                if self.mouse_press[0]:
                    Menu.clicks()
                    plane_main_1.Game().start_game()

            #开始模式二
            if (type2_rect.left < self.mouse_pos[0] < type2_rect.right) and (
                            type2_rect.top < self.mouse_pos[1] < type2_rect.bottom):
                type2 = pygame.image.load("./images/second2.png")
                if self.mouse_press[0]:
                    Menu.clicks()
                    #用获取的记录判断能否开启游戏关卡
                    if 0 <= int(record1) <= 3:
                        plane_main_2.Game().start_game()
                    else:
                        #不可以则调用禁止类的,显示禁止页面
                        ProhibitMenu().update_menu()

            #开始模式三
            if (type3_rect.left < self.mouse_pos[0] < type3_rect.right) and (
                            type3_rect.top < self.mouse_pos[1] < type3_rect.bottom):
                type3 = pygame.image.load("./images/third2.png")
                if self.mouse_press[0]:
                    Menu.clicks()
                    if 0 <= int(record2) <= 3:
                        plane_main_3.Game().start_game()
                    else:
                        ProhibitMenu().update_menu()

            if return_rect.left < self.mouse_pos[0] < return_rect.right and (
                            return_rect.top < self.mouse_pos[1] < return_rect.bottom):
                return_picture = pygame.image.load("./images/return6.png")
                if self.mouse_press[0]:
                    Menu.clicks()
                    MainMenu().update_menu()

            self.screen.blit(self.image, self.rect)
            self.screen.blit(type1, type1_rect)
            self.screen.blit(type2, type2_rect)
            self.screen.blit(type3, type3_rect)
            self.screen.blit(return_picture, return_rect)
            pygame.display.update()

    @staticmethod
    def __record(num):
        #获取记录
        file = open("./text/c"+ num +".txt", "r")
        text = file.read()
        file.close()
        #返回记录
        if len(text) == 0:
            return 4
        else:
            return chr(int(text))


class RuleMenu(Menu):
    """游戏规则页面"""

    def __init__(self):

        music = "./music/rule1.mp3"
        image = "./images/background3.png"
        super().__init__(image, music)

    def update_menu(self):

        while True:
            super().event()

            return_picture = pygame.image.load("./images/return5.png")
            return_rect = return_picture.get_rect()

            return_rect.x = 10
            return_rect.y = 10

            if return_rect.left < self.mouse_pos[0] < return_rect.right and (
                            return_rect.top < self.mouse_pos[1] < return_rect.bottom):
                return_picture = pygame.image.load("./images/return6.png")

                if self.mouse_press[0]:
                    Menu.clicks()
                    MainMenu().update_menu()

            self.screen.blit(self.image, self.rect)
            self.screen.blit(return_picture, return_rect)
            pygame.display.update()


class ProhibitMenu(Menu):
    """禁止进入类"""

    def __init__(self):

        music = "./music/prohibit.mp3"
        image = "./images/prohibit.png"
        super().__init__(image, music)

    def update_menu(self):

        while True:

            super().event()

            return_picture = pygame.image.load("./images/return5.png")
            return_rect = return_picture.get_rect()

            return_rect.x= 10
            return_rect.y = 10

            if return_rect.left < self.mouse_pos[0] < return_rect.right and (
                            return_rect.top < self.mouse_pos[1] < return_rect.bottom):
                return_picture = pygame.image.load("./images/return6.png")
                if self.mouse_press[0]:
                    Menu.clicks()
                    GameType().update_menu()

            self.screen.blit(self.image, self.rect)
            self.screen.blit(return_picture, return_rect)
            pygame.display.update()

#开始
if __name__ == '__main__':
    #初始化pygame
    pygame.init()
    #初始化背景音乐播放器
    pygame.mixer.init()
    MainMenu().update_menu()

新手上路

import pygame
import main
#from main import MainMenu
#调用时MainMenu().update_menu()
#如果重名了可以用form mian import ManinMenu as z
#调用时z().方法名
from sprites_1 import *

#敌机出现事件
CREATE_ENEMY_EVENT = pygame.USEREVENT
#队友出现事件
CREATE_TEAMMATE_EVENT = pygame.USEREVENT + 1
#boss发射子弹
BOSS_FIRE_EVENT = pygame.USEREVENT + 2

#英雄移动速度
HERO_MOVE_SPEED = 3
#发射子弹间隔
HERO_FIRE_SPACE = 25
#boss子弹发射时间间隔
BOSS_SHOOT = 4000
#创建敌机时间间隔
ENEMY_HAPPEN_TIME = 3000
#创建队友时间间隔
TEAMMATE_HAPPEN = 6000
#游戏帧数
RATE = 100


class Game(object):
    """主程序"""

    #初始化
    def __init__(self, ):
        #背景音乐
        pygame.mixer.init()
        self.music = "./music/play1.mp3"
        pygame.mixer.music.load(self.music)
        pygame.mixer.music.set_volume(0.3)
        pygame.mixer.music.play(-1)

        #屏幕大小和标题
        self.screen = pygame.display.set_mode(SCREEN_RECT.size)
        pygame.display.set_caption("新手上路 公众号:Python日志  学习交流群:773162165")

        #设置两种字体
        self.font1 = pygame.font.Font("./font/STXINWEI.TTF", 25)
        self.font2 = pygame.font.Font("./font/STXINWEI.TTF", 50)

        #设置游戏时钟
        self.clock = pygame.time.Clock()
        #记录友军死亡数
        self.score = 0
        #判断游戏是否能赢
        self.is_win = True

        self.__create_sprites()
        #调用函数返回历史记录
        self.history_score = Game.__record()
        Game.__create_event()

    #创建精灵组
    def __create_sprites(self):
        #背景精灵组
        self.back_group = pygame.sprite.Group(Background(), Background(True))

        #英雄精灵;英雄和队友精灵组
        self.hero = Hero()
        self.hero_group = pygame.sprite.Group(self.hero)
        self.teammate_group = pygame.sprite.Group()

        #boss精灵;boss和敌人精灵组
        self.boss = EnemyBoss()
        self.boss_group = pygame.sprite.Group(self.boss)
        self.enemy_group = pygame.sprite.Group()

        #爆炸精灵组
        self.destroy_group = pygame.sprite.Group()

    #创建事件
    @staticmethod
    def __create_event():

        #创建敌机时间间隔
        pygame.time.set_timer(CREATE_ENEMY_EVENT, ENEMY_HAPPEN_TIME)
        #创建队友时间间隔
        pygame.time.set_timer(CREATE_TEAMMATE_EVENT, TEAMMATE_HAPPEN)
        #boss子弹发射时间间隔
        pygame.time.set_timer(BOSS_FIRE_EVENT, BOSS_SHOOT)

    #英雄血条显示
    def hero_blood(self, life = 3):
        if life == 3:
            blood1 = pygame.image.load("./images/blood1.png")
        elif life == 2:
            blood1 = pygame.image.load("./images/blood2.png")
        elif life == 1:
            blood1 = pygame.image.load("./images/blood3.png")
        else:
            blood1 = pygame.image.load("./images/blood4.png")
        blood1_rect = blood1.get_rect()
        blood1_rect.right = SCREEN_RECT.right
        blood1_rect.bottom = SCREEN_RECT.height - 10
        self.screen.blit(blood1, blood1_rect)

    #boss血条显示
    def boss_blood(self, life):
        if life == 0:
            blood2 = pygame.image.load("./images/bbl1.png")
        elif life >= 30:
            blood2 = pygame.image.load("./images/bbl11.png")
        else:
            num = life // 3 + 2
            blood2 = pygame.image.load("./images/bbl" + str(num) + ".png")
        blood2_rect = blood2.get_rect()
        blood2_rect.centerx = SCREEN_RECT.centerx
        blood2_rect.bottom = SCREEN_RECT.top + 30
        self.screen.blit(blood2, blood2_rect)

    #开始游戏
    def start_game(self):

        while True:
            #设置帧数
            self.clock.tick(RATE)

            self.__event_handler()
            self.__update_sprites()
            self.__collide_check()

            #在屏幕上输出数据
            self.print_text(10, 0,
                            "历史最低伤亡:%s" % self.history_score)

            #输出英雄生命值
            self.hero_blood(self.hero.life)

            #计算boss总血量
            boss_all_life = self.boss.life + EnemyBoss.enemy_die
            if boss_all_life <= 0:
                boss_all_life = 0
            if self.boss.rect.top >= SCREEN_RECT.top + 0.5 * self.boss.rect.height:
                self.boss_blood(boss_all_life)
            self.print_text(SCREEN_RECT.width - 190, 0,
                            "BOSS生命值×{:.0f}".format(boss_all_life))
            self.print_text(SCREEN_RECT.width - 150, 30,
                            "友军阵亡:{:.0f}".format(self.score))

            #更新屏幕
            pygame.display.update(
  • 17
    点赞
  • 85
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值