当前位置:   article > 正文

【Python游戏】Python实现一个雷霆战机游戏 | 附带源码_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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • 225
  • 226
  • 227
  • 228
  • 229
  • 230
  • 231
  • 232
  • 233
  • 234
  • 235
  • 236
  • 237
  • 238
  • 239
  • 240
  • 241
  • 242
  • 243
  • 244
  • 245
  • 246
  • 247
  • 248
  • 249
  • 250
  • 251
  • 252
  • 253
  • 254
  • 255
  • 256
  • 257
  • 258
  • 259
  • 260
  • 261
  • 262
  • 263
  • 264
  • 265
  • 266
  • 267
  • 268
  • 269
  • 270
  • 271
  • 272
  • 273

新手上路

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(
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/87540
推荐阅读
相关标签
  

闽ICP备14008679号