【Python_pygame】经典的飞机大战

 

 
效果图 :

【Python_pygame】经典的飞机大战_第1张图片

思路构图 :

【Python_pygame】经典的飞机大战_第2张图片

直接贴代码 :

注释算是比较详细

▊ main.py

import pygame
import sys
import traceback
from pygame.locals import *
from random import *

import myplane		# 飞机类
import enemy		# 敌机类
import bullet		# 子弹类
import supply		# 补给类

pygame.init()
pygame.mixer.init()

BLACK = ( 0 , 0 , 0 )
GREEN =( 0 , 255 , 0 )
RED = ( 255 , 0 , 0 )
WHITE = ( 255 , 255 , 255 )

bg_size = width , height = 480,700
screen = pygame.display.set_mode(bg_size)
pygame.display.set_caption("My小飞机>_<")

background = pygame.image.load("images\\background.png").convert()

pygame.mixer.music.load("sound\\game_music.ogg")
pygame.mixer.music.set_volume(0.2)
bullet_sound = pygame.mixer.Sound("sound\\bullet.wav")
bullet_sound.set_volume(0.2)
enemy1_down_sound = pygame.mixer.Sound("sound\\enemy1_down.wav")
enemy1_down_sound.set_volume(0.1)
enemy2_down_sound = pygame.mixer.Sound("sound\\enemy2_down.wav")
enemy2_down_sound.set_volume(0.2)
enemy3_down_sound = pygame.mixer.Sound("sound\\enemy3_down.wav")
enemy3_down_sound.set_volume(0.5)
me_down_sound = pygame.mixer.Sound("sound\\me_down.wav")
me_down_sound.set_volume(0.2)
enemy3_fly_sound = pygame.mixer.Sound("sound\\enemy3_flying.wav")
enemy3_fly_sound.set_volume(0.2)
bomb_sound = pygame.mixer.Sound("sound\\use_bomb.wav")
bomb_sound.set_volume(0.2)
supply_sound = pygame.mixer.Sound("sound\\supply.wav")
supply_sound.set_volume(0.2)
upgrade_sound = pygame.mixer.Sound("sound\\upgrade.wav")
upgrade_sound.set_volume(0.2)
get_bomb_sound = pygame.mixer.Sound("sound\\get_bomb.wav")
get_bomb_sound.set_volume(0.2)
get_bullet_sound = pygame.mixer.Sound("sound\\get_bullet.wav")
get_bullet_sound.set_volume(0.2)
click1_sound = pygame.mixer.Sound("sound\\单击1.wav ")
click1_sound.set_volume(0.2)
click2_sound = pygame.mixer.Sound("sound\\单击2.wav ")
click2_sound.set_volume(0.2)


def add_small_enemies(group1 , group2 , num) :
       for i in range(num) :
              e1 = enemy.SmallEnemy(bg_size)
              group1.add( e1 )
              group2.add( e1 )

def add_mid_enemies(group1 , group2 , num) :
       for i in range(num) :
              e2 = enemy.MidEnemy(bg_size)
              group1.add( e2 )
              group2.add( e2 )

def add_big_enemies(group1 , group2 , num) :
       for i in range(num) :
              e3 = enemy.BigEnemy(bg_size)
              group1.add( e3 )
              group2.add( e3 )

def inc_speed( target , inc ):
       for each in target :
              each.speed += inc

