前言
今天给大家带来的是一个我们从小就玩过的一个小游戏,雷霆战机,我相信很多小伙伴都是玩过的,特别是跟小编一样的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()
#事件监控
def __event_handler(self):
#获取所有按键
keys_pressed