飞机大战游戏

一、主函数部分

  1 import pygame
  2 import sys
  3 import traceback
  4 from pygame.locals import *
  5 import myplane
  6 import enemy
  7 import bullet
  8 import supply
  9 import random
 10 
 11 pygame.init()
 12 bg_size = width, height = 400, 700
 13 screen = pygame.display.set_mode(bg_size)
 14 pygame.display.set_caption("飞机大战")
 15 
 16 background = pygame.image.load("images/background.png").convert()
 17 
 18 BLACK = (0,0,0)
 19 GREEN = (0, 255, 0)
 20 RED = (255, 0, 0)
 21 WHITE = (255,255,255)
 22 
 23 #载入游戏音乐
 24 pygame.mixer.music.load("sound/game_music.ogg")
 25 pygame.mixer.music.set_volume(0.2)
 26 bullet_sound = pygame.mixer.Sound("sound/bullet.wav")
 27 bullet_sound.set_volume(0.2)
 28 bomb_sound = pygame.mixer.Sound("sound/use_bomb.wav")
 29 bomb_sound.set_volume(0.2)
 30 supply_sound = pygame.mixer.Sound("sound/supply.wav")
 31 supply_sound.set_volume(0.2)
 32 get_bomb_sound = pygame.mixer.Sound("sound/get_bomb.wav")
 33 get_bomb_sound.set_volume(0.2)
 34 get_bullet_sound = pygame.mixer.Sound("sound/get_bullet.wav")
 35 get_bullet_sound.set_volume(0.2)
 36 upgrade_sound = pygame.mixer.Sound("sound/upgrade.wav")
 37 upgrade_sound.set_volume(0.2)
 38 enemy3_fly_sound = pygame.mixer.Sound("sound/enemy3_flying.wav")
 39 enemy3_fly_sound.set_volume(0.2)
 40 enemy1_down_sound = pygame.mixer.Sound("sound/enemy1_down.wav")
 41 enemy1_down_sound.set_volume(0.2)
 42 enemy2_down_sound = pygame.mixer.Sound("sound/enemy2_down.wav")
 43 enemy2_down_sound.set_volume(0.2)
 44 enemy3_down_sound = pygame.mixer.Sound("sound/enemy3_down.wav")
 45 enemy3_down_sound.set_volume(0.5)
 46 me_down_sound = pygame.mixer.Sound("sound/me_down.wav")
 47 me_down_sound.set_volume(0.2)
 48 
 49 def add_small_enemies(group1, group2, num):
 50     for i in range(num):
 51         e1 = enemy.SmallEnemy(bg_size)
 52         group1.add(e1)
 53         group2.add(e1)
 54 
 55 def add_mid_enemies(group1, group2, num):
 56     for i in range(num):
 57         e1 = enemy.MidEnemy(bg_size)
 58         group1.add(e1)
 59         group2.add(e1)
 60 
 61 def add_big_enemies(group1, group2, num):
 62     for i in range(num):
 63         e1 = enemy.BigEnemy(bg_size)
 64         group1.add(e1)
 65         group2.add(e1)
 66 
 67 def inc_speed(target, inc):
 68     for each in target:
 69         each.speed += inc
 70 
 71 def main():
 72     pygame.mixer.music.play(-1)
 73     
 74     clock = pygame.time.Clock()
 75 
 76     # 中弹图片索引
 77     e1_destroy_index = 0
 78     e2_destroy_index = 0
 79     e3_destroy_index = 0
 80     me_destroy_index = 0
 81 
 82     me = myplane.MyPlane(bg_size)
 83     
 84     enemies = pygame.sprite.Group()
 85 
 86     # 生成敌方小型飞机
 87     small_enemies = pygame.sprite.Group()
 88     add_small_enemies(small_enemies, enemies, 15)
 89 
 90     mid_enemies = pygame.sprite.Group()
 91     add_mid_enemies(mid_enemies, enemies, 5)
 92 
 93     big_enemies = pygame.sprite.Group()
 94     add_big_enemies(big_enemies, enemies, 1)
 95 
 96     running = True
 97     switch_image = True
 98     delay = 100
 99     score = 0