#############################################################################################################
def main():
       pygame.mixer.music.play(-1)

       #生成我的飞机
       me = myplane.MyPlane(bg_size)

       #敌方飞机组Group
       enemies = pygame.sprite.Group()

       #生成小型敌机
       small_enemies = pygame.sprite.Group()
       add_small_enemies(small_enemies , enemies , 15)
       #生成中型敌机
       mid_enemies = pygame.sprite.Group()
       add_mid_enemies(mid_enemies , enemies , 4)
       #生成大型敌机
       big_enemies = pygame.sprite.Group()
       add_big_enemies(big_enemies , enemies , 2)

       #生成普通子弹
       bullet1 = []
       bullet1_index = 0
       BULLET1_NUM = 4
       for i in range(BULLET1_NUM) :
              bullet1.append( bullet.Bullet1( me.rect.midtop ) )

       #生成超级子弹
       bullet2= []
       bullet2_index = 0
       BULLET2_NUM = 8
       for i in range(BULLET2_NUM // 2) :
              bullet2.append( bullet.Bullet2( (me.rect.centerx - 33  , me.rect.centery) ) )
              bullet2.append( bullet.Bullet2( (me.rect.centerx +30  , me.rect.centery) ) )

       #中弹图片索引
       e1_destroy_index = 0
       e2_destroy_index = 0
       e3_destroy_index = 0
       me_destroy_index = 0

       #统计得分
       score = 0
       score_font = pygame.font.Font("font\\font.ttf" , 36)

       #是否暂停的flag
       paused = False
       pause_nor_image = pygame.image.load("images\\pause_nor.png").convert_alpha()
       pause_pressed_image = pygame.image.load("images\\pause_pressed.png").convert_alpha()
       resume_nor_image = pygame.image.load("images\\resume_nor.png").convert_alpha()
       resume_pressed_image = pygame.image.load("images\\resume_pressed.png").convert_alpha()
       pause_rect = pause_nor_image.get_rect()
       pause_rect.left , pause_rect.top = width - pause_rect.width - 10 , 10
       pause_image = pause_nor_image

       #设置难度级别
       level = 1

       #全屏炸弹
       bomb_image = pygame.image.load("images\\bomb.png").convert_alpha()
       bomb_rect = bomb_image.get_rect()
       bomb_font = pygame.font.Font("font\\font.ttf" , 48)
       bomb_num = 3

       #发放补给包
       bullet_supply = supply.Bullet_Supply(bg_size)
       bomb_supply = supply.Bomb_Supply(bg_size)
       
       SUPPLY_TIME = USEREVENT
       pygame.time.set_timer(SUPPLY_TIME , 30 * 1000)

       #超级子弹定时器
       DOUBLE_BULLET_TIME = USEREVENT + 1

       #接触我方无敌状态计时器
       INVINCIBLE_TIME = USEREVENT + 2

       #标志是否使用超级子弹flag
       is_double_bullet = False

       #生命数量
       life_image = pygame.image.load("images\\life.png").convert_alpha()
       life_rect = life_image.get_rect()
       life_num = 3

       #用于阻止重复打开记录文件
       recorded = False

       clock = pygame.time.Clock()

       #切换我的飞机image12
       switch_image = True

       #用于延迟
       delay =100
       
################################################################################################################
       running = True
       
       while running:

              for event in pygame.event.get():
                     if event.type == QUIT:
                            pygame.quit()
                            sys.exit()

                     if event.type == MOUSEBUTTONDOWN :
                            if event.button == 1 and pause_rect.collidepoint( event.pos ) :
                                   paused = not paused
                                   if paused :
                                          pygame.time.set_timer(SUPPLY_TIME , 0)
                                          pygame.mixer.music.pause()
                                          pygame.mixer.pause()
                                          click1_sound.play()
                                   else:
                                          click2_sound.play()
                                          pygame.time.set_timer(SUPPLY_TIME , 30 *1000)
                                          pygame.mixer.music.unpause()
                                          pygame.mixer.unpause()
                                          

                     if event.type == MOUSEMOTION :
                            if pause_rect.collidepoint( event.pos ) :
                                   if paused :
                                          pause_image = resume_pressed_image
                                   else :
                                          pause_image = pause_pressed_image
                            else :
                                   if paused :
                                          pause_image = resume_nor_image
                                   else :
                                          pause_image = pause_nor_image


                     if event.type == KEYDOWN :
                            if event.key == K_SPACE :
                                   if bomb_num :
                                          bomb_num -= 1
                                          bomb_sound.play()
                                          for each in enemies :
                                                 if each.rect.bottom > 0:
                                                        each.active = False

                     if event.type == SUPPLY_TIME :
                            supply_sound.play()
                            if choice([ True , False ]) :
                                   bomb_supply.reset()
                            else:
                                   bullet_supply.reset()

                     if event.type == DOUBLE_BULLET_TIME :
                            is_double_bullet = False
                            pygame.time.set_timer( DOUBLE_BULLET_TIME , 0 )

                     if event.type == INVINCIBLE_TIME :  #计时结束后出发 , 解除无敌状态 , 取消计时器
                            me.invincible = False
                            pygame.time.set_timer( INVINCIBLE_TIME , 0 )


#=============================================================                                          

              #根据用户得分增加难度
              if  level == 1 and score>50000 :
                     level = 2
                     upgrade_sound.play()
                     #增加3架小型敌机 , 2架中型敌机 , 1架大型敌机
                     add_small_enemies( small_enemies , enemies , 3 )
                     add_mid_enemies( mid_enemies , enemies , 2 )
                     add_big_enemies( big_enemies , enemies , 1 )
                     #提升小型敌机速度
                     inc_speed( small_enemies , 1 )
              elif  level == 2 and score>300000 :
                     level = 3
                     upgrade_sound.play()
                     #增加5架小型敌机 , 3架中型敌机 , 2架大型敌机
                     add_small_enemies( small_enemies , enemies , 5 )
                     add_mid_enemies( mid_enemies , enemies , 3 )
                     add_big_enemies( big_enemies , enemies , 2 )
                     #提升小型敌机速度
                     inc_speed( small_enemies , 1 )
                     #提升中型敌机速度
                     inc_speed( mid_enemies , 1 )
              elif  level == 3 and score>600000 :
                     level = 4
                     upgrade_sound.play()
                     #增加5架小型敌机 , 3架中型敌机 , 2架大型敌机
                     add_small_enemies( small_enemies , enemies , 5 )
                     add_mid_enemies( mid_enemies , enemies , 3 )
                     add_big_enemies( big_enemies , enemies , 2 )
                     #提升小型敌机速度
                     inc_speed( small_enemies , 1 )
                     #提升中型敌机速度
                     inc_speed( mid_enemies , 1 )
              elif  level == 4 and score>600000 :
                     level = 5
                     upgrade_sound.play()
                     #增加5架小型敌机 , 3架中型敌机 , 2架大型敌机
                     add_small_enemies( small_enemies , enemies , 5 )
                     add_mid_enemies( mid_enemies , enemies , 3 )
                     add_big_enemies( big_enemies , enemies , 2 )
                     #提升小型敌机速度
                     inc_speed( small_enemies , 1 )
                     #提升中型敌机速度
                     inc_speed( mid_enemies , 1 )

              screen.blit(background , (0,0) )
                     
                                   
              if not paused and life_num :
                     #检测键盘操作
                     key_pressed = pygame.key.get_pressed()

                     if key_pressed[K_w] or key_pressed[K_UP]:
                            me.moveUp()
                     if key_pressed[K_s] or key_pressed[K_DOWN]:
                            me.moveDown()
                     if key_pressed[K_a] or key_pressed[K_LEFT]:
                            me.moveLeft()
                     if key_pressed[K_d] or key_pressed[K_RIGHT]:
                            me.moveRight()
                     
                            
                     


                     #绘制补给包
                     if bomb_supply.active :
                            bomb_supply.move()
                            screen.blit(bomb_supply.image , bomb_supply.rect)
                            if pygame.sprite.collide_mask(bomb_supply , me) :
                                   get_bomb_sound.play()
                                   if bomb_num < 3:
                                          bomb_num += 1
                                   bomb_supply.active = False

                     if bullet_supply.active :
                            bullet_supply.move()
                            screen.blit(bullet_supply.image , bullet_supply.rect)
                            if pygame.sprite.collide_mask(bullet_supply , me) :
                                   get_bullet_sound.play()
                                   is_double_bullet = True
                                   pygame.time.set_timer( DOUBLE_BULLET_TIME , 18 * 1000 )
                                   bullet_supply.active = False

                     #发射子弹
                     if not (delay % 10) : #每10帧绘制一次
                            bullet_sound.play()
                            if is_double_bullet :
                                   bullets = bullet2
                                   bullets[bullet2_index].reset((me.rect.centerx - 33 , me.rect.centery))
                                   bullets[bullet2_index + 1].reset((me.rect.centerx + 30 , me.rect.centery))
                                   bullet2_index = (bullet2_index + 2) % BULLET2_NUM
                            else:
                                   bullets = bullet1
                                   bullets[bullet1_index].reset( me.rect.midtop )
                                   bullet1_index = (bullet1_index + 1) % BULLET1_NUM

                     #检测子弹是否击中敌机
                     for b in bullets:
                            if b.active:
                                   b.move()
                                   screen.blit( b.image , b.rect )
                                   enemy_hit = pygame.sprite.spritecollide( b , enemies , False , pygame.sprite.collide_mask)
                                   if enemy_hit :
                                          b.active = False
                                          for e in enemy_hit :
                                                 if e in mid_enemies or e in big_enemies:
                                                        e.hit = True
                                                        e.energy -= 1
                                                        if e.energy == 0:
                                                               e.active = False
                                                 else:
                                                        e.active = False
                     

                     #绘制敌机(注意绘制顺序层次  : 大  ->  中  ->  小)
                     #绘制大
                     for each in big_enemies:
                            if each.active :
                                   each.move()
                                   if each.hit :
                                          screen.blit(each.image_hit , each.rect)
                                          each.hit = False
                                   else:
                                          if switch_image:
                                                 screen.blit(each.image1 , each.rect)
                                          else:
                                                 screen.blit(each.image2 , each.rect)
                                          
                                   #绘制血槽
                                   pygame.draw.line( screen , BLACK , (each.rect.left , each.rect.top - 5) , (each.rect.right , each.rect.top - 5) , 2 )
                                   #当生命大于20%显示绿色 , 否则红色
                                   energy_remain = each.energy / enemy.BigEnemy.energy
                                   if energy_remain > 0.2 :
                                          energy_color = GREEN
                                   else:
                                          energy_color = RED
                                   pygame.draw.line( screen , energy_color , (each.rect.left , each.rect.top - 5) , (each.rect.left + each.rect.width * energy_remain ,\
                                                                                                                            each.rect.top -5) , 2 )
                                   
                                   #即将出现 , 开音效
                                   if each.rect.bottom == -50 :
                                          enemy3_fly_sound.play(-1)
                            else:
                                   #毁灭
                                   if not (delay % 3) :
                                          if e3_destroy_index == 0:
                                                  enemy3_down_sound.play()
                                          screen.blit( each.destroy_images[e3_destroy_index] , each.rect)
                                          e3_destroy_index  =  (e3_destroy_index + 1 ) % 6    #tip
                                          if e3_destroy_index == 0:
                                                 enemy3_fly_sound.stop()
                                                 score += 10000
                                                 each.reset()
                                    
                     #绘制中
                     for each in mid_enemies:
                            if each.active :
                                   each.move()
                                   if each.hit :
                                          screen.blit(each.image_hit , each.rect)
                                          each.hit = False
                                   else:
                                          screen.blit(each.image , each.rect)

                            #绘制血槽
                                   pygame.draw.line( screen , BLACK , (each.rect.left , each.rect.top - 5) , (each.rect.right , each.rect.top - 5) , 2 )
                                   #当生命大于20%显示绿色 , 否则红色
                                   energy_remain = each.energy / enemy.MidEnemy.energy
                                   if energy_remain > 0.2 :
                                          energy_color = GREEN
                                   else:
                                          energy_color = RED
                                   pygame.draw.line( screen , energy_color , (each.rect.left , each.rect.top - 5) , (each.rect.left + each.rect.width * energy_remain ,\
                                                                                                                            each.rect.top -5) , 2 )
                            
                            else:
                                   #毁灭
                                   if not (delay % 3) :
                                          if e2_destroy_index == 0:
                                                 enemy2_down_sound.play()
                                          screen.blit( each.destroy_images[e2_destroy_index] , each.rect)
                                          e2_destroy_index  =  (e2_destroy_index + 1 ) % 4    #tip
                                          if e2_destroy_index == 0:
                                                 score += 6000
                                                 each.reset()
                                   
                            
                     #绘制小
                     for each in small_enemies:
                            if each.active :
                                   each.move()
                                   screen.blit(each.image , each.rect)
                            else:
                                   #毁灭
                                   if not (delay % 3) :
                                          if e1_destroy_index == 0:
                                                 enemy1_down_sound.play()
                                          screen.blit( each.destroy_images[e1_destroy_index] , each.rect)
                                          e1_destroy_index  =  (e1_destroy_index + 1 ) % 4    #tip
                                          if e1_destroy_index == 0:
                                                 score += 1000
                                                 each.reset()

                     #检测我方飞机是否被撞
                     enemies_down = pygame.sprite.spritecollide( me , enemies , False , pygame.sprite.collide_mask)
                     if enemies_down and not me.invincible :
                            me.active = False
                            for e in enemies_down:
                                   e.active = False
                                   
                     
                     #绘制我的飞机
                     if me.active:
                            if switch_image:
                                   screen.blit(me.image1 , me.rect)
                            else:
                                   screen.blit(me.image2 , me.rect)
                                   
                            #利用延迟delay和切换flag switch_image
                            if delay % 5 == 0 :
                                   switch_image = not switch_image
                     else:
                            #毁灭
                            if not (delay % 3) :
                                   if me_destroy_index == 0:
                                          me_down_sound.play()
                                   screen.blit( me.destroy_images[me_destroy_index] , me.rect)
                                   me_destroy_index  =  (me_destroy_index + 1 ) % 4    #tip
                                   if me_destroy_index == 0:
                                           life_num -= 1
                                           me.reset()
                                           pygame.time.set_timer( INVINCIBLE_TIME ,  3 * 1000)
                                           

                     #绘制生命数量
                     if life_num :
                            for i in range(life_num) :
                                   screen.blit( life_image ,(width - 10 -(i +1)*life_rect.width , height - 10 - life_rect.height)  )

                     #绘制全屏炸弹数量
                     bomb_text = bomb_font.render("× %d "  %  bomb_num , True , WHITE)
                     text_rect = bomb_text.get_rect()
                     screen.blit (bomb_image , (10 , height - 10 - bomb_rect.height))
                     screen.blit (bomb_text , (20 + bomb_rect.width , height -5 -text_rect.height) )

                                                                
                     #绘制得分
                     score_text = score_font.render("Score  :  %s"  %  str(score) , True , WHITE)
                     screen.blit( score_text , (10 , 5) )

                                           

              #游戏结束
              elif life_num == 0 :
                     #背景音乐停止
                     pygame.mixer.music.stop()
                     #停止所有音效
                     pygame.mixer.stop()
                     #停止发放补给
                     pygame.time.set_timer( SUPPLY_TIME , 0 )
                     
                     if not recorded :
                            recorded = True
                     #读取历史最高得分
                            with open("record.txt" , "r") as f :
                                   record_score = int(f.read())
                             #如果破纪录则修改存档      
                            if score > record_score :
                                   with open("record.txt" , "w") as f :
                                          f.write( str(score) )

                     #绘制结束画面
                     again_image = pygame.image.load("images\\again.png")
                     gameover_image = pygame.image.load("images\\gameover.png")
                 
                     record_score_text = score_font.render("Best : %d" % record_score, True, WHITE)
                     screen.blit(record_score_text, (50, 50))

                     gameover_font = pygame.font.Font("font\\font.ttf" , 48)
                     gameover_text1 = gameover_font.render("Your Score", True, WHITE)
                     gameover_text1_rect = gameover_text1.get_rect()
                     gameover_text1_rect.left, gameover_text1_rect.top = (width - gameover_text1_rect.width) // 2, height // 3
                     screen.blit(gameover_text1, gameover_text1_rect)
                   
                     gameover_text2 = gameover_font.render(str(score), True, WHITE)
                     gameover_text2_rect = gameover_text2.get_rect()
                     gameover_text2_rect.left, gameover_text2_rect.top = (width - gameover_text2_rect.width) // 2, gameover_text1_rect.bottom + 10
                     screen.blit(gameover_text2, gameover_text2_rect)

                     again_rect = again_image.get_rect()
                     again_rect.left, again_rect.top = (width - again_rect.width) // 2, gameover_text2_rect.bottom + 50
                     screen.blit(again_image, again_rect)

                     gameover_rect = gameover_image.get_rect()
                     gameover_rect.left, gameover_rect.top = (width - again_rect.width) // 2, again_rect.bottom + 10
                     screen.blit(gameover_image, gameover_rect)
                     

                     # 检测用户的鼠标操作
                     # 如果用户按下鼠标左键
                     if pygame.mouse.get_pressed()[0]:
                            pos = pygame.mouse.get_pos()  # 获取鼠标坐标
                            
                            # 如果用户点击      重新开始
                            if again_rect.left < pos[0] < again_rect.right and again_rect.top < pos[1] < again_rect.bottom:
                                   main()   # 调用main函数,重新开始游戏

                            # 如果用户点击      结束游戏            
                            elif gameover_rect.left < pos[0] < gameover_rect.right and gameover_rect.top < pos[1] < gameover_rect.bottom:
                                    pygame.quit()
                                    sys.exit()
                           
                     
               
                     
              
              #绘制暂停按钮
              screen.blit( pause_image , pause_rect )

              if paused :
                     pause_font =pygame.font.Font("font\\font.ttf " , 48)
                     pause_text = pause_font.render("In Pause" , True ,WHITE)
                     pause_text_rect = pause_text.get_rect()
                     pause_text_rect.left , pause_text_rect.top =  ( width - pause_text_rect.width ) // 2 ,height // 3
                     screen.blit( pause_text , pause_text_rect )
              
              

              delay -= 1
              if not delay :
                     delay = 100
              '''
              print(switch_image)       #测试test , delay延迟测试成功
              '''

              pygame.display.flip()

              clock.tick(60)

################################################################################################################
              
if __name__=="__main__":
       try:
              main()
       except SystemExit:
              pass
       except:
              traceback.print_exc()
              pygame.quit()
              input()
              




▊ myplane.py

import pygame

class MyPlane(pygame.sprite.Sprite):
       def __init__(self,bg_size):
              pygame.sprite.Sprite.__init__(self)

              self.image1 = pygame.image.load("images\\me1.png")
              self.image2 = pygame.image.load("images\\me2.png")
              self.destroy_images = []
              self.destroy_images.extend ([\
                     pygame.image.load("images\\me_destroy_1.png ").convert_alpha() , \
                     pygame.image.load("images\\me_destroy_2.png ").convert_alpha() , \
                     pygame.image.load("images\\me_destroy_3.png ").convert_alpha() , \
                     pygame.image.load("images\\me_destroy_4.png ").convert_alpha()  \
                     ])
              self.rect = self.image1.get_rect()
              self.width , self.height = bg_size[0] , bg_size[1]
              self.rect.left , self.rect.top = ( self.width - self.rect.width ) // 2  ,  self.height - self.rect.height - 60
              self.speed = 10
              self.active = True
              self.mask = pygame.mask.from_surface(self.image1)
              self.invincible = False

       def moveUp(self):
              if self.rect.top > 0:
                     self.rect.top -= self.speed
              else:
                     self.rect.top = 0

       def moveDown(self):
              if self.rect.bottom < self.height - 60:
                     self.rect.top += self.speed
              else:
                     self.rect.bottom = self.height - 60

       def moveLeft(self):
              if self.rect.left > 0:
                     self.rect.left -= self.speed
              else:
                     self.rect.left = 0

       def moveRight(self):
              if self.rect.right < self.width:
                     self.rect.left += self.speed
              else:
                     self.rect.right = self.width

       def reset(self) :
              self.rect.left , self.rect.top = ( self.width - self.rect.width ) // 2  ,  self.height - self.rect.height - 60
              self.active = True
              self.invincible = True
              

▊ bullet.py

import pygame


class Bullet1(pygame.sprite.Sprite):
       def __init__(self,position):
              pygame.sprite.Sprite.__init__(self)

              self.image = pygame.image.load("images\\bullet1.png").convert_alpha()
              self.rect = self.image.get_rect()
              self.rect.left , self.rect.top  =  position
              self.speed = 12
              self.active = False
              self.mask = pygame.mask.from_surface(self.image)

       def move(self):
              self.rect.top -= self.speed

              if self.rect.top < 0 :
                     self.active = False

       def reset(self , position) :
              self.rect.left , self.rect.top  =  position
              self.active = True




class Bullet2(pygame.sprite.Sprite):
       def __init__(self,position):
              pygame.sprite.Sprite.__init__(self)

              self.image = pygame.image.load("images\\bullet1.png").convert_alpha()
              self.rect = self.image.get_rect()
              self.rect.left , self.rect.top  =  position
              self.speed = 12
              self.active = False
              self.mask = pygame.mask.from_surface(self.image)

       def move(self):
              self.rect.top -= self.speed

              if self.rect.top < 0 :
                     self.active = False

       def reset(self , position) :
              self.rect.left , self.rect.top  =  position
              self.active = True
              

▊ enemy.py

import pygame
from random import *

class SmallEnemy(pygame.sprite.Sprite):
       def __init__(self,bg_size):
              pygame.sprite.Sprite.__init__(self)

              self.image = pygame.image.load("C:\\Users\\小怪兽Sama\\Desktop\\MY小飞机\\images\\enemy1.png").convert_alpha()
              self.destroy_images = []
              self.destroy_images.extend([ \
                     pygame.image.load("C:\\Users\\小怪兽Sama\\Desktop\\MY小飞机\\images\\enemy1_down1.png").convert_alpha() , \
                     pygame.image.load("C:\\Users\\小怪兽Sama\\Desktop\\MY小飞机\\images\\enemy1_down2.png").convert_alpha() , \
                     pygame.image.load("C:\\Users\\小怪兽Sama\\Desktop\\MY小飞机\\images\\enemy1_down3.png").convert_alpha() , \
                     pygame.image.load("C:\\Users\\小怪兽Sama\\Desktop\\MY小飞机\\images\\enemy1_down4.png").convert_alpha()  \
                     ])
              self.rect = self.image.get_rect()
              self.width ,self.height = bg_size[0] , bg_size[1]
              self.speed = 2
              self.active = True
              self.rect.left , self.rect.top = randint(0 , self.width - self.rect.width) , randint(-5 * self.height , 0)
              self.mask = pygame.mask.from_surface(self.image)

       def move(self) :
              if self.rect.top < self.height :
                     self.rect.top += self.speed
              else :
                     self.reset()

       def reset(self) :
              self.rect.left , self.rect.top = randint(0 , self.width - self.rect.width) , randint(-5 * self.height , 0)
              self.active = True
              

class MidEnemy(pygame.sprite.Sprite):
       energy =8
       def __init__(self,bg_size):
              pygame.sprite.Sprite.__init__(self)

              self.image = pygame.image.load("C:\\Users\\小怪兽Sama\\Desktop\\MY小飞机\\images\\enemy2.png").convert_alpha()
              self.image_hit = pygame.image.load("C:\\Users\\小怪兽Sama\\Desktop\\MY小飞机\\images\\enemy2_hit.png").convert_alpha()
              self.destroy_images = []
              self.destroy_images.extend([ \
                     pygame.image.load("C:\\Users\\小怪兽Sama\\Desktop\\MY小飞机\\images\\enemy2_down1.png").convert_alpha() , \
                     pygame.image.load("C:\\Users\\小怪兽Sama\\Desktop\\MY小飞机\\images\\enemy2_down2.png").convert_alpha() , \
                     pygame.image.load("C:\\Users\\小怪兽Sama\\Desktop\\MY小飞机\\images\\enemy2_down3.png").convert_alpha() , \
                     pygame.image.load("C:\\Users\\小怪兽Sama\\Desktop\\MY小飞机\\images\\enemy2_down4.png").convert_alpha()  \
                     ])
              self.rect = self.image.get_rect()
              self.width ,self.height = bg_size[0] , bg_size[1]
              self.speed = 1
              self.active = True
              self.rect.left , self.rect.top = randint(0 , self.width - self.rect.width) , randint(-10 * self.height , -self.height)
              self.mask = pygame.mask.from_surface(self.image)
              self.energy = MidEnemy.energy
              self.hit = False

       def move(self) :
              if self.rect.top < self.height :
                     self.rect.top += self.speed
              else :
                     self.reset()

       def reset(self) :
              self.rect.left , self.rect.top = randint(0 , self.width - self.rect.width) , randint(-10 * self.height , -self.height)
              self.active = True
              self.energy = MidEnemy.energy



class BigEnemy(pygame.sprite.Sprite):
       energy = 20
       def __init__(self,bg_size):
              pygame.sprite.Sprite.__init__(self)

              self.image1 = pygame.image.load("images\\enemy3_n1.png").convert_alpha()
              self.image2 = pygame.image.load("images\\enemy3_n2.png").convert_alpha()
              self.image_hit = pygame.image.load("images\\enemy3_hit.png ").convert_alpha()
              self.destroy_images = []
              self.destroy_images.extend([ \
                     pygame.image.load("images\\enemy3_down1.png").convert_alpha() , \
                     pygame.image.load("images\\enemy3_down2.png").convert_alpha() , \
                     pygame.image.load("images\\enemy3_down3.png").convert_alpha() , \
                     pygame.image.load("images\\enemy3_down4.png").convert_alpha() , \
                     pygame.image.load("images\\enemy3_down5.png").convert_alpha() , \
                     pygame.image.load("images\\enemy3_down6.png").convert_alpha()  \
                     ])
              self.rect = self.image1.get_rect()
              self.width ,self.height = bg_size[0] , bg_size[1]
              self.speed = 1
              self.active = True
              self.rect.left , self.rect.top = randint(0 , self.width - self.rect.width) , randint(-15 * self.height , -5 * self.height)
              self.mask = pygame.mask.from_surface(self.image1)
              self.energy = BigEnemy.energy
              self.hit = False

       def move(self) :
              if self.rect.top < self.height :
                     self.rect.top += self.speed
              else :
                     self.reset()

       def reset(self) :
              self.rect.left , self.rect.top = randint(0 , self.width - self.rect.width) , randint(-15 * self.height , -5 * self.height)
              self.active = True
              self.energy = BigEnemy.energy
              

▊ supply.py

import pygame
from random import *

class Bullet_Supply(pygame.sprite.Sprite) :
       def __init__(self,bg_size):
              pygame.sprite.Sprite.__init__(self)

              self.image = pygame.image.load("images\\bullet_supply.png").convert_alpha()
              self.rect = self.image.get_rect()
              self.width , self.height = bg_size[0] , bg_size[1]
              self.rect.left , self.rect.bottom = randint( 0 , self.width - self.rect.width ) , -100
              self.speed = 5
              self.active = False
              self.mask = pygame.mask.from_surface(self.image)

       def move(self):
              if self.rect.top < self.height :
                     self.rect.top += self.speed
              else:
                     self.active = False

       def reset(self):
              self.active = True
              self.rect.left , self.rect.bottom = randint( 0 , self.width - self.rect.width ) , -100


class Bomb_Supply(pygame.sprite.Sprite) :
       def __init__(self,bg_size):
              pygame.sprite.Sprite.__init__(self)

              self.image = pygame.image.load("images\\bomb_supply.png").convert_alpha()
              self.rect = self.image.get_rect()
              self.width , self.height = bg_size[0] , bg_size[1]
              self.rect.left , self.rect.bottom = randint( 0 , self.width - self.rect.width ) , -100
              self.speed = 5
              self.active = False
              self.mask = pygame.mask.from_surface(self.image)

       def move(self):
              if self.rect.top < self.height :
                     self.rect.top += self.speed
              else:
                     self.active = False

       def reset(self):
              self.active = True
              self.rect.left , self.rect.bottom = randint( 0 , self.width - self.rect.width ) , -100

 

 

 

 

 

 

 
 

 

 

 

 
 
 
 

后记

♠ 小甲鱼原创;具体教程点这里

♥ 对小甲鱼的源码添加了部分注释;对视频中的错误进行了改正;对部分逻辑进行了改进

♦ 素材善用Baidu,本文避免侵权

♣ 模块的安装问题戳这里;生成可执行文件戳这里;进阶版的小游戏看这里 >_<

你可能感兴趣的:(Python(Pygame))