1、问题与背景(描述程序所要解决的问题或应用背景)
本程序设计了一个小游戏,能够进行简单的飞机大战游戏操作。 |
2、开发工具(列出所使用的开发工具和第3方开发库)
开发工具:Pycharm 第三方库:pygame |
3、主要功能(详细说明程序的功能)
首先运行程序后先进入主界面,主界面中你可以在“帮助”栏中找到有关于游戏的帮助信息——即如何操作。可以选择难度模式,共有四种难度模式提供选择。选择好模式后就可以进入游戏(若不选择模式,则默认选择第一级难度),也可以退出游戏。 之后你可以正式进入游戏,开始进行飞机大战。若杀死对方BOSS,则游戏获胜,若敌机或BOSS的子弹触碰到你的战机则游戏结束。中途你若想暂停游戏,你可以点击暂停按钮。 |
4、设计内容(详细描述解决问题的原理和方法、算法、数据结构等)
1.主界面设计:首先,对主界面进行设计,所有的设计都是在PlaneGame类体中实现的:主界面设计由_init_()函数实现,这个函数中首先创建了游戏窗口并加载了各种各样的游戏UI元素,这些UI元素在pygame模块中被称为精灵,为了方便编程,将这些精灵都放在plane_sprite.py文件中的Mune类和Gamepicture类中,之后开始设置各种游戏的属性和全局变量,这些全局变量影响着敌机的出现频率,敌机的速度,BOSS的子弹的速度,数量,自己战机的火力,触发BOSS出现时的敌机击杀次数,BOSS死亡时的中弹数等。最后,该函数播放了背景音乐,设置了时间事件。此外,应注意到有很多函数在循环外部已经被定义了:如start_game函数,__create_sprite函数,__event_hander函数,__check_collide函数,__update_sprite函数。 2.开始游戏后对游戏中各个精灵的控制:首先,要创建精灵类,这个任务在plane_sprite.py中实现,本游戏中的精灵为敌方战机精灵,己方战机,对方BOSS,以及敌我双方的子弹等。对精灵的移动控制程序主要在各个精灵类的update函数中得以实现,值得注意的是子弹精灵组的创建和子弹对象的创建是在hero-fighter,Boss两个类的__init__函数和fire函数中进行的,这样的操作充分体现了面向对象的编程思想。(因为子弹的各种动作是由战机,BOSS发出的)。而对于精灵的碰撞检测则主要在__check_collide函数来实现。一旦敌机碰撞到己方战机,则游戏结束。 |
5、程序文件与工程名称(标出程序中所有文件名、工程名称及其说明)
1.plane_main.py 2.plane_sprite.py |
6、函数模块(程序中各个函数的原型声明及其说明)
1.plane_main.py文件下的函数模块: 1. __init__函数:无参数,该函数的作用:初始化主界面,设置整个游戏的属性和初值,设置三个事件的时钟,初始化音乐模块并播放背景音乐,并在while循环中将UI素材展现出来,并且进行鼠标按下时的位置判断,以设置各种游戏的值,从而进入相对于的游戏模式中。 2. __create_sprite函数:无参数,作用:创建游戏中的敌机精灵,己方战机精灵等。 3. start_game函数:无参数,作用:若已初始化过一次,则调用初始化函数,在循环中则不断地调用__create_sprite,__event_handler,check_collide函数。并且判断己方飞机的击杀次数,和BOSS中弹的次数是否足以触发BOSS的出现和BOSS的死亡。 4. __event_handler,为事件处理函数。即处理__init__函数中设置的三个时间事件和退出事件。判断游戏暂停并点击鼠标时光标的位置。在玩家按下上下左右键时,将己方战机的X和Y位置信息进行修改。 5. __Check_collide函数:进行碰撞检测。 2. plane_sprite.py文件下的函数模块: 实际上,plane_sprite.py中的各种类具有 高度的统一性:基本上都有__init__和update函数,由于这个文件中的类都是精灵类,所以__init__函数中进行属性设置时都有image,speed,rect这几个属性的设置内容,而update函数中则是对图像精灵的移动做处理,即更新精灵的位置坐标。该文件比较特殊的函数有1个:即fire函数,该函数在hero_fighter类和Boss类中大同小异,作用都是创建并设置子弹对象,再将其加入到精灵组中。 |
7、使用说明(运行程序的小型说明书)
1. 由于PS软件的局限性,在进行碰撞检测时,该程序无法真正做到只差一点距离时就会产生碰撞,实际上,由于画布无法紧贴在图像表面,很多时候,只要敌机或子弹出现在己方战机附近,就会被判定为碰撞了。这是这个小游戏的一点缺憾。 2.游戏运行结束时,出现“libpng warning: iCCP: known incorrect sRGB profile”的警告,这个警告来自于 libpng 库,它表示在读取图片时发现了一个不正确的 sRGB 颜色空间配置文件。这个警告并不会影响图片的显示,也不会影响游戏的运行,所以可以不必管他。 |
8、程序开发总结(简要叙述编写本作业的收获与思考)
1.对于游戏开发,具备面向对象的编程思想非常重要,并且,选择一个合适的外部库非常关键。它能为你提供大量简单易上手的函数和类。为你省下大量的精力和时间。如本次作业中的pygame库中的精灵类,其类中的函数能实现碰撞检测,图像移动,增添精灵等功能,为该程序的编写省下的大量的时间与精力。 2.在进行较长程序的编写的时候,对程序的模块化设计显得非常重要,模块化后的程序,即使在某个测试阶段出现问题也不需要对整个代码进行改动,非常的方便。 3.在对界面进行设计时,while循环搭配break发挥了巨大的作用。最初,我在进行游戏的界面设计时,为了实现不同界面之间的切换,我老是想使用goto语句,但是goto语句是一个以及被编程界放弃的语句。在思考了许久后,我才发现,while循环搭配break也能达到与goto语句类似的效果。这是我本次程序开发最大的一点收获。 |
9、运行截图(附上程序运行的截图画面,至少有1幅,截图越翔实得分越高)
Windows中抓取当前活动窗口:Alt + Print Screen,抓取全屏:Print Screen。或者使用HyperSnap等软件(百度搜索)。
刚进入游戏是的主界面,可以看到有help,开始游戏,结束游戏,模式选择可以选择点击。
在点击help按钮后,会将游戏如何操作,玩法信息显示出来。
进入游戏,若想中途暂停游戏,可以点击右上方的暂停按钮实现暂停。暂停后可以选择进行游戏,也可以选择回到主界面,或者直接退出游戏。
在击杀小飞机数量达到一定数量后,会触发BOSS的出现,当你把BOSS的血条打没了后你就取得了胜利。注意不要被敌机或子弹击中自己。
10.相关图片,音频等文件见网盘资源分享:
通过网盘分享的文件:PythonHomework.zip
链接: https://pan.baidu.com/s/1KSQ_00l0FnUXO0ae_fdjew?pwd=1111 提取码: 1111
11、源程序
1. plane_main.py
import time
import sys
import warnings
from PIL import Image
import random
import pygame
from plane_sprite import *
warnings.filterwarnings("ignore", category=UserWarning, message=".*?incorrect sRGB profile.*?")
class PlaneGame(object ):
def __init__(self):
#iint函数在调用者个类的对象是就会被自动执行,不需要手动调用。
#初始化界面包括了:帮助,模式选择,开始,结束退出UI元素
self.mune = Mune()
self.screen1 = pygame.display.set_mode(SCREEN.size)
self.screen1.blit(self.mune.Mune, (0, 0))
self.screen1.blit(self.mune.key_start, (0, 800))
self.screen1.blit(self.mune.key_end, (1639, 800))
self .screen1 .blit(self .mune .key_help ,(0,0))
self .screen1 .blit(self .mune .easy_mode ,(90,200))
self .screen1 .blit(self .mune .medium_hard ,(570,200))
self .screen1 .blit(self .mune .hard ,(1050,200))
self .screen1 .blit(self .mune .super_hard ,(1500,200))
#下面是整个游戏的属性及其初值。
self .Continue_label=0
self .backtohome_label=0
self .startgame_label_in_circle=0
self .init_time=0
self .exit_label=0
self .help_back_label=0########
pygame.display.update()
#开始游戏的标签
self .start_game_label=0
#设置击杀次数,达到击杀次数后BOSS出现
self .kill_times=5
self .collide_boos_times=0
#用于记录BOSS飞机被击中的次数。
self .shoot_count=0
#用于记录是否胜出。
self .win_label=0
#游戏初始化时的各种设置。
self .ENEMY_INTERVAL=480
self .ENEMY_FIRE_INTERVAL=180
self .KILL_TIMES=20
self .COLLIDE_BOOS_TIMES=3000
self .SHOOT_TIMES=20
self .HERO_BULLET_INTERVAL=400
self .show=0
self .dazhao=0
self.enemy_blood = self.COLLIDE_BOOS_TIMES / self.SHOOT_TIMES
self.clock = pygame.time.Clock() # 括号的的参数是一个元组,以符合函数传参的要求。
#在初始化阶段创建精灵组。
self.__create_sprite()
#设置三个事件的时钟。
pygame.time.set_timer(ENEMY_FIGHTER, self.ENEMY_INTERVAL)
pygame.time.set_timer(HERO_FIRE_BULLET, self.HERO_BULLET_INTERVAL)
pygame.time.set_timer(ENEMY_FIRE_BULLET, self.ENEMY_FIRE_INTERVAL)
self.hero.bullets_group = pygame.sprite.Group()
self.Enemy_boss.bullets_group = pygame.sprite.Group()
#初始化音乐播放模块,并创建两个音乐播放的声道。
pygame.mixer.init()
self.bjmusic = pygame.mixer.Sound(r"Dynamedion .mp3 ")
self.boommusic = pygame.mixer.Sound(r"baozha_sound.wav ")
self.chan1 = pygame.mixer.Channel(0)
self.chan2 = pygame.mixer.Channel(1)
self.chan1.play(self.bjmusic, loops=time.gmtime()[0])
#开始游戏循环
while True:
if self.show ==1:
self.screen1 = pygame.display.set_mode(SCREEN.size)
self.screen1.blit(self.mune.Mune, (0, 0))
self.screen1.blit(self.mune.key_start, (0, 800))
self.screen1.blit(self.mune.key_end, (1639, 800))
self.screen1.blit(self.mune.key_help, (0, 0))
self.screen1.blit(self.mune.easy_mode, (90, 200))
self.screen1.blit(self.mune.medium_hard, (570, 200))
self.screen1.blit(self.mune.hard, (1050, 200))
self.screen1.blit(self.mune.super_hard, (1500, 200))
self .show =0
pygame .display .update()
if self .start_game_label ==1:
self.screen = pygame.display.set_mode(SCREEN.size) # 点size的操作让
self.start_game_label =0
break
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame .quit ()
sys.exit()
if event.type == pygame.MOUSEBUTTONDOWN:
mouse_x, mouse_y = pygame.mouse.get_pos()
lie_in_start_posi=bool ((mouse_x >0 and mouse_x < 278) and (mouse_y>800 and mouse_y <928))
lie_in_end_posi=bool((mouse_x >1639 and mouse_x <1920) and (mouse_y >800 and mouse_y <928))
lie_in_help_posi =bool ((mouse_x >0 and mouse_x <200) and (mouse_y >0 and mouse_y <100))
lie_in_easy_posi=bool ((mouse_x >90 and mouse_x <390) and (mouse_y >200 and mouse_y <400))
lie_in_medium_posi=bool ((mouse_x >570 and mouse_x <870) and (mouse_y >200 and mouse_y <400))
lie_in_hard_posi=bool ((mouse_x >1050 and mouse_x <1350) and (mouse_y >200 and mouse_y <400))
lie_in_superhard_posi=bool ((mouse_x >1500 and mouse_x <1800) and (mouse_y >200 and mouse_y <400))
if lie_in_start_posi ==True :
self.start_game_label =1
break
elif lie_in_help_posi==True :
while True :
if self .help_back_label ==1:
self .help_back_label =0
break
self.screen1.blit(self.mune.help_infomation, (350, 120))
self .screen1 .blit(self .mune .help_back_to_home ,(1570,70))
pygame.display.update()
for Event in pygame.event.get():
if Event .type == pygame.QUIT:
pygame.quit()
sys.exit()
if Event .type == pygame.MOUSEBUTTONDOWN:
mouse_x, mouse_y = pygame.mouse.get_pos()
lie_in_helpback_posi = bool((mouse_x > 1570 and mouse_x < 1620) and (mouse_y > 70 and mouse_y < 120))
if lie_in_helpback_posi ==True :
self .help_back_label =1
self .show =1
break
elif lie_in_easy_posi ==True :
self.start_game_label =1
break
elif lie_in_medium_posi==True :
self.ENEMY_INTERVAL =400
self.ENEMY_FIRE_INTERVAL = 150
self.KILL_TIMES = 20
self.COLLIDE_BOOS_TIMES = 4500
self.start_game_label =1
self.HERO_BULLET_INTERVAL = 350
self.enemy_blood = self.COLLIDE_BOOS_TIMES / self.SHOOT_TIMES
pygame.time.set_timer(ENEMY_FIGHTER, self.ENEMY_INTERVAL)
pygame.time.set_timer(HERO_FIRE_BULLET, self.HERO_BULLET_INTERVAL)
pygame.time.set_timer(ENEMY_FIRE_BULLET, self.ENEMY_FIRE_INTERVAL)
break
elif lie_in_hard_posi ==True :
self.ENEMY_INTERVAL = 320
self.ENEMY_FIRE_INTERVAL = 130
self.KILL_TIMES =30
self.COLLIDE_BOOS_TIMES = 8000
self .HERO_BULLET_INTERVAL =300
self.start_game_label =1
self.enemy_blood = self.COLLIDE_BOOS_TIMES / self.SHOOT_TIMES
pygame.time.set_timer(ENEMY_FIGHTER, self.ENEMY_INTERVAL)
pygame.time.set_timer(HERO_FIRE_BULLET, self.HERO_BULLET_INTERVAL)
pygame.time.set_timer(ENEMY_FIRE_BULLET, self.ENEMY_FIRE_INTERVAL)
break
elif lie_in_superhard_posi ==True :
self.ENEMY_INTERVAL =280
self.ENEMY_FIRE_INTERVAL = 100
self.KILL_TIMES =40
self.COLLIDE_BOOS_TIMES =10000
self.SHOOT_TIMES = 20
self .HERO_BULLET_INTERVAL =250
self.start_game_label =1
self.enemy_blood = self.COLLIDE_BOOS_TIMES / self.SHOOT_TIMES
pygame.time.set_timer(ENEMY_FIGHTER, self.ENEMY_INTERVAL)
pygame.time.set_timer(HERO_FIRE_BULLET, self.HERO_BULLET_INTERVAL)
pygame.time.set_timer(ENEMY_FIRE_BULLET, self.ENEMY_FIRE_INTERVAL)
break
elif lie_in_end_posi ==True :
pygame .quit ()
sys .exit()
def __create_sprite(self):
self .enemy_grope=pygame .sprite .Group()
bg1=background_init( )#创建了一个精灵bg1
bg2=background_init(True )#创建精灵bg2
self .bjgroup=pygame.sprite.Group(bg1 ,bg2 )
self .hero=hero_fighter()#创建了一个名叫hero的精灵(对象)
self .Hero_fighter_grope=pygame .sprite .Group(self.hero)
self.pictutres = Gamepicture()
self .Enemy_boss=Boss ()
self .boss_group=pygame .sprite .Group (self .Enemy_boss )#可有可无的操作
#######################################################################################################
def start_game(self):
while True :
if self .init_time >=1:
self .__init__()
while True:
if self.backtohome_label == 1 or self .exit_label ==1 or self .win_label ==1:
self .backtohome_label =0
self .win_label =0
self .exit_label =0
break
self .clock .tick(FRAME_PER_SECOND )#先设置整个游戏的画面的帧率
self .__event_handler()
self .__check_collide()
if self .exit_label ==0:
self.__update_sprite()
if self .kill_times >self.KILL_TIMES :
pygame.draw.rect(self.screen, (255, 255, 255), (0, 10, self.COLLIDE_BOOS_TIMES /self.SHOOT_TIMES , 50), 6)
pygame.draw.rect(self.screen, (255, 0, 0), (0, 16, self.enemy_blood, 38), 19)
pygame .display .update()
if self .collide_boos_times >=self.COLLIDE_BOOS_TIMES :
self.screen.blit(self.pictutres.game_win, (0, 0))
pygame.display.update()
time .sleep(1.5)
self.win_label=1
self.init_time +=1
#######################################################################################################
def __event_handler(self):
for i in pygame .event .get() :
if i.type ==pygame .QUIT :
PlaneGame .gameover()
elif i.type ==ENEMY_FIGHTER :#此处的ENEMY_FIGHTER即为突发事件
enemy=Enemy ()
self.enemy_grope.add(enemy )#创建一个敌机精灵组enemy_grope
elif i.type ==HERO_FIRE_BULLET :
self .hero .fire()#此处调用了fire方法
elif i.type ==ENEMY_FIRE_BULLET :
if self .kill_times >self .KILL_TIMES :
self .Enemy_boss .fire()
else:
pass
elif i.type == pygame.MOUSEBUTTONDOWN:
mouse_x, mouse_y = pygame.mouse.get_pos()
lie_in_pause_posi = bool((mouse_x > 1800 and mouse_x < 1876) and (mouse_y > 200 and mouse_y < 276))
if lie_in_pause_posi == True:
while 1:
if self .Continue_label ==1:
self.Continue_label=0#将继续标志进行归零处理。
break
self .screen .blit(self.pictutres .Back_to_homemenu,(500,480))
self .screen .blit(self .pictutres .Continue_button ,(1120,480))
pygame .display .update()
for i in pygame.event.get():
if i.type == pygame.QUIT:
PlaneGame.gameover()
elif i.type == pygame.MOUSEBUTTONDOWN:
mouse_x, mouse_y = pygame.mouse.get_pos()
lie_in_continue_posi = bool((mouse_x > 1120 and mouse_x < 1420) and (mouse_y > 480 and mouse_y < 630))
lie_in_backhome_posi =bool ((mouse_x > 500 and mouse_x < 800) and (mouse_y > 480 and mouse_y < 630))
if lie_in_continue_posi == True:
self .Continue_label +=1
break
elif lie_in_backhome_posi==True :
self .backtohome_label =1
self.Continue_label=1
break
else:
pass
keyslist=pygame .key .get_pressed()
if keyslist[pygame .K_RIGHT ]:
self .hero .speed =3
elif keyslist [pygame .K_LEFT ]:
self .hero .speed =-3
elif keyslist [pygame .K_UP ]:
self .hero .y_speed =-2
elif keyslist [pygame .K_DOWN ]:
self .hero .y_speed =2
elif keyslist [pygame .K_s ]:
if self .HERO_BULLET_INTERVAL ==400:
if self .dazhao <=1:
self .dazhao +=1
self.Enemy_boss.bullets.empty()
elif self .HERO_BULLET_INTERVAL ==350:
if self .dazhao <=2:
self.dazhao += 1
self.Enemy_boss.bullets.empty()
elif self.HERO_BULLET_INTERVAL == 300:
if self.dazhao <= 3:
self.dazhao += 1
self.Enemy_boss.bullets.empty()
elif self.HERO_BULLET_INTERVAL == 250:
if self.dazhao <= 5:
self.dazhao += 1
self.Enemy_boss.bullets.empty()
else:
self .hero .speed = 0
self .hero .y_speed =0
def __check_collide(self):
s=pygame.sprite.groupcollide(self.enemy_grope ,self .hero .bullets ,dokilla= True ,dokillb=False )
if len(s)>0:
warnings.filterwarnings("ignore", category=UserWarning)
self .kill_times +=1
self.boommusic .play(maxtime=1000)
m=pygame .sprite .spritecollide(self .hero ,self .Enemy_boss .bullets ,True )
if len(m)>0:
warnings.filterwarnings("ignore", category=UserWarning)
self .hero .kill()
self .gameover()
enemies=pygame .sprite .spritecollide(self .hero ,self .enemy_grope ,True)
if len(enemies )>0:
self.screen2 = pygame.display.set_mode(SCREEN.size)
self.screen1.blit(self.pictutres.gameover, (0, 0))
pygame.display.update()
self.hero.kill()
time.sleep(1.5)
self.exit_label = 1
warnings.filterwarnings("ignore", category=UserWarning)
if self .kill_times >self.KILL_TIMES:
if self .collide_boos_times >self.COLLIDE_BOOS_TIMES :
t=True
else:
t=False
n=pygame .sprite .spritecollide(self .Enemy_boss ,self .hero .bullets ,t )
if len(n)>0:
self.shoot_count += 1
if self.shoot_count == self .SHOOT_TIMES :
self.enemy_blood -= 1
self.shoot_count = 0
if(len(n)>0 and t==False ):
self.collide_boos_times +=1
def __update_sprite(self):
self .bjgroup .update( )
self .bjgroup.draw(self .screen )#可以代替surface()模块下的blit().
self .enemy_grope.update()
self .enemy_grope .draw(self .screen )
self .Hero_fighter_grope .update()
self .Hero_fighter_grope .draw(self .screen )
self .hero .bullets.update()
self .hero .bullets .draw(self .screen )
self .screen .blit(self.pictutres .Pause_button ,(1800,200) )
self.pictutres.Pause_button_update()
if self .kill_times >self.KILL_TIMES and self .collide_boos_times <self.COLLIDE_BOOS_TIMES :
self .boss_group .update()
self .boss_group .draw(self .screen )
self .Enemy_boss .bullets.update()
self .Enemy_boss .bullets .draw(self .screen )
@staticmethod
def gameover():
print("Game is over")
pygame .quit()
exit(0)
#测试语句仅在测试情况下进行。
if __name__ =="__main__":
#创建一个game对象,创建的同时会调用对象自身的初始化函数。
game=PlaneGame()
game .start_game()
2. plane_sprite.py
import random
import pygame
SCREEN=pygame .Rect(0,0,1920,1080)#创建了一个常量SCREEN
FRAME_PER_SECOND=120
ENEMY_FIGHTER=pygame .USEREVENT#将用户事件改名为一个好听,易使用的名字。
HERO_FIRE_BULLET=pygame .USEREVENT +1#可以把USEREVENT想成一个数字
ENEMY_FIRE_BULLET=pygame .USEREVENT +2
BJMUSIC=pygame .USEREVENT +2
BOOMMUSIC=pygame .USEREVENT +3
class GameSprite(pygame .sprite .Sprite ):
def __init__(self,image_name,speed=2,y_speed=0):
super ().__init__( )#父类不是object基类时,一定要调用父类的初始化函数。
self .image=pygame .image .load(image_name )
self .speed=speed
self .y_speed=y_speed
self .rect=self .image .get_rect()#该方法用于获取对象的位置信息,即(x,y)
def update(self):
self .rect .y +=self .speed
class background(GameSprite):
def update(self):
super ().update()
if self .rect .y >=self .rect .height :
self .rect .y =-self .rect .height
class background_init(background ):
def __init__(self,is_alt=False):
super ().__init__(r"outspace_larger.png")
if is_alt ==False :
self .rect .y =-self .rect .height
class Enemy(GameSprite ):
def __init__(self):
super().__init__(r"x_fighter2.png")
self .speed =random .randint(1,4)
self .rect.bottom =0#bottom是pygame自带的。直接设置即可
x_max=SCREEN .width-85
self .rect .x =random .randint(0,x_max)
def update(self):
super().update()
if self .rect .y >SCREEN .height :
self .kill()
def __del__(self):
pass
class hero_fighter(GameSprite):
def __init__(self):
super ().__init__(r"x_mando1.png",0)
self .rect .x =SCREEN .centerx-40
self .rect .bottom =SCREEN .bottom -10
self.bullets = pygame.sprite.Group()#在英雄类中创建了一个子弹精灵组
def update(self):
self .rect .x +=self .speed
self .rect .y +=self .y_speed
if self .rect .bottom >SCREEN .bottom -10:
self .rect .bottom =SCREEN .bottom -10
elif self .rect .top <=2:
self .rect .top =2
if self .rect .x<0:
self .rect .x =0
elif self .rect .right >SCREEN .right :
self .rect .right =SCREEN .right
def fire(self):
for i in (1,2):
bullet = Bullet()
bullet .rect.centerx=self .rect .centerx
bullet .rect .bottom=self .rect .bottom -40*i
self.bullets .add(bullet)
class Bullet(GameSprite ):
def __init__(self):
super().__init__(r"Xray_saber1.png",-5)
def update(self):
super().update()
if self .rect .bottom <0:
self .kill()
def __del__(self):
pass
class Mune(pygame .sprite .Sprite ):
def __init__(self):
super().__init__()
self .Mune=pygame .image .load(r"menu_bj.jpg ")
self .key_start=pygame .image .load(r"start_game.png ")
self .key_end=pygame .image .load(r"end_game.png ")
self .key_help=pygame .image .load(r"help.jpg ")
self.easy_mode = pygame.image.load(r"easy_mode.jpg ")
self.medium_hard = pygame.image.load(r"medium.jpg ")
self.hard = pygame.image.load(r"hard_mode.jpg ")
self.super_hard = pygame.image.load(r"superhard.jpg ")
self .help_infomation=pygame.image.load(r"help_tip1.jpg")
self .help_back_to_home=pygame.image.load(r"help_back_to_home.jpg ")
#Gamepicture中的属性中存放了游戏界面中的各种UI元素,包括退出,终止,继续UI等。
class Gamepicture(pygame .sprite .Sprite ):
def __init__(self):
super().__init__()
self .Pause_button=pygame .image .load(r"pause_game1.png ")
self .Continue_button=pygame .image .load(r"continue_game.png ")
self .Back_to_homemenu=pygame .image .load(r"back_to_menu.png ")
self .Help=pygame .image .load(r"help.jpg ")
self .gameover=pygame .image .load(r"gameover.jpg ")
self .game_win=pygame .image .load(r"game_win1.jpg ")
def Pause_button_update(self):
pygame .display .update()
def Continue_button_update(self):
pygame .display .update()
def Back_to_homemenu_update(self):
pygame .display .update()
def Help_upeate(self):
pygame .display .update()
#创建一个BOSS类。
class Boss(GameSprite ):
def __init__(self):
super().__init__(r"diguoxunyankgjian.png")
self.bullets = pygame.sprite.Group()#创建一个BOSS的子弹精灵组。用于接收子弹。
self .rect .centerx =960
def update(self):
#对BOSS进行更新操作。
pass
def fire(self):#决定了子弹的初始位置,并将其加入到子弹组中,并不由fire负责更新子弹的轨迹。
bullet =Enemy_Bullet ()
bullet .rect.centerx=self .rect .centerx
bullet .rect .bottom=self .rect .bottom-50
self.bullets .add(bullet )
#创建敌机的子弹精灵组。
class Enemy_Bullet(GameSprite):
def __init__(self):
super().__init__(r"Enemy_boos_bullet.png", 6)
self .x_speed=random .randint (-5,5)
self .y_speed =random .randint (-1,5)
def update(self):
self .rect .x +=self.x_speed
self .rect .y +=self.y_speed
if self.rect.right > 1920 or self .rect .x <0 or self .rect .bottom >1080 or self .rect .top <0:
self.kill()
def __del__(self):
pass