赞
踩
今天给大家带来的是一个我们从小就玩过的一个小游戏,雷霆战机,我相信很多小伙伴都是玩过的,特别是跟小编一样的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(
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。