100     score_font = pygame.font.Font("font/font.ttf", 36)
101     
102     bullets = []
103 
104     # 生成普通子弹
105     bullet1 = []
106     bullet1_index = 0
107     BULLET1_NUM = 4
108     for i in range(BULLET1_NUM):
109         bullet1.append(bullet.Bullet1(me.rect.midtop))
110 
111     # 生命数量
112     life_image = pygame.image.load("images/life.png").convert_alpha()
113     life_rect = life_image.get_rect()
114     life_num = 5
115 
116     # 游戏结束画面
117     gameover_font = pygame.font.Font("font/font.ttf", 48)
118     again_image = pygame.image.load("images/again.png").convert_alpha()
119     again_rect = again_image.get_rect()
120     gameover_image = pygame.image.load("images/gameover.png").convert_alpha()
121     gameover_rect = gameover_image.get_rect()
122 
123     DOUBLE_BULLET_TIME = USEREVENT + 1
124 
125     # 解除我方飞机无敌状态
126     INVINCEBLE_TIME = USEREVENT + 2
127 
128 
129     # 生成超级子弹
130     bullet2 = []
131     bullet2_index = 0
132     BULLET2_NUM = 8
133     for i in range(BULLET2_NUM//2):
134         bullet2.append(bullet.Bullet2((me.rect.centerx - 33, me.rect.centery)))
135         bullet2.append(bullet.Bullet2((me.rect.centerx + 30, me.rect.centery)))
136 
137     # 标记是否使用超级子弹
138     is_double_bullet = False
139 
140     level = 1
141 
142     # 全屏炸弹
143     bomb_image = pygame.image.load("images/bomb.png").convert_alpha()
144     bomb_rect = bomb_image.get_rect()
145     bomb_font = pygame.font.Font("font/font.ttf", 48)
146     bomb_num = 3
147 
148     # 每30秒发放一个补给包
149     bullet_supply = supply.Bullet_Supply(bg_size)
150     bomb_supply = supply.Bomb_Supply(bg_size)
151     SUPPLY_TIME = USEREVENT
152     pygame.time.set_timer(SUPPLY_TIME, 30 *1000)
153 
154     # 阻止重复读取成绩记录文件
155     recorded = False
156 
157     # 标志是否暂停游戏
158     paused = False
159     paused_nor_image = pygame.image.load("images/pause_nor.png").convert_alpha()
160     pause_pressed_image = pygame.image.load("images/pause_pressed.png").convert_alpha()
161     resume_nor_image = pygame.image.load("images/resume_nor.png").convert_alpha()
162     resume_pressed_image = pygame.image.load("images/resume_pressed.png").convert_alpha()
163     paused_rect = paused_nor_image.get_rect()
164     paused_rect.left, paused_rect.top = width - paused_rect.width -10, 10
165     paused_image = paused_nor_image
166 
167     while running:
168         for event in pygame.event.get():
169             if event.type == QUIT:
170                 pygame.quit()
171                 sys.exit()
172             elif event.type == MOUSEBUTTONDOWN:
173                 if event.button == 1 and paused_rect.collidepoint(event.pos):
174                     paused = not paused
175                     if paused:
176                         pygame.time.set_timer(SUPPLY_TIME, 0)
177                         pygame.mixer.music.pause()
178                         pygame.mixer.pause()
179                         paused_image = resume_pressed_image
180                     else:
181                         pygame.time.set_timer(SUPPLY_TIME, 30 * 1000)
182                         pygame.mixer.music.unpause()
183                         pygame.mixer.unpause()
184                         paused_image = pause_pressed_image
185             elif event.type == MOUSEMOTION:
186                 if paused_rect.collidepoint(event.pos):
187                     if paused:
188                         paused_image = resume_pressed_image
189                     else:
190                         paused_image = pause_pressed_image
191                 else:
192                     if paused:
193                         paused_image = resume_nor_image
194                     else:
195                         paused_image = paused_nor_image
196             elif event.type == KEYDOWN:
197                 if event.key == K_SPACE:
198                     if bomb_num:
199                         bomb_num -= 1
200                         bomb_sound.play()
201                         for each in enemies:
202                             if each.rect.bottom > 0:
203                                 each.active = False
204             elif event.type == SUPPLY_TIME:
205                 supply_sound.play()
206                 if random.choice([True, False]):
207                     bomb_supply.reset()
208                 else:
209                     bullet_supply.reset()
210             elif event.type == DOUBLE_BULLET_TIME:
211                 is_double_bullet = False
212                 pygame.time.set_timer(DOUBLE_BULLET_TIME, 0)
213             elif event.type == INVINCEBLE_TIME:
214                 me.invincible = False
215                 pygame.time.set_timer(INVINCEBLE_TIME, 0)
216 
217 
218         # 根据用户的得分增加难度
219         if level == 1 and score > 50000:
220             level = 2
221             upgrade_sound.play()
222             add_small_enemies(small_enemies, enemies, 3)
223             add_mid_enemies(mid_enemies, enemies, 2)
224             add_big_enemies(big_enemies, enemies, 1)
225             inc_speed(small_enemies, 1)
226         elif level == 2 and score > 300000:
227             level = 3
228             upgrade_sound.play()
229             add_small_enemies(small_enemies, enemies, 5)
230             add_mid_enemies(mid_enemies, enemies, 3)
231             add_big_enemies(big_enemies, enemies, 2)
232             inc_speed(small_enemies, 1)
233             inc_speed(mid_enemies, 1)
234         elif level == 3 and score > 300000:
235             level = 4
236             upgrade_sound.play()
237             add_small_enemies(small_enemies, enemies, 5)
238             add_mid_enemies(mid_enemies, enemies, 3)
239             add_big_enemies(big_enemies, enemies, 2)
240             inc_speed(small_enemies, 1)
241             inc_speed(mid_enemies, 1)
242         elif level == 4 and score > 1000000:
243             level = 5
244             upgrade_sound.play()
245             add_small_enemies(small_enemies, enemies, 5)
246             add_mid_enemies(mid_enemies, enemies, 3)
247             add_big_enemies(big_enemies, enemies, 2)
248             inc_speed(small_enemies, 1)
249             inc_speed(mid_enemies, 1)
250 
251         screen.blit(background, (0,0))
252 
253         if life_num and not paused:
254             # 绘制全屏炸弹补给并检测是否获得
255             if bomb_supply.active:
256                 bomb_supply.move()
257                 screen.blit(bomb_supply.image, bomb_supply.rect)
258                 if pygame.sprite.collide_mask(bomb_supply, me):
259                     get_bomb_sound.play()
260                     if bomb_num < 3:
261                         bomb_num += 1
262                     bomb_supply.active = False
263 
264             #发射子弹
265             if not(delay % 10):
266                 bullet_sound.play()
267                 if is_double_bullet:
268                     bullets = bullet2
269                     bullets[bullet2_index].reset((me.rect.centerx - 33, me.rect.centery))
270                     bullets[bullet2_index + 1].reset((me.rect.centerx + 33, me.rect.centery))
271                     bullet2_index = (bullet2_index + 2) % BULLET2_NUM
272                 else:
273                     bullets = bullet1
274                     bullets[bullet1_index].reset(me.rect.midtop)
275                     bullet1_index = (bullet1_index + 1) % BULLET1_NUM
276 
277             #检测子弹是否击中敌机
278             for b in bullets:
279                 if b.active:
280                     b.move()
281                     screen.blit(b.image, b.rect)
282                     enemy_hit = pygame.sprite.spritecollide(b, enemies, False, pygame.sprite.collide_mask)
283                     if enemy_hit:
284                         b.active = False
285                         for e in enemy_hit:
286                             if e in mid_enemies or e in big_enemies:
287                                 e.hit = True
288                                 e.energy -= 1
289                                 if e.energy == 0:
290                                     e.active = False
291                             else:
292                                 e.active = False
293             
294             # 绘制全屏炸弹补给并检测是否获得
295             if bullet_supply.active:
296                 bullet_supply.move()
297                 screen.blit(bullet_supply.image, bullet_supply.rect)
298                 if pygame.sprite.collide_mask(bullet_supply, me):
299                     get_bullet_sound.play()
300                     is_double_bullet = True
301                     pygame.time.set_timer(DOUBLE_BULLET_TIME, 18 * 1000)
302                     bullet_supply.active = False
303 
304             # 绘制大型敌机
305             for each in big_enemies:
306                 if each.active:
307                     each.move()
308                     if each.hit:
309                         screen.blit(each.image_hit, each.rect)
310                         each.hit = False
311                     else:
312                         if switch_image:
313                             screen.blit(each.image1, each.rect)
314                         else:
315                             screen.blit(each.image2, each.rect)
316                     if each.rect.bottom == -50:
317                         enemy3_fly_sound.play(-1)
318 
319                     # 绘制血槽
320                     pygame.draw.line(screen, BLACK, \
321                             (each.rect.left, each.rect.top - 5),\
322                             (each.rect.right, each.rect.top - 5), \
323                             2)
324                     
325                     energy_remain = each.energy / enemy.BigEnemy.energy
326                     if energy_remain > 0.2:
327                         energy_color = GREEN
328                     else:
329                         energy_color = RED
330                     pygame.draw.line(screen, energy_color, \
331                             (each.rect.left, each.rect.top -5), \
332                             (each.rect.left + each.rect.width * energy_remain, \
333                             each.rect.top - 5), \
334                             2)
335 
336                 else:
337                     if not(delay % 3):
338                         if e3_destroy_index == 0:
339                             enemy3_down_sound.play()
340                         screen.blit(each.destroy_images[e3_destroy_index], each.rect)
341                         e3_destroy_index = (e3_destroy_index+1)%6
342                         if e3_destroy_index == 0:
343                             me_down_sound.stop()
344                             score += 10000
345                             each.reset()
346 
347             # 绘制中型敌机
348             for each in mid_enemies:
349                 if each.active:
350                     each.move()
351 
352                     if each.hit:
353                         screen.blit(each.image_hit, each.rect)
354                         each.hit = False
355                     else:
356                         screen.blit(each.image1, each.rect)
357 
358                     # 绘制血槽
359                     pygame.draw.line(screen, BLACK, \
360                             (each.rect.left, each.rect.top - 5),\
361                             (each.rect.right, each.rect.top - 5), \
362                             2)
363                     
364                     energy_remain = each.energy / enemy.MidEnemy.energy
365                     if energy_remain > 0.2:
366                         energy_color = GREEN
367                     else:
368                         energy_color = RED
369                     pygame.draw.line(screen, energy_color, \
370                             (each.rect.left, each.rect.top -5), \
371                             (each.rect.left + each.rect.width * energy_remain, \
372                             each.rect.top - 5), \
373                             2)
374                 else:
375                     if not(delay % 3):
376                         if e2_destroy_index ==0:
377                             enemy2_down_sound.play()
378                         screen.blit(each.destroy_images[e2_destroy_index], each.rect)
379                         e2_destroy_index = (e2_destroy_index+1)%4
380                         if e2_destroy_index == 0:
381                             score += 5000
382                             each.reset()
383 
384             # 绘制小型敌机
385             for each in small_enemies:
386                 if each.active:
387                     each.move()
388                     screen.blit(each.image1, each.rect)
389                 else:
390                     if not(delay % 3):
391                         if e1_destroy_index ==0:
392                             enemy1_down_sound.play()
393                         screen.blit(each.destroy_images[e1_destroy_index], each.rect)
394                         e1_destroy_index = (e1_destroy_index+1)%4
395                         if e1_destroy_index == 0:
396                             score += 1000
397                             each.reset()    
398 
399             key_pressed = pygame.key.get_pressed()
400             if key_pressed[K_w] or key_pressed[K_UP]:
401                 me.moveUp()
402             if key_pressed[K_s] or key_pressed[K_DOWN]:
403                 me.moveDown()
404             if key_pressed[K_a] or key_pressed[K_LEFT]:
405                 me.moveLeft()
406             if key_pressed[K_d] or key_pressed[K_RIGHT]:
407                 me.moveRight()
408 
409             # 检测我方飞机是否被撞
410             enemies_down = pygame.sprite.spritecollide(me, enemies, False, pygame.sprite.collide_mask)
411             if enemies_down and not me.invincible:
412                 me.active = False
413                 for e in enemies_down:
414                     e.active = False
415 
416             # 绘制我方飞机
417             if me.active:
418                 if switch_image:
419                     screen.blit(me.image1, me.rect)
420                 else:
421                     screen.blit(me.image2, me.rect)
422             else:
423                 me_down_sound.play()
424                 if not(delay % 3):
425                     screen.blit(each.destroy_images[me_destroy_index], each.rect)
426                     me_destroy_index = (me_destroy_index+1)%4
427                     # 剩余生命数量
428                     if me_destroy_index == 0:
429                         life_num -= 1
430                         me.reset()
431                         pygame.time.set_timer(INVINCEBLE_TIME, 3 * 1000)
432 
433              # 绘制剩余炸弹数量
434             bomb_text = bomb_font.render("x %d" % bomb_num, True, WHITE)
435             text_rect = bomb_text.get_rect()
436             screen.blit(bomb_image, (10, height-10 - bomb_rect.height))
437             screen.blit(bomb_text, (20 + bomb_rect.width, height - 5 - text_rect.height))
438 
439 
440             if life_num:
441                 for i in range(life_num):
442                     screen.blit(life_image,\
443                         (width - 10 - (i+1)*life_rect.width, \
444                         height - 10 - life_rect.height))
445             
446             score_text = score_font.render(str("Score: %s" % score), True, WHITE)
447             screen.blit(score_text, (10,5))
448         elif life_num == 0:
449             pygame.mixer.music.stop()
450             pygame.mixer.stop()
451 
452             # 停止发放补给
453             pygame.time.set_timer(SUPPLY_TIME, 0)
454 
455             if not recorded:
456                 recorded = True
457                 # 读取历史最高分
458                 with open("record.txt", "r") as f:
459                     record_score = int(f.read())
460             
461                 if score > record_score:
462                     with open("record.txt", "w") as f:
463                         f.write(str(score))
464 
465             # 绘制结束画面
466             record_score_text = score_font.render("Best: %d" % record_score,True,WHITE)
467             screen.blit(record_score_text, (50,50))
468             
469             gameover_text1 = gameover_font.render("Your Score: ", True, WHITE)
470             gameover_text1_rect = gameover_text1.get_rect()
471             gameover_text1_rect.left, gameover_text1_rect.top = \
472                                 (width - gameover_text1_rect.width) // 2, height // 2
473             screen.blit(gameover_text1, gameover_text1_rect)
474 
475             
476             gameover_text2 = gameover_font.render(str(score), True, WHITE)
477             gameover_text2_rect = gameover_text2.get_rect()
478             gameover_text2_rect.left, gameover_text2_rect.top = \
479                                 (width - gameover_text2_rect.width) // 2, \
480                                 gameover_text1_rect.bottom + 10
481             screen.blit(gameover_text2, gameover_text2_rect)
482 
483             again_rect.left, again_rect.top = \
484                         (width - again_rect.width) // 2,\
485                         gameover_text2_rect.bottom + 50
486             screen.blit(again_image, again_rect)
487 
488             gameover_rect.left, gameover_rect.top = \
489                         (width - again_rect.width) // 2, \
490                         again_rect.bottom + 10
491             screen.blit(gameover_image, gameover_rect)
492 
493             # 检测用户的鼠标操作
494             # 如果用户按下鼠标左键
495             if pygame.mouse.get_pressed()[0]:
496                 pos = pygame.mouse.get_pos()
497                 if again_rect.left < pos[0] < again_rect.right and \
498                    again_rect.top < pos[1] < again_rect.bottom:
499                     main()
500                 elif gameover_rect.left < pos[0] < gameover_rect.right and \
501                      gameover_rect.top < pos[1] < gameover_rect.bottom:
502                      pygame.quit()
503                      sys.exit()
504 
505         screen.blit(paused_image, paused_rect)
506 
507         # 切换图片
508         if not(delay % 5):
509             switch_image = not switch_image
510 
511         delay -= 1
512         if not delay:
513             delay = 100
514 
515         pygame.display.flip()
516         clock.tick(60)
517 
518 if __name__ == "__main__":
519     try:
520         main()
521     except SystemExit:
522         pass
523     except:
524         traceback.print_exc()
525         pygame.quit()
526         input()
527     

二、自己操控的飞机代码

 1 import pygame
 2 
 3 class MyPlane(pygame.sprite.Sprite):
 4     def __init__(self, bg_size):
 5         pygame.sprite.Sprite.__init__(self)
 6 
 7         self.image1 = pygame.image.load("images/me1.png").convert_alpha()
 8         self.image2 = pygame.image.load("images/me2.png").convert_alpha()
 9         self.destroy_image = []
10         self.destroy_image.extend([\
11             pygame.image.load("images/me_destroy_1.png").convert_alpha(),\
12             pygame.image.load("images/me_destroy_2.png").convert_alpha(),\
13             pygame.image.load("images/me_destroy_3.png").convert_alpha(),\
14             pygame.image.load("images/me_destroy_4.png").convert_alpha(),\
15         ])
16         self.active = True
17         self.rect = self.image1.get_rect()
18         self.width, self.height = bg_size[0], bg_size[1]
19         self.rect.left, self.rect.top = \
20                         (self.width - self.rect.width) // 2, \
21                         self.height - self.rect.height - 60
22         self.speed = 10
23         self.mask = pygame.mask.from_surface(self.image1)
24         self.invincible = False
25 
26     def moveUp(self):
27         if self.rect.top > 0:
28             self.rect.top -= self.speed
29         else:
30             self.rect.top = 0
31 
32     def moveDown(self):
33         if self.rect.bottom < self.height - 60:
34             self.rect.top += self.speed
35         else:
36             self.rect.bottom = self.height - 60
37     def moveLeft(self):
38         if self.rect.left > 0:
39             self.rect.left -= self.speed
40         else:
41             self.rect.left = 0
42 
43     def moveRight(self):
44         if self.rect.right < self.width:
45             self.rect.left += self.speed
46         else:
47             self.rect.right = self.width
48 
49     def  reset(self):
50         self.rect.left, self.rect.top = \
51                         (self.width - self.rect.width) // 2, \
52                         self.height - self.rect.height - 60
53         self.active = True
54         self.invincible = True
55 
56 
57         

三、敌机部分代码

  1 import pygame
  2 from random import *
  3 
  4 class SmallEnemy(pygame.sprite.Sprite):
  5     def __init__(self, bg_size):
  6         pygame.sprite.Sprite.__init__(self)
  7 
  8         self.image1 = pygame.image.load("images/enemy1.png").convert_alpha()
  9         self.destroy_images = []
 10         self.destroy_images.extend([\
 11             pygame.image.load("images/enemy1_down1.png").convert_alpha(),\
 12             pygame.image.load("images/enemy1_down2.png").convert_alpha(),\
 13             pygame.image.load("images/enemy1_down3.png").convert_alpha(),\
 14             pygame.image.load("images/enemy1_down4.png").convert_alpha(),\
 15         ])
 16         self.rect = self.image1.get_rect()
 17         self.width, self.height = bg_size[0],bg_size[1]
 18         self.speed = 2
 19         self.active = True
 20         self.rect.left, self.rect.top = \
 21                         randint(0, self.width - self.rect.width),\
 22                         randint(-5*self.height,0)
 23         self.mask = pygame.mask.from_surface(self.image1)
 24     
 25     def move(self):
 26         if self.rect.top < self.height:
 27             self.rect.top += self.speed
 28         else:
 29             self.reset()
 30         
 31     def reset(self):
 32         self.active = True
 33         self.rect.left, self.rect.top = \
 34                         randint(0, self.width - self.rect.width),\
 35                         randint(-5*self.height, 0)
 36 
 37 
 38 class MidEnemy(pygame.sprite.Sprite):
 39     energy = 18
 40 
 41     def __init__(self, bg_size):
 42         pygame.sprite.Sprite.__init__(self)
 43 
 44         self.image1 = pygame.image.load("images/enemy2.png").convert_alpha()
 45         self.image_hit = pygame.image.load("images/enemy2_hit.png").convert_alpha()
 46         self.destroy_images = []
 47         self.destroy_images.extend([\
 48             pygame.image.load("images/enemy2_down1.png").convert_alpha(),\
 49             pygame.image.load("images/enemy2_down2.png").convert_alpha(),\
 50             pygame.image.load("images/enemy2_down3.png").convert_alpha(),\
 51             pygame.image.load("images/enemy2_down4.png").convert_alpha(),\
 52         ])
 53         self.rect = self.image1.get_rect()
 54         self.width, self.height = bg_size[0],bg_size[1]
 55         self.speed = 1
 56         self.active = True
 57         self.hit = False
 58         self.energy = MidEnemy.energy
 59         self.rect.left, self.rect.top = \
 60                         randint(0, self.width - self.rect.width),\
 61                         randint(-5*self.height,-self.height)
 62         self.mask = pygame.mask.from_surface(self.image1)
 63     
 64     def move(self):
 65         if self.rect.top < self.height:
 66             self.rect.top += self.speed
 67         else:
 68             self.reset()
 69         
 70     def reset(self):
 71         self.active = True
 72         self.energy = MidEnemy.energy
 73         self.rect.left, self.rect.top = \
 74                         randint(0, self.width - self.rect.width),\
 75                         randint(-8*self.height,-self.height)
 76 
 77 
 78 class BigEnemy(pygame.sprite.Sprite):
 79     energy = 20
 80 
 81     def __init__(self, bg_size):
 82         pygame.sprite.Sprite.__init__(self)
 83 
 84         self.image1 = pygame.image.load("images/enemy3_n1.png").convert_alpha()
 85         self.image2 = pygame.image.load("images/enemy3_n2.png").convert_alpha()
 86         self.image_hit = pygame.image.load("images/enemy3_hit.png").convert_alpha()
 87         self.destroy_images = []
 88         self.destroy_images.extend([\
 89             pygame.image.load("images/enemy3_down1.png").convert_alpha(),\
 90             pygame.image.load("images/enemy3_down2.png").convert_alpha(),\
 91             pygame.image.load("images/enemy3_down3.png").convert_alpha(),\
 92             pygame.image.load("images/enemy3_down4.png").convert_alpha(),\
 93             pygame.image.load("images/enemy3_down5.png").convert_alpha(),\
 94             pygame.image.load("images/enemy3_down6.png").convert_alpha(),\
 95         ])
 96         self.rect = self.image1.get_rect()
 97         self.width, self.height = bg_size[0],bg_size[1]
 98         self.speed = 1
 99         self.active = True
100         self.hit = False
101         self.energy = BigEnemy.energy
102         self.rect.left, self.rect.top = \
103                         randint(0, self.width - self.rect.width),\
104                         randint(-10*self.height,-5*self.height)
105         self.mask = pygame.mask.from_surface(self.image1)
106     
107     def move(self):
108         if self.rect.top < self.height:
109             self.rect.top += self.speed
110         else:
111             self.reset()
112         
113     def reset(self):
114         self.energy = BigEnemy.energy
115         self.active = True
116         self.rect.left, self.rect.top = \
117                         randint(0, self.width - self.rect.width),\
118                         randint(-10*self.height,-5*self.height)

四、子弹部分代码

 1 import pygame
 2 
 3 class Bullet1(pygame.sprite.Sprite):
 4     def __init__(self, positon):
 5         pygame.sprite.Sprite.__init__(self)
 6 
 7         self.image = pygame.image.load("images/bullet1.png").convert_alpha()
 8         self.rect = self.image.get_rect()
 9         self.rect.left, self.rect.top = positon
10         self.speed = 12
11         self.active = True
12         self.mask = pygame.mask.from_surface(self.image)
13 
14     def move(self):
15         self.rect.top -= self.speed
16 
17         if self.rect.top < 0:
18             self.active = False
19     
20     def reset(self, position):
21         self.rect.left, self.rect.top = position
22         self.active = True
23 
24 class Bullet2(pygame.sprite.Sprite):
25     def __init__(self, positon):
26         pygame.sprite.Sprite.__init__(self)
27 
28         self.image = pygame.image.load("images/bullet2.png").convert_alpha()
29         self.rect = self.image.get_rect()
30         self.rect.left, self.rect.top = positon
31         self.speed = 50
32         self.active = True
33         self.mask = pygame.mask.from_surface(self.image)
34 
35     def move(self):
36         self.rect.top -= self.speed
37 
38         if self.rect.top < 0:
39             self.active = False
40     
41     def reset(self, position):
42         self.rect.left, self.rect.top = position
43         self.active = True

 

posted @ 2019-09-13 10:52  Aiden_Shao  阅读(238)  评论(0编辑  收藏  举报