python飞机大战代码

  1 import pygame
  2 from pygame.locals import *
  3 from pygame.sprite import Sprite
  4 import random
  5 import time
  6 pygame.init()#游戏初始化
  7 pygame.mixer.init()#混音器初始化
  8 #游戏背景音乐
  9 pygame.mixer.music.load("./sound/game_music.wav")
 10 pygame.mixer.music.set_volume(0.2)
 11 #子弹发射音乐
 12 bullet_sound = pygame.mixer.Sound("./sound/bullet.wav")
 13 bullet_sound.set_volume(0.2)
 14 #我方飞机挂了的音乐
 15 me_down_sound = pygame.mixer.Sound("./sound/game_over.wav")
 16 me_down_sound.set_volume(0.2)
 17 #敌方飞机挂了的音乐
 18 enemy_down_sound = pygame.mixer.Sound("./sound/enemy1_down.wav")
 19 enemy_down_sound.set_volume(0.2)
 20 
 21 #设置定时器事件
 22 CREAT_ENEMY = pygame.USEREVENT
 23 pygame.time.set_timer(CREAT_ENEMY,1000)
 24 
 25 #创建一个窗口,用来显示内容
 26 screen = pygame.display.set_mode((480,800),0,32)
 27 
 28 class Base(object):
 29     def __init__(self,screen):
 30         self.screen = screen
 31 
 32 class Plan(Base):
 33     def __init__(self,screen):
 34         super().__init__(screen)
 35         
 36         self.image = pygame.image.load(self.imageName).convert()
 37         self.bulletList = []
 38     def display(self):
 39        self. screen.blit(self.image,(self.x,self.y))
 40        for bullet in self.bulletList:
 41            bullet.display()
 42            bullet.move()
 43            if bullet.judge():
 44                self.bulletList.remove(bullet)
 45 class GamePlan(Plan,pygame.sprite.Sprite):
 46     def __init__(self,screen):
 47         self.imageName = "./feiji/hero.gif"
 48         super().__init__(screen)
 49         Sprite.__init__(self)
 50 
 51         self.rect = self.image.get_rect()
 52 
 53         self.rect.x=200
 54         self.rect.y=680
 55         #加载我机损毁图片
 56         self.bomb1 =  pygame.image.load("./feiji/hero_blowup_n1.png")
 57         self.bomb2 = pygame.image.load("./feiji/hero_blowup_n2.png")
 58         self.bomb3 = pygame.image.load("./feiji/hero_blowup_n3.png")
 59         self.bombList = [self.bomb1,self.bomb2,self.bomb3]
 60     def display(self):
 61         self.screen.blit(self.image,(self.rect.x,self.rect.y))
 62         for bullet in self.bulletList:
 63             bullet.display()
 64             bullet.move()
 65     def moveLeft(self):
 66         if self.rect.x >=0:
 67             self.rect.x-=20
 68     def moveRight(self):
 69         if self.rect.x <480-100:
 70             self.rect.x+=20
 71     def moveUp(self):
 72         if self.rect.y>0:
 73             self.rect.y-=20
 74     def moveDown(self):
 75         if self.rect.y<860-124:
 76             self.rect.y+=20
 77     def _del_(self):
 78         print("游戏结束")
 79     def shootbullet(self):
 80        Newbullet =PublicBullet(self.rect.x,self.rect.y,self.screen)
 81        self.bulletList.append(Newbullet)
 82        bullet_sound.play()
 83 class EnemyPlan(Plan,pygame.sprite.Sprite):
 84     def __init__(self,screen):
 85         self.speed = random.randint(1,3)
 86         self.imageName = "./feiji/enemy-1.gif"
 87         super().__init__(screen)
 88         Sprite.__init__(self)
 89         #确定敌机位置
 90         self.rect = self.image.get_rect()
 91         self.reset()
 92         #加载敌机损毁图片
 93         self.bomb1 =  pygame.image.load("./feiji/enemy0_down1.png")
 94         self.bomb2 = pygame.image.load("./feiji/enemy0_down2.png")
 95         self.bomb3 = pygame.image.load("./feiji/enemy0_down3.png")
 96         self.bombList = [self.bomb1,self.bomb2,self.bomb3]
 97     def reset(self):
 98 
 99         self.rect.x = random.randint(0,400)
