Python期末大作业分享(飞机大战小游戏)

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值