• 飞机大战游戏


    一、主函数部分

      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.
    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
  • 相关阅读:
    对话框中获取Month Calendar的当前日期
    JAVA GUI程序示例
    MFC控件显示值和控件变量值的更新
    JAVA求10到99的随机数
    学习之路二:关于集合和数组内在联系的深入了解
    迭代器学习之三:IEnumerable和IEnumerator的泛型结构
    迭代器学习之四:关于yield的深入了解
    迭代器学习之二:数组的可枚举类型和枚举数的定义以及编译器的foreach工作原理
    学习之路三:关于运用单线程和委托以及事件自定义Timer类
    迭代器学习之一:使用IEnumerable和IEnumerator接口
  • 原文地址:https://www.cnblogs.com/intruder/p/11516259.html
Copyright © 2020-2023  润新知