100         self.rect.y= 0
101 
102     def move(self):
103         self.rect.y+=self.speed
104     def update(self):
105         if self.rect.y>860:
106             self.kill()
107     def _del_(self):
108         print("敌机挂了")
109 
110 class PublicBullet(Base):
111     def __init__(self,x,y,screen):
112         super().__init__(screen)
113         self.imageName="./feiji/bullet-3.gif"
114         self.x = x+40
115         self.y = y-20
116         self.image = pygame.image.load(self.imageName).convert()
117     def move(self):
118         self.y-=4
119 
120     def display(self):
121         self.screen.blit(self.image,(self.x,self.y))
122     def judge(self):
123         if self.y<0 or self.y>860 :
124             return True
125         else:
126             return False
127 
128 #设置敌机精灵组
129 enemy = EnemyPlan(screen)
130 enemy1 = EnemyPlan(screen)
131 enemy2 = EnemyPlan(screen)
132 enemy3 = EnemyPlan(screen)
133 enemy4 = EnemyPlan(screen)
134 enemy5 = EnemyPlan(screen)
135 enemy6 = EnemyPlan(screen)
136 enemy7= EnemyPlan(screen)
137 enemy_group = pygame.sprite.Group(enemy,enemy1,enemy2,enemy3,enemy4,enemy5,enemy6,enemy7)
138 
139 gamePlan =GamePlan(screen)
140 def key_control(gamePlan):
141     for event in pygame.event.get():
142             #退出按钮
143          if event.type == QUIT:
144                 print("exit")
145                 exit()
146          elif event.type == CREAT_ENEMY:
147               enemy = EnemyPlan(screen)
148               enemy_group.add(enemy)
149             #按键
150          elif event.type == KEYDOWN:
151              if event.key == K_LEFT:
152                  gamePlan.moveLeft()
153              elif event.key == K_RIGHT:
154                  gamePlan.moveRight()
155              elif event.key == K_UP:
156                  gamePlan.moveUp()
157              elif event.key == K_DOWN:
158                  gamePlan.moveDown()
159              elif event.key == K_SPACE:
160                  gamePlan.shootbullet()
161 def main():
162     #创建一个窗口,用来显示内容
163     screen = pygame.display.set_mode((480,800),0,32)
164     #创建一个和窗口大小的图片,用来充当背景
165     background = pygame.image.load("./feiji/background.png").convert()
166     #
167     clock = pygame.time.Clock()
168     pygame.mixer.music.play(-1)
169     enemy_index = 0
170     plan_index = 0
171     score = 0
172     while True:
173         #设定需要显示的背景图
174        screen.blit(background,(0,0))
175        # 刷新帧率
176        clock.tick(60)
177        gamePlan.display()
178 
179        #让精灵组中所有精灵更新位置
180        enemy_group.update()
181        enemy_group.draw(screen)
182 
183        for enemy in enemy_group:
184            enemy.move()
185            x1 = enemy.rect.x
186            x2 = enemy.rect.x + 51
187            y1 = enemy.rect.y
188            y2 = enemy.rect.y + 39
189            for bullet in gamePlan.bulletList:
190                 x = bullet.x
191                 y = bullet.y
192                 a = x>x1 and x<x2 and y>y1 and y<y2
193                 if a:
194                    screen.blit(enemy.bombList[enemy_index],enemy.rect)
195                    enemy_index = (enemy_index +1)%3
196                    time.sleep(0.022)
197                    if enemy_index == 0:
198                        enemy_down_sound.play()
199                        enemy.kill()
200                        score +=10
201            c1 = gamePlan.rect.x
202            c2 = gamePlan.rect.x + 100
203            d1 = gamePlan.rect.y
204            b = c1<x2 and c2>x1 and d1<y2 
205            if b:
206                screen.blit(enemy.bombList[enemy_index],enemy.rect)
207                screen.blit(gamePlan.bombList[plan_index],gamePlan.rect)
208                plan_index = (plan_index +1)%3
209                time.sleep(0.022)
210                if plan_index == 0:
211                     me_down_sound.play()
212                     says =("Game Over!")
213                     my_font = pygame.font.SysFont("UbuntuMono-Bold1",84)
214                     says_suface = my_font.render(says,True,(10,10,10))
215                     pygame.image.save(says_suface,"hello.png")
216                     screen.blit(says_suface,(100,300))
217                     say = ("SCORE:%d"%score)
218                     my_font = pygame.font.SysFont("UbuntuMono-Bold1",64)
219                     say_surface = my_font.render(say,True,(0,0,0))
220                     pygame.image.save(say_surface,"12.png")
221                     screen.blit(say_surface,(150,400))
222 
223        key_control(gamePlan)
224        pygame.display.update()
225 if __name__ =="__main__":
226     
227     main()

 

posted @ 2018-04-20 18:55  开心消消乐a  阅读(6496)  评论(0编辑  收藏  举报