Exemplo n.º 1
0
def main():
    pygame.mixer.music.play(-1)

    #生成我方飞机
    me = myplane.Myplane(bg_size)

    enemies = pygame.sprite.Group()

    #生成敌方小型飞机
    S_enemies = pygame.sprite.Group()
    add_S_enemies(S_enemies, enemies, 15)
    #生成敌方中型飞机
    M_enemies = pygame.sprite.Group()
    add_M_enemies(M_enemies, enemies, 5)
    #生成敌方大型飞机
    X_enemies = pygame.sprite.Group()
    add_X_enemies(X_enemies, enemies, 2)

    #生成普通子弹
    bullet1 = []
    bullet1_index = 0
    BULLET_NUM = 5
    for i in range(BULLET_NUM):
        bullet1.append(bullet.Bullet1(me.rect.midtop))
    #生成超级子弹
    bullet2 = []
    double_bullet = False
    bullet2_index = 0
    BULLET2_NUM = 10
    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)))

    clock = pygame.time.Clock()

    #毁灭图片索引
    e1_destory_index = 0
    e2_destory_index = 0
    e3_destory_index = 0
    me_destory_index = 0

    #统计得分
    score = 0

    #设置游戏难度
    level = 1

    #设置全屏炸弹
    bomb_image = pygame.image.load("images/bomb.png").convert_alpha()
    bomb_rect = bomb_image.get_rect()
    bomb_num = 3
    bomb_rect.left, bomb_rect.bottom = 0, height

    #每10秒发放一个补给包
    bullet_supply = supply.Bullet_supply(bg_size)
    bomb_supply = supply.Bomb_supply(bg_size)
    SUPPLY_TIME = USEREVENT
    pygame.time.set_timer(SUPPLY_TIME, 15 * 1000)

    #用于解除超级子弹状态定时器
    DOUBLE_BULLET_TIME = USEREVENT + 1

    #用于切换我方飞机图片
    switch_image = True

    #用于绘制暂停按钮
    paused = False
    pause_image1 = pygame.image.load("images/pause1.png").convert_alpha()
    pause_image = pygame.image.load("images/pause2.png").convert_alpha()
    pause_rect = pause_image.get_rect()
    pause_rect.right, pause_rect.top = width, 0

    #生命数量
    life_num = 3
    life_image = pygame.image.load("images/life_image.png").convert_alpha()
    life_rect = life_image.get_rect()
    life_rect.right, life_rect.bottom = width, height

    #用于绘制结束画面
    game_over_image1 = pygame.image.load(
        "images/game_over2.png").convert_alpha()
    game_over_image2 = pygame.image.load(
        "images/game_over1.png").convert_alpha()
    game_over_image_rect = game_over_image1.get_rect()
    game_over_image_rect.centerx, game_over_image_rect.centery = width / 2, height / 2

    #用于阻止重复打开recored
    recoreded = False

    #用于延迟
    delay = 100

    running = True

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

            elif event.type == MOUSEBUTTONDOWN:
                if event.button == 1 and pause_rect.collidepoint(event.pos):
                    paused = not paused
                    pause_image, pause_image1 = pause_image1, pause_image

                elif event.button == 1 and game_over_image_rect.collidepoint(
                        event.pos) and life_num == 0:
                    main()

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

            elif event.type == DOUBLE_BULLET_TIME:
                double_bullet = False
                pygame.time.set_timer(DOUBLE_BULLET_TIME, 0)

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

        screen.blit(background1.image, background1.rect)
        screen.blit(background2.image, background2.rect)
        screen.blit(cloud1.image_s, cloud1.image_rect)
        screen.blit(cloud2.image_s, cloud2.image_rect)

        #绘制界面UI
        if life_num:
            #绘制暂停按钮
            screen.blit(pause_image, pause_rect)

            #绘制全屏炸弹示意图
            for i in range(bomb_num):
                bomb_rect.left = bomb_rect.left + i * bomb_rect.width
                screen.blit(bomb_image, bomb_rect)
                bomb_rect.left = 0
            #绘制剩余生命示意图
            for i in range(life_num):
                life_rect.right = life_rect.right - i * life_rect.width
                screen.blit(life_image, life_rect)
                life_rect.right = width
            #绘制结束画面
        else:
            #停止播放背景音乐
            pygame.mixer.music.stop()
            #停止播放全部营销
            pygame.mixer.stop()
            #停止发放补给
            pygame.time.set_timer(SUPPLY_TIME, 0)
            screen.blit(game_over_image1, game_over_image_rect)
            screen.blit(
                game_over_image2,
                (game_over_image_rect.left, game_over_image_rect.top + 64))

            #读取历史最高得分
            if not recoreded:
                recoreded = 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))

        #根据用户的得分增加难度
        if level == 1 and score == 5000:
            level = 2
            upgrade_sound.play()
            #增加 3架小型敌机、两两架中型敌机和一架大型敌机
            add_S_enemies(S_enemies, enemies, 5)
            add_M_enemies(M_enemies, enemies, 3)
            add_X_enemies(X_enemies, enemies, 1)
            #提升小型敌机的速度
            inc_speed(S_enemies, 1)
        elif level == 2 and score > 30000:
            level = 3
            upgrade_sound.play()
            #增加3架小型敌机、两两架中型敌机和一架大型敌机
            add_S_enemies(S_enemies, enemies, 5)
            add_M_enemies(M_enemies, enemies, 3)
            add_X_enemies(X_enemies, enemies, 1)
            #提升小型敌机的速度
            inc_speed(S_enemies, 2)
            inc_speed(M_enemies, 3)
        elif level == 3 and score > 100000:
            level = 4
            upgrade_sound.play()
            #增加3架小型敌机、两两架中型敌机和一架大型敌机
            add_S_enemies(S_enemies, enemies, 10)
            add_M_enemies(M_enemies, enemies, 5)
            add_X_enemies(X_enemies, enemies, 3)
            #提升小型敌机的速度
            inc_speed(S_enemies, 1)
            inc_speed(M_enemies, 1)

        if not paused and life_num:

            #背景移动
            background1.move()
            background2.move()
            cloud1.move()
            cloud2.move()

            #检测键盘输入
            key_pressed = pygame.key.get_pressed()

            if key_pressed[K_w] or key_pressed[K_UP]:
                me.move("Up")
            if key_pressed[K_s] or key_pressed[K_DOWN]:
                me.move("Down")
            if key_pressed[K_a] or key_pressed[K_LEFT]:
                me.move("Left")
            if key_pressed[K_d] or key_pressed[K_RIGHT]:
                me.move("Right")

            #用于设置护盾
            if key_pressed[K_LCTRL] or key_pressed[K_RCTRL]:
                me.invincible = True
            else:
                me.invincible = False

            #绘制全屏炸弹补给并检测是否获得
            if bomb_supply.active:
                bomb_supply.move()
                screen.blit(bomb_supply.image, bomb_supply.rect)
                if pygame.sprite.collide_mask(bomb_supply, me):
                    get_supply_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_supply_sound.play()
                    double_bullet = True
                    bullet_supply.active = False
                    pygame.time.set_timer(DOUBLE_BULLET_TIME, 5 * 1000)

            #发射子弹
            if not (delay % 10):
                if double_bullet:
                    bullets = bullet2
                    bullets[bullet2_index].reset(
                        (me.rect.centerx - 20, me.rect.centery))
                    bullets[bullet2_index + 1].reset(
                        (me.rect.centerx + 20, 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) % BULLET_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 M_enemies or e in X_enemies:
                                e.HP -= 1
                                e.hit = True
                                if e.HP == 0:
                                    e.active = False
                            else:
                                e.active = False

            #绘制大型敌机
            for each in X_enemies:
                if each.active:
                    each.move()
                    screen.blit(each.image, each.rect)
                    each.fly_image_rect.center = each.rect.center
                    screen.blit(each.fly_images[4], each.fly_image_rect)
                    if not (delay % 2):
                        screen.blit(each.fly_images[e3_destory_index],
                                    each.fly_image_rect)
                        e3_destory_index = (e3_destory_index + 1) % 4

                    #绘制大型敌机HP
                    pygame.draw.line(screen,black,\
                                    (each.rect.left,each.rect.top-5),\
                                    (each.rect.right,each.rect.top-5),2)
                    #当生命大于百分之20显示绿色,否则显示红色
                    HP_remain = each.HP / enemy.X_enemy.HP
                    if HP_remain > 0.2:
                        HP_color = green
                    else:
                        HP_color = red
                    pygame.draw.line(screen,HP_color,\
                                    (each.rect.left,each.rect.top-5),\
                                    (each.rect.left+each.rect.width*HP_remain,\
                                    each.rect.top-5),2)

                    if each.rect.bottom == -50:
                        X_enemy_out.play(-1)
                else:
                    #毁灭
                    if not (delay % 3):
                        screen.blit(each.destroy_images[e3_destory_index],
                                    each.rect)
                        e3_destory_index = (e3_destory_index + 1) % 4
                        if e3_destory_index == 0:
                            X_enemy_out.stop()
                            X_enemy_down.play()
                            score += 10000
                            each.reset()

            #绘制中型敌机
            for each in M_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)
                    #绘制大型敌机HP
                    pygame.draw.line(screen,black,\
                                    (each.rect.left,each.rect.top-5),\
                                    (each.rect.right,each.rect.top-5),2)
                    #当生命大于百分之20显示绿色,否则显示红色
                    HP_remain = each.HP / enemy.M_enemy.HP
                    if HP_remain > 0.2:
                        HP_color = green
                    else:
                        HP_color = red
                    pygame.draw.line(screen,HP_color,\
                                    (each.rect.left,each.rect.top-5),\
                                    (each.rect.left+each.rect.width*HP_remain,\
                                    each.rect.top-5),2)

                else:
                    #毁灭
                    if not (delay % 3):
                        screen.blit(each.destroy_images[e3_destory_index],
                                    each.rect)
                        e2_destory_index = (e2_destory_index + 1) % 4
                        if e2_destory_index == 0:
                            S_enemy_down.play()
                            score += 3000
                            each.reset()

            #绘制小型敌机
            for each in S_enemies:
                if each.active:
                    each.move()
                    screen.blit(each.image, each.rect)
                else:
                    #毁灭
                    if not (delay % 6):
                        screen.blit(each.destroy_images[e3_destory_index],
                                    each.rect)
                        e1_destory_index = (e1_destory_index + 1) % 4
                        S_enemy_down.play()
                        if e1_destory_index == 0:
                            score += 1000
                            each.reset()

            #j检测我方飞机是否被撞
            if me.invincible:
                me.mask = me.masks[1]
            else:
                me.mask = me.masks[0]
            enemies_down = pygame.sprite.spritecollide(
                me, enemies, False, pygame.sprite.collide_mask)
            if enemies_down:
                if not me.invincible:
                    me.active = False
                for e in enemies_down:
                    e.active = False

            #绘制我方飞机动画
            if me.active:
                if me.invincible:
                    me.invincible_image_rect.center = me.rect.center
                    screen.blit(me.invincible_image, me.invincible_image_rect)
                if switch_image:
                    screen.blit(me.image1, me.rect)
                else:
                    screen.blit(me.image2, me.rect)
            else:
                #我方毁灭
                if not (delay % 3):
                    screen.blit(each.destroy_images[me_destory_index],
                                each.rect)
                    me_destory_index = (me_destory_index + 1) % 4
                    if me_destory_index == 0:
                        me_down.play()
                        if life_num:
                            life_num -= 1
                            me.reset()
            screen.blit(cloud1.image_s, cloud1.image_rect)
            screen.blit(cloud2.image_s, cloud2.image_rect)

            #切换图片
            if not (delay % 5):
                switch_image = not switch_image
            delay -= 1
            if not delay:
                delay = 100
                print("战争文本 Score:%d 炸弹数量:%d 剩余数量%d" %
                      (score, bomb_num, life_num))

        pygame.display.flip()

        clock.tick(60)
Exemplo n.º 2
0
def main():
    clock = pygame.time.Clock()
    runing = True
    switch_image = True  #用于切换飞机状态
    delay = 100  # 用于延迟的变量
    #中弹图像索引
    e1_destory_index = 0
    e2_destory_index = 0
    e3_destory_index = 0
    me_destory_index = 0

    # 一直循环播放背景音乐
    pygame.mixer.music.play(-1)

    #生成我方飞机
    me = myplane.Myplane(bg_size)
    # 生成敌方飞机

    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, 5)
    # 生成敌方大型飞机
    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))

    while (runing):
        for event in pygame.event.get():
            #当点击右上角关闭时退出游戏
            if event.type == QUIT:
                pygame.quit()
                sys.exit()

        #检测用户的键盘操作
        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()

        screen.blit(background, (0, 0))
        #发射子弹
        if not (delay % 10):
            bullet1[bullet1_index].reset(me.rect.midtop)
            bullet1_index = (bullet1_index + 1) % BULLET1_NUM
        #检测子弹是否击中敌机
        for b in bullet1:
            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:
                        e.energy -= 1
                        if e.energy == 0:
                            e.active = False

        #绘制大型敌机
        for each in big_enemies:
            if each.active:
                each.move()
                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_collor = GREEN
                else:
                    energy_collor = RED
                pygame.draw.line(screen, energy_collor, \
                    (each.rect.left, each.rect.top - 5), \
                    (each.rect.left + each.rect.width*energy_remain,\
                     each.rect.top -5), \
                    2)
                #boss即将进入画面中时播放音效
                if each.rect.bottom == -50:
                    enemy3_fly_sound.play(-1)
            else:  #毁灭
                if (e3_destory_index == 0):
                    enemy3_down_sound.play()
                if not (delay % 3):
                    screen.blit(each.destory_images[e3_destory_index],
                                each.rect)
                    e3_destory_index += 1
                    if e3_destory_index == 6:
                        e3_destory_index = 0
                        enemy3_fly_sound.stop()
                        each.reset()

        #绘制中型敌机
        for each in mid_enemies:
            if each.active:
                each.move()
                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_collor = GREEN
                else:
                    energy_collor = RED
                pygame.draw.line(screen, energy_collor, \
                                 (each.rect.left, each.rect.top - 5), \
                                 (each.rect.left + each.rect.width * energy_remain, \
                                  each.rect.top - 5), \
                                 2)
            else:
                if e2_destory_index == 0:
                    enemy2_down_sound.play()
                if not (delay % 3):
                    screen.blit(each.destory_images[e2_destory_index],
                                each.rect)
                    e2_destory_index += 1
                    if e2_destory_index == 4:
                        e2_destory_index = 0
                        each.reset()

        #绘制小型敌机
        for each in small_enemies:
            if each.active:
                each.move()
                screen.blit(each.image, each.rect)
            else:
                if e1_destory_index == 0:
                    enemy1_down_sound.play()
                if not (delay % 3):
                    screen.blit(each.destory_images[e1_destory_index],
                                each.rect)
                    e1_destory_index += 1
                    if e1_destory_index == 4:
                        e1_destory_index = 0
                        each.reset()
        #检测我方飞机是否被撞
        enemies_down = pygame.sprite.spritecollide(me, enemies, False,
                                                   pygame.sprite.collide_mask)
        if enemies_down:
            # me.life -= 1
            # if me.life == 0:
            #     me.active = False
            for e in enemies_down:
                e.active = False
        #绘制我方飞机
        if me.active:
            if (delay % 5 == 0):
                switch_image = not switch_image
            if (switch_image):
                screen.blit(me.image1, me.rect)
            else:
                screen.blit(me.image2, me.rect)
        else:
            me_down_sound.play()
            if not (delay % 3):
                screen.blit(me.destory_images[me_destory_index], me.rect)
                me_destory_index += 1
                if me_destory_index == 4:
                    me_destory_index = 0

        delay -= 1
        if (not delay):
            delay = 100

        pygame.display.flip()
        clock.tick(60)
Exemplo n.º 3
0
def main():
    #  If the loops is -1 then the music will repeat indefinitely.
    pygame.mixer.music.play(-1)

    # create an object to help track time.
    # The clock also provides several functions to help control a game's framerate.
    clock = pygame.time.Clock()


    # 生成我方飞机
    me = myplane.Myplane(bg_size)

    # 生成敌机
    enemies = pygame.sprite.Group()

    # 生成敌方小飞机
    small_enemies = pygame.sprite.Group()
    add_small_enemies(small_enemies, enemies, 5)

    # 生成敌方中飞机
    mid_enemies = pygame.sprite.Group()
    add_mid_enemies(mid_enemies, enemies, 25)

    # 生成敌方大飞机
    big_enemies = pygame.sprite.Group()
    add_big_enemies(big_enemies, enemies, 3)

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

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

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

    # 难度等级
    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

    # 每30s发放一个补给包
    bullet_supply = supply.BulletSupply(bg_size)
    bomb_supply = supply.BombSupply(bg_size)
    SUPPLY_TIME = USEREVENT
    pygame.time.set_timer(SUPPLY_TIME, 30 * 1000)

    # 游戏结束画面
    gameover_font = pygame.font.Font("font/font.ttf", 48)
    again_image = pygame.image.load("images/again.png").convert_alpha()
    again_rect = again_image.get_rect()
    gameover_image = pygame.image.load("images/gameover.png").convert_alpha()
    gameover_rect = gameover_image.get_rect()

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

    # 无敌时间计时器
    INVINCIBLE_TIME = USEREVENT + 2

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

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

    # 暂停设置
    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

    # 飞机爆炸索引
    e1_destroy_index = 0
    e2_destroy_index = 0
    e3_destroy_index = 0
    me_destroy_index = 0

    # 用于切换图片
    switch_image = True

    # 用于延迟
    delay = 100
    running = True

    # 用于限制重复打开存取记录
    recorded = False

    while running:
        # get events from the queue
        for event in pygame.event.get():
            # 游戏退出事件
            if event.type == QUIT:
                pygame.quit()
                sys.exit()

            # 鼠标点击事件
            elif 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()
                    else:
                        pygame.time.set_timer(SUPPLY_TIME, 30 * 1000)
                        pygame.mixer.music.unpause()
                        pygame.mixer.unpause()

            # 鼠标移动事件(悬停)
            elif 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

            # 空格点击事件
            elif 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

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

            elif event.type == DOUBBLE_BULLET_TIME:
                is_doubble_bullet = False
                pygame.time.set_timer(DOUBBLE_BULLET_TIME, 0)

            elif 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 > 1000000:
            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)

        # 绘制背景图片
        # blit: draw one image onto another
        # surface.blit(source, dest, area=None, special_flags=0) -> Rect
        screen.blit(background, (0, 0))

        if life_num > 0 and not paused:
            # 检测用户的键盘操作
            key_press = pygame.key.get_pressed()
            if key_press[K_w] or key_press[K_UP]:
                me.moveUp()
            if key_press[K_s] or key_press[K_DOWN]:
                me.moveDown()
            if key_press[K_a] or key_press[K_LEFT]:
                me.moveLeft()
            if key_press[K_d] or key_press[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_doubble_bullet = True
                    pygame.time.set_timer(DOUBBLE_BULLET_TIME, 18 * 1000)
                    bullet_supply.active = False

            # 每十帧发射一颗子弹
            if not(delay % 10):
                bullet_sound.play()
                if is_doubble_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) % BULLET_NUM2

                else:
                    bullets = bullet1
                    bullets[bullet1_index].reset(me.rect.midtop)
                    bullet1_index = (bullet1_index + 1) % BULLET_NUM1

            # 检测子弹是否击中敌机
            for b in bullets:
                if b.active:
                    # 绘制子弹
                    b.move()
                    screen.blit(b.image, b.rect)
                    # enemy_hit中存放由pygame.sprite.spritecollide返回的敌机对象
                    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 big_enemies or e in mid_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.hit_image, 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 + energy_remain * each.rect.width, 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_image[e3_destroy_index], each.rect)
                        e3_destroy_index = (e3_destroy_index+1) % 6
                        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.hit_image, 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 + energy_remain * each.rect.width, each.rect.top - 5), \
                                     2)
                else:
                    # 毁灭
                    if not(delay % 3):
                        if e2_destroy_index == 0:
                            enemy2_down_sound.play()
                        screen.blit(each.destroy_image[e2_destroy_index], each.rect)
                        e2_destroy_index = (e2_destroy_index+1) % 4
                        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_image[e1_destroy_index], each.rect)
                        e1_destroy_index = (e1_destroy_index + 1) % 4
                        if e1_destroy_index == 0:
                            score += 1000
                            each.reset()

            # 检测我方飞机是否碰撞
            enemy_down = pygame.sprite.spritecollide(me, enemies, False, pygame.sprite.collide_mask)
            if enemy_down and not me.invincible:
                me.active = False
                for e in enemy_down:
                    e.active = False

            # 绘制我方飞机(动态效果)
            if me.active:
                if switch_image:
                    screen.blit(me.image1, me.rect)
                else:
                    screen.blit(me.image2, me.rect)
            else:
                # 毁灭
                if not(delay % 3):
                    if me_destroy_index == 0:
                        me_down_sound.play()
                    screen.blit(me.destroy_image[me_destroy_index], me.rect)
                    me_destroy_index = (me_destroy_index+1) % 4
                    if me_destroy_index == 0:
                        life_num -= 1
                        me.reset()
                        # 调用无敌时间计时器
                        pygame.time.set_timer(INVINCIBLE_TIME, 3 * 1000)

            # 绘制全屏炸弹数量
            bomb_text = bomb_font.render("x %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 - bomb_rect.height))

            # 绘制生命数量
            if life_num > 0:
                for i in range(life_num):
                    screen.blit(life_image,\
                                (width - 10 - (i+1) * life_rect.width, \
                                 height - 10 - life_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("D:\\Desktop\\python\\python_basics\\100day\\train_project\\pygame\\record.txt", "r") as f:
                    record_score = int(f.read())

                # 如果玩家分数高于历史最高峰,则存档
                if score > record_score:
                    with open("D:\\Desktop\\python\\python_basics\\100day\\train_project\\pygame\\record.txt", "w") as f:
                        f.write(str(score))

            # 绘制结束画面
            record_score_text = score_font.render("Best: %d" % record_score, True, WHITE)
            screen.blit(record_score_text, (50, 50))

            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 // 2
            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.left, again_rect.top = \
                (width - again_rect.width) // 2, \
                gameover_text2_rect.bottom + 50
            screen.blit(again_image, again_rect)

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


        # 绘制暂停按钮
        screen.blit(pause_image,pause_rect)

        # 在循环内不断切换,5帧切换一次
        if not(delay % 5):
            switch_image = not switch_image
        delay -= 1
        if not delay:
            delay = 100

        # 更新整个待显示的 Surface 对象到屏幕上
        pygame.display.flip()

        clock.tick(60)
Exemplo n.º 4
0
def main():

    clock = pygame.time.Clock()
    plane = myplane.Myplane(480, 700)
    bullet_list = [bullet.Bullet(plane.rect) for x in range(4)]
    bullet_index = 0
    delay = 0
    doubullet_list = [bullet.DouBullet(plane.rect) for x in range(4)]
    doubullet_index = 0
    doubullet1_list = [bullet.DouBullet1(plane.rect) for x in range(4)]
    doubullet1_index = 0
    enemys_group = pygame.sprite.Group(
        [enemy.Enemy(480, 700)
         for x in range(10)] + [enemy.Enemyz(480, 700) for x in range(5)] +
        [enemy.Enemyd(480, 700) for x in range(2)])
    global score
    score = 0

    bomb = supplly.Bomb_subbly(480, 700)
    BOMBSUPPLYEVN = USEREVENT + 1
    pygame.time.set_timer(BOMBSUPPLYEVN, 2 * 1000)
    buet = supplly.Buet_subbly(480, 700)
    BUETSUPPLYEVN = USEREVENT + 2
    pygame.time.set_timer(BUETSUPPLYEVN, 5 * 1000)
    while True:
        screen.blit(bg, (0, 0))
        screen.blit(pa, pa_rect)

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

            elif event.type == BOMBSUPPLYEVN:
                bomb.active = True
            elif event.type == KEYDOWN:
                if event.key == K_SPACE:
                    bomb.use(enemys_group)
            elif event.type == BUETSUPPLYEVN:
                buet.active = True
            elif pygame.mouse.get_pressed()[0]:
                nx, ny = pygame.mouse.get_pos()
                if pa_rect.collidepoint(nx, ny):
                    pygame.display.flip()
                    screen.blit(bg, (0, 0))
                    while True:
                        for event in pygame.event.get():
                            if event.type == QUIT:
                                exit()

                        screen.blit(ru, ru_rect)
                        pygame.display.flip()
                        if pygame.mouse.get_pressed()[0]:
                            n1x, n2y = pygame.mouse.get_pos()
                            if ru_rect.collidepoint(n1x, n2y):
                                break

        plane.move()
        plane.collide(enemys_group)

        plane.draw(screen)
        screen.blit(ff, (0, 480))

        screen.blit(font.render("x" + str(plane.life_num), True, (0, 0, 0)),
                    (50, 500))
        if buet.flag == 0:
            if not delay % 12:
                bullet_list[bullet_index % 4].reset(plane.rect)
                bullet_index += 1

            for b in bullet_list:
                b.move()
                b.collide(enemys_group)
                b.draw(screen)

        else:
            buet.flag -= 1
            if not delay % 12:
                doubullet_list[doubullet_index % 4].reset(plane.rect)
                doubullet_index += 1

            for k in doubullet_list:

                k.move()
                k.collide(enemys_group)
                k.draw(screen)

            if not delay % 12:
                doubullet1_list[doubullet1_index % 4].reset(plane.rect)
                doubullet1_index += 1
            for j in doubullet1_list:
                j.move()
                j.collide(enemys_group)
                j.draw(screen)

        for e in enemys_group:
            e.move()

            e.draw(screen)
            if e.score:
                score += e.score
                e.score = 0

        bomb.move()
        bomb.collide(plane)
        bomb.draw(screen)

        buet.move()
        buet.collide(plane)
        buet.draw(screen)
        screen.blit(bom, (350, 480))
        screen.blit(font.render("x" + str(bomb.num), True, (0, 0, 0)),
                    (420, 500))

        screen.blit(font.render("Score:" + str(score), True, (0, 0, 0)),
                    (0, 0))

        if plane.life_num == 0:
            break

        delay += 1
        clock.tick(50)
        pygame.display.flip()
Exemplo n.º 5
0
def main():

    # here we creat background
    background1 = background.Background(size)
    background2 = background.background(size)

    # here we creat myplane
    my_plane = pygame.sprite.Group()
    myplane1 = myplane.Myplane(size)
    my_plane.add(myplane1)

    # here we creat the enemy planes
    enemies = pygame.sprite.Group()
    enemy3 = pygame.sprite.Group()
    enemy2 = pygame.sprite.Group()
    boss = pygame.sprite.Group()
    e21 = enemy.Enemy2(size)
    e22 = enemy.Enemy2(size)
    e23 = enemy.Enemy2(size)
    e24 = enemy.Enemy2(size)
    e25 = enemy.Enemy2(size)
    boss1 = enemy.Enemy8(size)
    enemy2.add(e21)
    enemy2.add(e22)
    enemy2.add(e23)
    enemy2.add(e24)
    enemy2.add(e25)
    enemies.add(e21)
    enemies.add(e22)
    enemies.add(e23)
    enemies.add(e24)
    enemies.add(e25)
    boss.add(boss1)

    e3 = enemy.Enemy3(size)
    enemy3.add(e3)

    enemy1 = pygame.sprite.Group()
    add_enemy1(enemy1, enemies, 3)

    enemy4 = pygame.sprite.Group()
    add_enemy4(enemy4, enemies, 2)

    enemy5 = pygame.sprite.Group()

    enemy6 = pygame.sprite.Group()

    enemy7 = pygame.sprite.Group()
    add_enemy7(enemy7, enemies, 1)

    # here we creat the bullets
    bullet1 = []
    bullet1_index = 0
    bullet1_number = 80
    for i in range(bullet1_number // 2):
        bullet1.append(
            bullet.Bullet1(
                (myplane1.rect.centerx - 13, myplane1.rect.centery)))
        bullet1.append(
            bullet.Bullet1(
                (myplane1.rect.centerx + 13, myplane1.rect.centery)))

    # here we creat the super bullet
    bullet2 = []
    bullet2_index = 0
    bullet2_number = 80
    for i in range(bullet2_number // 2):
        bullet2.append(
            bullet.Bullet2(
                (myplane1.rect.centerx - 13, myplane1.rect.centery)))
        bullet2.append(
            bullet.Bullet2(
                (myplane1.rect.centerx + 13, myplane1.rect.centery)))

    # here we creat the super bullet
    bullet3 = []
    bullet3_index = 0
    bullet3_number = 40
    for i in range(bullet3_number):
        bullet3.append(
            bullet.Bullet3(
                (myplane1.rect.centerx - 23, myplane1.rect.centery)))

    # here we creat the super bullet
    bullet4 = []
    bullet4_index = 0
    bullet4_number = 40
    for i in range(bullet4_number):
        bullet4.append(
            bullet.Bullet4(
                (myplane1.rect.centerx + 23, myplane1.rect.centery)))

    bullet6 = []
    bullet6_index = 0
    bullet6_number = 5000
    for i in range(bullet6_number // 5):
        bullet6.append(
            bullet.Bullet6((boss1.rect.centerx - 300, boss1.rect.centery)))
        bullet6.append(
            bullet.Bullet6((boss1.rect.centerx - 100, boss1.rect.centery)))
        bullet6.append(
            bullet.Bullet6((boss1.rect.centerx + 100, boss1.rect.centery)))
        bullet6.append(
            bullet.Bullet6((boss1.rect.centerx + 300, boss1.rect.centery)))

    # here we creat the enemy bullet
    bullet5 = bullet.Bullet5(size)
    b5 = pygame.sprite.Group()
    b5.add(bullet5)

    bullet51 = bullet.Bullet6(size)
    b51 = pygame.sprite.Group()
    b51.add(bullet51)

    bullet52 = bullet.Bullet6(size)
    b52 = pygame.sprite.Group()
    b52.add(bullet52)

    bullet53 = bullet.Bullet6(size)
    b53 = pygame.sprite.Group()
    b53.add(bullet53)

    bullet54 = bullet.Bullet6(size)
    b54 = pygame.sprite.Group()
    b54.add(bullet54)

    bullet55 = bullet.Bullet6(size)
    b55 = pygame.sprite.Group()
    b55.add(bullet55)

    # the index of plane when it is destoried
    e1_destroy_index = 0
    e2_destroy_index = 0
    en3_destroy_index = 0
    e4_destroy_index = 0
    e5_destroy_index = 0
    e6_destroy_index = 0
    e7_destroy_index = 0
    myplane1_destroy_index = 0
    boss_destroy_index = 0

    # here we add the score to the game
    score = 0
    score_font = pygame.font.Font("font/font.ttf.ttf", 36)

    #here we set the stop condtion to the game
    paused = False
    pause_nor_image = pygame.image.load("images/22.png").convert_alpha()
    pause_pressed_image = pygame.image.load("images/23.png").convert_alpha()
    resume_nor_image = pygame.image.load("images/21.png").convert_alpha()
    resume_pressed_image = pygame.image.load("images/24.png").convert_alpha()
    paused_rect = pause_nor_image.get_rect()
    paused_rect.left, paused_rect.top = width - paused_rect.width - 10, 10
    paused_image = pause_nor_image

    # here we set the difficulty of the game
    level = 1

    # here we set the bomb skills
    bomb_image = pygame.image.load("images/25.png").convert_alpha()
    bomb_rect = bomb_image.get_rect()
    bomb_font = pygame.font.Font("font/font.ttf.ttf", 48)
    bomb_num = 3

    # here we set record time
    recorded = False

    # here we set the ending picture
    gameover_font = pygame.font.Font("font/font.ttf.ttf", 48)
    again_image = pygame.image.load("images/29.png").convert_alpha()
    again_rect = again_image.get_rect()
    gameover_image = pygame.image.load("images/30.png").convert_alpha()
    gameover_rect = gameover_image.get_rect()

    # here we set the supply
    bullet_supply = supply.Bullet_supply(size)
    bomb_supply = supply.Bomb_supply(size)
    supply_time = USEREVENT
    pygame.time.set_timer(supply_time, 15 * 1000)

    # here we set the timing of super bullet
    super_bullet_time = USEREVENT + 1

    # here we add the timing of myplane's invincibe
    invincible_time = USEREVENT + 2

    # here we set condition of the super bullet
    is_super_bullet = False

    # here we set the lives of my planes
    life_image = pygame.image.load("images/28.png").convert_alpha()
    life_rect = life_image.get_rect()
    life_num = 3

    # here we set the delay to make the picture change smoothly
    delay = 120

    # here we set the state of running to check if we need to end the game
    running = True

    clock = pygame.time.Clock()

    # here we start the game
    while running:
        print(delay)
        for event in pygame.event.get():

            # here we quit the game and exit the system
            if event.type == QUIT:
                pygame.quit()
                sys.exit()

            elif event.type == MOUSEBUTTONDOWN:
                if event.button == 1 and paused_rect.collidepoint(event.pos):
                    paused = not paused
                    if paused:
                        pygame.time.set_timer(supply_time, 0)
                    else:
                        pygame.time.set_timer(supply_time, 15 * 1000)

            elif event.type == MOUSEMOTION:
                if paused_rect.collidepoint(event.pos):
                    if paused:
                        paused_image = resume_pressed_image
                    else:
                        paused_image = pause_pressed_image
                else:
                    if paused:
                        paused_image = resume_nor_image
                    else:
                        paused_image = pause_nor_image

        # here we set the function of the bomb
            elif event.type == KEYDOWN:
                if event.key == K_SPACE:
                    if bomb_num:
                        bomb_num -= 1
                        for each in enemies:
                            if each.rect.bottom > 0:
                                each.active = False
                        if level == 7:
                            boss1.energy -= 100
                            if boss1.energy < 0:
                                boss1.active = False

        # here we set the supply type
            elif event.type == supply_time:
                if choice([True, False]):
                    bomb_supply.reset()
                else:
                    bullet_supply.reset()

            elif event.type == super_bullet_time:
                is_super_bullet = False
                pygame.time.set_timer(super_bullet_time, 0)

            elif event.type == invincible_time:
                myplane1.invincible = False
                pygame.time.set_timer(invincible_time, 0)

        # here we change the levels
        if level == 1 and score > 100:
            level = 2

            # add more enemy planes to increase the difficulty level
            add_enemy1(enemy1, enemies, 1)
            add_enemy4(enemy4, enemies, 1)

            # increase the speed of the small enemy plane
            inc_speed(enemy1, 1)

        elif level == 2 and score > 300:
            level = 3

            # add more enemy planes to increase the difficulty level
            add_enemy1(enemy1, enemies, 1)
            add_enemy4(enemy4, enemies, 1)
            add_enemy5(enemy5, enemies, 1)
            add_enemy6(enemy6, enemies, 1)

            # increase the speed of the small enemy plane
            inc_speed(enemy1, 1)

        elif level == 3 and score > 800:
            level = 4

            # add more enemy planes to increase the difficulty level
            add_enemy1(enemy1, enemies, 1)
            add_enemy5(enemy5, enemies, 1)
            add_enemy6(enemy6, enemies, 1)

            # increase the speed of the small enemy plane

        elif level == 4 and score > 1500:
            level = 5

            # add more enemy planes to increase the difficulty level
            add_enemy1(enemy1, enemies, 1)
            add_enemy4(enemy4, enemies, 1)

            # increase the speed of the small enemy plane
            inc_speed(enemy4, 1)

        elif level == 5 and score > 2500:
            level = 6

            # add more enemy planes to increase the difficulty level
            add_enemy1(enemy1, enemies, 2)
            add_enemy4(enemy4, enemies, 1)
            add_enemy5(enemy5, enemies, 1)
            add_enemy6(enemy6, enemies, 1)

            # increase the speed of the small enemy plane
            inc_speed(enemy1, 1)

        elif level == 6 and score > 4000:
            score = 4000
            level = 7

            # delete all the enemy planes
            e3.active = False
            e3.reset()
            for each in enemies:
                each.active = False
                each.reset()
            boss1.active = True

        if score == 4000:
            score += 100
            delay = 120
        # here we draw the background picture
        if background1.active:
            background1.move()
            screen.blit(background1.image, background1.rect)

        if background2.active:
            background2.move()
            screen.blit(background2.image, background2.rect)

        if life_num and not paused:
            # here we check the keyboard of user
            key_pressed = pygame.key.get_pressed()
            if key_pressed[K_w]:
                myplane1.moveUp()
            if key_pressed[K_s]:
                myplane1.moveDown()
            if key_pressed[K_a]:
                myplane1.moveLeft()
            if key_pressed[K_d]:
                myplane1.moveRight()

            # here we draw the bomb and indicate if the player get it
            if bomb_supply.active:
                bomb_supply.move()
                screen.blit(bomb_supply.image, bomb_supply.rect)
                if pygame.sprite.collide_mask(bomb_supply, myplane1):
                    if bomb_num < 3:
                        bomb_num += 1
                    bomb_supply.active = False

            # here we draw the bullet supply and indicate if the player get it
            if bullet_supply.active:
                bullet_supply.move()
                screen.blit(bullet_supply.image, bullet_supply.rect)
                if pygame.sprite.collide_mask(bullet_supply, myplane1):
                    # creat and shoot the super bullet
                    is_super_bullet = True
                    pygame.time.set_timer(super_bullet_time, 8 * 1000)
                    bullet_supply.active = False

            # here we check that if the user's plane is touched by the enemies and their bullets
            enemies_down = pygame.sprite.spritecollide(
                myplane1, enemies, False, pygame.sprite.collide_mask)
            enemy3_down = pygame.sprite.spritecollide(
                myplane1, enemy3, False, pygame.sprite.collide_mask)
            enemy2_down = pygame.sprite.spritecollide(
                myplane1, enemy2, False, pygame.sprite.collide_mask)
            b5_down = pygame.sprite.spritecollide(myplane1, b5, False,
                                                  pygame.sprite.collide_mask)
            b51_down = pygame.sprite.spritecollide(myplane1, b51, False,
                                                   pygame.sprite.collide_mask)
            b52_down = pygame.sprite.spritecollide(myplane1, b52, False,
                                                   pygame.sprite.collide_mask)
            b53_down = pygame.sprite.spritecollide(myplane1, b53, False,
                                                   pygame.sprite.collide_mask)
            b54_down = pygame.sprite.spritecollide(myplane1, b54, False,
                                                   pygame.sprite.collide_mask)
            b55_down = pygame.sprite.spritecollide(myplane1, b55, False,
                                                   pygame.sprite.collide_mask)
            if enemies_down and not myplane1.invincible:
                myplane1.invincible = True
                pygame.time.set_timer(invincible_time, 1 * 1000)
                myplane1.energy -= 1
                if myplane1.energy == 0:
                    myplane1.active = False
                for e in enemies_down:
                    e.active = False
            if enemy3_down and not myplane1.invincible:
                myplane1.invincible = True
                pygame.time.set_timer(invincible_time, 1 * 1000)
                myplane1.energy -= 1
                if myplane1.energy == 0:
                    myplane1.active = False
                e3.active = False
            if enemy2_down and not myplane1.invincible:
                myplane1.invincible = True
                pygame.time.set_timer(invincible_time, 1 * 1000)
                myplane1.energy -= 1
                if myplane1.energy == 0:
                    myplane1.active = False
                for m in enemy2_down:
                    m.active = False
            if b5_down and not myplane1.invincible:
                myplane1.energy -= 1
                if myplane1.energy == 0:
                    myplane1.active = False
                bullet5.active = False
                bullet5.reset((e3.rect.centerx, e3.rect.bottom))
            if b51_down and not myplane1.invincible:
                myplane1.energy -= 1
                if myplane1.energy == 0:
                    myplane1.active = False
                bullet51.active = False
                bullet51.reset((e21.rect.centerx, e21.rect.bottom))
            if b52_down and not myplane1.invincible:
                myplane1.energy -= 1
                if myplane1.energy == 0:
                    myplane1.active = False
                bullet52.active = False
                bullet52.reset((e22.rect.centerx, e22.rect.bottom))
            if b53_down and not myplane1.invincible:
                myplane1.energy -= 1
                if myplane1.energy == 0:
                    myplane1.active = False
                bullet53.active = False
                bullet53.reset((e23.rect.centerx, e23.rect.bottom))
            if b54_down and not myplane1.invincible:
                myplane1.energy -= 1
                if myplane1.energy == 0:
                    myplane1.active = False
                bullet54.active = False
                bullet54.reset((e24.rect.centerx, e24.rect.bottom))
            if b55_down and not myplane1.invincible:
                myplane1.energy -= 1
                if myplane1.energy == 0:
                    myplane1.active = False
                bullet55.active = False
                bullet55.reset((e25.rect.centerx, e25.rect.bottom))

            # here we draw the user's plane
            if myplane1.active:
                screen.blit(myplane1.image, myplane1.rect)
                # here we draw the total blood of my plane
                pygame.draw.line(screen, BLACK, \
                                 (myplane1.rect.left, myplane1.rect.bottom + 5),\
                                 (myplane1.rect.right, myplane1.rect.bottom + 5),\
                                 2)
                # when the energy is bigger than 20%, it will be green. else, it will be red
                energy_remain1 = myplane1.energy / myplane.Myplane.energy
                if energy_remain1 > 0.5:
                    energy_color = GREEN
                else:
                    energy_color = RED
                pygame.draw.line(screen, energy_color,\
                                 (myplane1.rect.left, myplane1.rect.bottom + 5),\
                                 (myplane1.rect.left + myplane1.rect.width * energy_remain1,\
                                 myplane1.rect.bottom + 5), 2)

            else:
                if not (delay % 3):
                    # here we draw the destory pictures of the plane
                    screen.blit(
                        myplane1.destroy_images[myplane1_destroy_index],
                        myplane1.rect)
                    myplane1_destroy_index = (myplane1_destroy_index + 1) % 4
                    if myplane1_destroy_index == 0:
                        life_num -= 1
                        myplane1.reset()
                        pygame.time.set_timer(invincible_time, 3 * 1000)

            # here we check the condition of the enemy3
            if boss1.active:
                boss1.move()
                screen.blit(boss1.image, boss1.rect)
                # here we draw the total blood of the enemy plane
                pygame.draw.line(screen, BLACK, \
                                 (boss1.rect.left, boss1.rect.bottom - 50),\
                                 (boss1.rect.right, boss1.rect.bottom - 50),\
                                 2)
                # when the energy is bigger than 20%, it will be green. else, it will be red
                energy_remain2 = boss1.energy / enemy.Enemy8.energy
                if energy_remain2 > 0.30:
                    energy_color = GREEN
                else:
                    energy_color = RED
                pygame.draw.line(screen, energy_color,\
                                 (boss1.rect.left, boss1.rect.bottom - 50),\
                                 (boss1.rect.left + boss1.rect.width * energy_remain2,\
                                 boss1.rect.bottom - 50), 2)
            else:
                if level == 7:
                    if not (delay % 3):
                        # here we draw the destory pictures of the plane
                        screen.blit(boss1.destroy_images[boss_destroy_index],
                                    boss1.rect)
                        boss_destroy_index = (boss_destroy_index + 1) % 4
                        if boss_destroy_index == 0:
                            score += 10000
                            life_num -= life_num
                            boss1.reset()

            # here we draw the enemy bullet
            if bullet5.active:
                screen.blit(bullet5.image, bullet5.rect)
                bullet5.move()
                if bullet5.rect.centerx > myplane1.rect.centerx and bullet5.rect.top < myplane1.rect.top:
                    bullet5.rect.left -= 2
                if bullet5.rect.centerx < myplane1.rect.centerx and bullet5.rect.top < myplane1.rect.top:
                    bullet5.rect.left += 2
            else:
                if not level == 7:
                    if e3.rect.top > 0 and e3.rect.top < 800:
                        bullet5.reset((e3.rect.centerx, e3.rect.bottom))

            if bullet51.active:
                screen.blit(bullet51.image, bullet51.rect)
                bullet51.move()
            else:
                if not level == 7:
                    if e21.rect.top > 0 and e21.rect.top < 800:
                        bullet51.reset((e21.rect.centerx, e21.rect.bottom))

            if bullet52.active:
                screen.blit(bullet52.image, bullet52.rect)
                bullet52.move()
            else:
                if not level == 7:
                    if e22.rect.top > 0 and e22.rect.top < 800:
                        bullet52.reset((e22.rect.centerx, e22.rect.bottom))

            if bullet53.active:
                screen.blit(bullet53.image, bullet53.rect)
                bullet53.move()
            else:
                if not level == 7:
                    if e23.rect.top > 0 and e23.rect.top < 800:
                        bullet53.reset((e23.rect.centerx, e23.rect.bottom))

            if bullet54.active:
                screen.blit(bullet54.image, bullet54.rect)
                bullet54.move()
            else:
                if not level == 7:
                    if e24.rect.top > 0 and e24.rect.top < 800:
                        bullet54.reset((e24.rect.centerx, e24.rect.bottom))

            if bullet55.active:
                screen.blit(bullet55.image, bullet55.rect)
                bullet55.move()
            else:
                if not level == 7:
                    if e25.rect.top > 0 and e25.rect.top < 800:
                        bullet55.reset((e25.rect.centerx, e25.rect.bottom))

            # here we shot the bullets
            if not (delay % 10):
                if is_super_bullet:
                    bullets = bullet2
                    bullets[bullet2_index].reset(
                        (myplane1.rect.centerx - 13, myplane1.rect.centery))
                    bullets[bullet2_index + 1].reset(
                        (myplane1.rect.centerx + 13, myplane1.rect.centery))
                    bullet3[bullet3_index].reset(
                        (myplane1.rect.centerx + 23, myplane1.rect.centery))
                    bullet4[bullet4_index].reset(
                        (myplane1.rect.centerx - 23, myplane1.rect.centery))
                    bullet2_index = (bullet2_index + 2) % bullet2_number
                    bullet3_index = (bullet3_index + 1) % bullet3_number
                    bullet4_index = (bullet4_index + 1) % bullet4_number
                else:
                    bullets = bullet1
                    bullets[bullet1_index].reset(
                        (myplane1.rect.centerx - 13, myplane1.rect.centery))
                    bullets[bullet1_index + 1].reset(
                        (myplane1.rect.centerx + 13, myplane1.rect.centery))
                    bullet1_index = (bullet1_index + 2) % bullet1_number

            # here we draw the boss bullet
            if boss1.active:
                if not (delay % 40):
                    bossbullets = bullet6
                    bossbullets[bullet6_index].reset(
                        (boss1.rect.centerx - 300, boss1.rect.centery))
                    bossbullets[bullet6_index + 1].reset(
                        (boss1.rect.centerx - 100, boss1.rect.centery))
                    bossbullets[bullet6_index + 2].reset(
                        (boss1.rect.centerx + 100, boss1.rect.centery))
                    bossbullets[bullet6_index + 3].reset(
                        (boss1.rect.centerx + 300, boss1.rect.centery))
                    bullet6_index = (bullet6_index + 4) % bullet6_number

            # here we check if the bullet collides witg the plane
            if level == 7 and boss1.active:
                for v in bossbullets:
                    if v.active:
                        if energy_remain2 >= 0.9:
                            v.move()
                        if energy_remain2 >= 0.8 and energy_remain2 < 0.9:
                            v.move()
                            v.move1()
                        if energy_remain2 >= 0.7 and energy_remain2 < 0.8:
                            v.move()
                            v.move3()
                        if energy_remain2 >= 0.6 and energy_remain2 < 0.7:
                            v.move()
                            v.move2()
                        if energy_remain2 >= 0.5 and energy_remain2 < 0.6:
                            v.move()
                            v.move3()
                        if energy_remain2 >= 0.4 and energy_remain2 < 0.5:
                            v.move()
                            v.rect.top += 1
                            v.move1()
                        if energy_remain2 >= 0.3 and energy_remain2 < 0.4:
                            v.move()
                            v.rect.top += 2
                            v.move2()
                        if energy_remain2 >= 0.2 and energy_remain2 < 0.3:
                            v.move()
                        if energy_remain2 < 0.2:
                            v.move()
                            if v.rect.centerx > myplane1.rect.centerx and v.rect.top < myplane1.rect.top:
                                v.rect.left -= 2
                            if v.rect.centerx < myplane1.rect.centerx and v.rect.top < myplane1.rect.top:
                                v.rect.left += 2

                        screen.blit(v.image, v.rect)
                        bossbullet_down = pygame.sprite.spritecollide(
                            v, my_plane, False, pygame.sprite.collide_mask)
                        if bossbullet_down and not myplane1.invincible:
                            myplane1.energy -= 1
                            if myplane1.energy == 0:
                                myplane1.active = False
                            v.active = False

            # here we check if the bullet collides with the enemy plane
            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)
                    enemy3_hit = pygame.sprite.spritecollide(
                        b, enemy3, False, pygame.sprite.collide_mask)
                    enemy2_hit = pygame.sprite.spritecollide(
                        b, enemy2, False, pygame.sprite.collide_mask)
                    boss_hit = pygame.sprite.spritecollide(
                        b, boss, False, pygame.sprite.collide_mask)
                    if enemy_hit:
                        b.active = False
                        for e in enemy_hit:
                            # here we check which type of planes is attacked
                            if e in enemy2:
                                e.energy -= 1
                                if e.energy == 0:
                                    e.active = False
                            else:
                                e.active = False
                    if enemy3_hit:
                        b.active = False
                        # here we check which type of planes is attacked
                        e3.energy -= 1
                        if e3.energy == 0:
                            e3.active = False
                    if enemy2_hit:
                        b.active = False
                        for z in enemy2_hit:
                            z.energy -= 1
                            if z.energy == 0:
                                z.active = False
                    if boss_hit:
                        b.active = False
                        boss1.energy -= 1
                        if boss1.energy == 0:
                            boss1.active = False
                            level == 8

            for x in bullet3:
                if x.active:
                    x.move1()
                    x.move()
                    screen.blit(x.image, x.rect)
                    enemy_hit = pygame.sprite.spritecollide(
                        x, enemies, False, pygame.sprite.collide_mask)
                    enemy3_hit = pygame.sprite.spritecollide(
                        x, enemy3, False, pygame.sprite.collide_mask)
                    enemy2_hit = pygame.sprite.spritecollide(
                        x, enemy2, False, pygame.sprite.collide_mask)
                    boss_hit = pygame.sprite.spritecollide(
                        x, boss, False, pygame.sprite.collide_mask)
                    if enemy_hit:
                        x.active = False
                        for e in enemy_hit:
                            # here we check which type of planes is attacked
                            if e in enemy2:
                                e.energy -= 1
                                if e.energy == 0:
                                    e.active = False
                            else:
                                e.active = False
                    if enemy3_hit:
                        x.active = False
                        # here we check which type of planes is attacked
                        e3.energy -= 1
                        if e3.energy == 0:
                            e3.active = False
                    if enemy2_hit:
                        x.active = False
                        for z in enemy2_hit:
                            z.energy -= 1
                            if z.energy == 0:
                                z.active = False
                    if boss_hit:
                        x.active = False
                        boss1.energy -= 1
                        if boss1.energy == 0:
                            boss1.active = False
                            level == 8

            for y in bullet4:
                if y.active:
                    y.move1()
                    y.move()
                    screen.blit(y.image, y.rect)
                    enemy_hit = pygame.sprite.spritecollide(
                        y, enemies, False, pygame.sprite.collide_mask)
                    enemy3_hit = pygame.sprite.spritecollide(
                        y, enemy3, False, pygame.sprite.collide_mask)
                    enemy2_hit = pygame.sprite.spritecollide(
                        y, enemy2, False, pygame.sprite.collide_mask)
                    boss_hit = pygame.sprite.spritecollide(
                        y, boss, False, pygame.sprite.collide_mask)
                    if enemy_hit:
                        y.active = False
                        for e in enemy_hit:
                            # here we check which type of planes is attacked
                            if e in enemy2:
                                e.energy -= 1
                                if e.energy == 0:
                                    e.active = False
                            else:
                                e.active = False
                    if enemy3_hit:
                        y.active = False
                        # here we check which type of planes is attacked
                        e3.energy -= 1
                        if e3.energy == 0:
                            e3.active = False
                    if enemy2_hit:
                        y.active = False
                        for z in enemy2_hit:
                            z.energy -= 1
                            if z.energy == 0:
                                z.active = False
                    if boss_hit:
                        y.active = False
                        boss1.energy -= 1
                        if boss1.energy == 0:
                            boss1.active = False
                            level == 8

            # here we check the condition of the enemy3
            if e3.active and not level == 7:
                e3.move()
                screen.blit(e3.image, e3.rect)
                # here we draw the total blood of the enemy plane
                pygame.draw.line(screen, BLACK, \
                                 (e3.rect.left, e3.rect.top - 5),\
                                 (e3.rect.right, e3.rect.top - 5),\
                                 2)
                # when the energy is bigger than 20%, it will be green. else, it will be red
                energy_remain = e3.energy / enemy.Enemy3.energy
                if energy_remain > 0.35:
                    energy_color = GREEN
                else:
                    energy_color = RED
                pygame.draw.line(screen, energy_color,\
                                 (e3.rect.left, e3.rect.top - 5),\
                                 (e3.rect.left + e3.rect.width * energy_remain,\
                                 e3.rect.top - 5), 2)
            else:
                if not level == 7:
                    if not (delay % 3):
                        # here we draw the destory pictures of the plane
                        screen.blit(e3.destroy_images[en3_destroy_index],
                                    e3.rect)
                        en3_destroy_index = (en3_destroy_index + 1) % 4
                        if en3_destroy_index == 0:
                            score += 1000
                            e3.reset()
            if e3.rect.top > 960 and not level == 7:
                e3.reset()

            for each in enemy2:
                if each.active and not level == 7:
                    each.move()
                    screen.blit(each.image, each.rect)
                    # here we draw the total blood of the enemy plane
                    pygame.draw.line(screen, BLACK, \
                                     (each.rect.left, each.rect.top - 5),\
                                     (each.rect.right, each.rect.top - 5),\
                                     2)
                    # when the energy is bigger than 20%, it will be green. else, it will be red
                    energy_remain = each.energy / enemy.Enemy2.energy
                    if energy_remain > 0.35:
                        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 level == 7:
                        if not (delay % 3):
                            # here we draw the destory pictures of the plane
                            screen.blit(each.destroy_images[e2_destroy_index],
                                        each.rect)
                            e2_destroy_index = (e2_destroy_index + 1) % 4
                            if e2_destroy_index == 0:
                                score += 500
                                each.reset()
                if each.rect.top > 960 and not level == 7:
                    each.reset()

            for each in enemy1:
                if each.active and not level == 7:
                    each.move()
                    screen.blit(each.image, each.rect)
                else:
                    if not level == 7:
                        if not (delay % 3):
                            # here we draw the destory pictures of the plane
                            screen.blit(each.destroy_images[e1_destroy_index],
                                        each.rect)
                            e1_destroy_index = (e1_destroy_index + 1) % 4
                            if e1_destroy_index == 0:
                                score += 100
                                each.reset()

            for each in enemy4:
                if each.active and not level == 7:
                    each.move()
                    screen.blit(each.image, each.rect)
                else:
                    if not level == 7:
                        if not (delay % 3):
                            # here we draw the destory pictures of the plane
                            screen.blit(each.destroy_images[e4_destroy_index],
                                        each.rect)
                            e4_destroy_index = (e4_destroy_index + 1) % 4
                            if e4_destroy_index == 0:
                                score += 100
                                each.reset()

            for each in enemy5:
                if each.active and not level == 7:
                    each.move()
                    screen.blit(each.image, each.rect)
                else:
                    if not level == 7:
                        if not (delay % 3):
                            # here we draw the destory pictures of the plane
                            screen.blit(each.destroy_images[e5_destroy_index],
                                        each.rect)
                            e5_destroy_index = (e5_destroy_index + 1) % 4
                            if e5_destroy_index == 0:
                                score += 100
                                each.reset()

            for each in enemy6:
                if each.active and not level == 7:
                    each.move()
                    screen.blit(each.image, each.rect)
                else:
                    if not level == 7:
                        if not (delay % 3):
                            # here we draw the destory pictures of the plane
                            screen.blit(each.destroy_images[e6_destroy_index],
                                        each.rect)
                            e6_destroy_index = (e6_destroy_index + 1) % 4
                            if e6_destroy_index == 0:
                                score += 100
                                each.reset()

            for each in enemy7:
                if each.active and not level == 7:
                    each.move()
                    screen.blit(each.image, each.rect)
                else:
                    if not level == 7:
                        if not (delay % 3):
                            # here we draw the destory pictures of the plane
                            screen.blit(each.destroy_images[e7_destroy_index],
                                        each.rect)
                            e7_destroy_index = (e7_destroy_index + 1) % 4
                            if e7_destroy_index == 0:
                                score += 100
                                each.reset()

            # here we draw the score
            score_text = score_font.render("Score : %s" % str(score), True,
                                           BLACK)
            screen.blit(score_text, (10, 5))

        # here we creat the ending
        elif life_num == 0:
            # here we stop dropping the support
            pygame.time.set_timer(supply_time, 0)

            if not recorded:
                recorded = True
                # here we read the highest record
                with open("record.txt.txt", "r") as f:
                    record_score = int(f.read())

                # here we change the highest record
                if score > record_score:
                    with open("record.txt.txt", "w") as f:
                        f.write(str(score))

            # here we draw the ending picture
            record_score_text = score_font.render(
                "Best was : %d" % record_score, True, BLACK)
            screen.blit(record_score_text, (50, 50))

            gameover_text1 = gameover_font.render("Your Score", True, BLACK)
            gameover_text1_rect = gameover_text1.get_rect()
            gameover_text1_rect.left, gameover_text1_rect.top = \
                                      (width - gameover_text1_rect.width) // 2, height // 2
            screen.blit(gameover_text1, gameover_text1_rect)

            gameover_text2 = gameover_font.render(str(score), True, BLACK)
            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.left, again_rect.top = \
                             (width - again_rect.width) // 2, \
                             gameover_text2_rect.bottom + 50
            screen.blit(again_image, again_rect)

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

            # here we set the mouse
            # if the player click left mouse
            if pygame.mouse.get_pressed()[0]:
                # here we get the coordination of the mouse
                pos = pygame.mouse.get_pos()
                # if the player click restart
                if again_rect.left < pos[0] < again_rect.right and \
                   again_rect.top < pos[1] < again_rect.bottom:
                    main()
                # if the player click exit
                elif gameover_rect.left < pos[0] < gameover_rect.right and \
                     gameover_rect.top < pos[1] < gameover_rect.bottom:
                    pygame.quit()
                    sys.exit()

        # here we draw the bomb
        bomb_text = bomb_font.render("x %d" % bomb_num, True, BLACK)
        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))

        # here we draw the number of lives of myplane
        if life_num:
            for i in range(life_num):
                screen.blit(life_image, \
                            (width-(i+1)*life_rect.width+30, \
                             height-life_rect.height+35))

        # here we draw the pause and continue picture
        screen.blit(paused_image, paused_rect)

        # here we change the value of delay
        delay -= 1
        if not delay:
            delay = 120

        pygame.display.flip()

        clock.tick(60)
Exemplo n.º 6
0
def main():
    pygame.mixer.music.play(-1)
    clock = pygame.time.Clock()
    e1_destory_index = 0
    e2_destory_index = 0
    e3_destory_index = 0
    me_destory_index = 0
    delay = 100
    running = True
    me = myplane.Myplane(bg_size)

    #游戏暂停
    paused = False
    paused_nor_image = pygame.image.load("image/paused_nor.png")
    paused_pressed_image = pygame.image.load("image/paused_pressed.png")
    resume_nor_image = pygame.image.load("image/resume_nor.png")
    resume_pressed_image = pygame.image.load("image/resume_pressed.png")
    paused_rect = paused_nor_image.get_rect()
    paused_rect.left, paused_rect.top = bg_size[0] - paused_rect.width - 10, 10
    #默认显示这个
    paused_image = paused_nor_image
    #分数字体
    score = 0
    score_font = pygame.font.Font("font/font.TTF", 36)

    enemies = pygame.sprite.Group()
    #生成敌方小型飞机
    small_enemies = pygame.sprite.Group()
    add_small_enemies(small_enemies, enemies, 20)
    #生成敌方中型飞机
    mid_enemies = pygame.sprite.Group()
    add_mid_enemies(mid_enemies, enemies, 8)
    #生成敌方大型飞机
    big_enemies = pygame.sprite.Group()
    add_big_enemies(big_enemies, enemies, 4)
    #生成子弹
    bullet1 = []
    bullet1_index = 0
    BULLET1_NUM = 4
    for i in range(BULLET1_NUM):
        bullet1.append(bullet.Bullet1(me.rect.midtop))
    #用于阻止重复打开记录文件
    recorded = False
    game_over_font = pygame.font.Font("font/font.TTF", 48)
    again_image = pygame.image.load("image/again.png").convert_alpha()
    again_rect = again_image.get_rect()
    gameover_image = pygame.image.load("image/gameover.png").convert_alpha()
    gameover_rect = gameover_image.get_rect()

    while running:
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
            elif event.type == MOUSEBUTTONDOWN:
                if event.button == 1 and paused_rect.collidepoint(event.pos):
                    paused = not paused
            elif event.type == MOUSEMOTION:
                if paused_rect.collidepoint(event.pos):
                    if paused:
                        paused_image = resume_pressed_image
                    else:
                        paused_image = paused_pressed_image
                else:
                    if paused:
                        paused_image = resume_nor_image
                    else:
                        paused_image = paused_nor_image

        if not paused:
            screen.blit(background, (0, 0))
            #绘制得分
            #大,中,小 飞机毁灭时分别得到 10000,6000,1000 分
            score_text = score_font.render("Score:%s" % str(score), True,
                                           WHITE)
            screen.blit(score_text, (10, 5))
            if not (delay % 10):
                bullet1[bullet1_index].reset(me.rect.midtop)
                bullet1_index = (bullet1_index + 1) % BULLET1_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()
            #绘制我方飞机#screen.blit(me.image, me.rect)
            if me.active:
                screen.blit(me.image, me.rect)
            else:
                #毁灭
                me_down_sound.play()
                if not (delay % 3):
                    screen.blit(me.destory_images[me_destory_index], me.rect)
                    me_destory_index = (me_destory_index + 1) % 4
                    if me_destory_index == 0:
                        print("GAME OVER!")  # # # # # # ###
                        running = False  ##################################################################
            #绘制子弹                                                               # # # # # # ###
            for b in bullet1:
                if b.active:
                    b.move()
                    screen.blit(b.image, b.rect)
                    enemy_hit = pygame.sprite.spritecollide(
                        b, enemies, False, pygame.sprite.collide_mask)
                    #if b.rect.top < 0:
                    #     b.reset(me.rect.midtop)
                    if enemy_hit:
                        b.active = False
                        for e in enemy_hit:
                            if e in mid_enemies or e in big_enemies:
                                e.energy -= 1
                                if e.energy == 0:
                                    e.active = False
                            else:
                                e.active = False
                                score += 1000  #################################################################################
            #绘制小型敌机
            for each in small_enemies:
                if each.active:
                    each.move()
                    screen.blit(each.image, each.rect)
                else:
                    #毁灭
                    if not (delay % 3):
                        if e1_destory_index == 1:
                            enemy1_down_sound.play()
                    #       print("e1down",each.rect)
                        screen.blit(each.destory_images[e1_destory_index],
                                    each.rect)
                        e1_destory_index = (e1_destory_index + 1) % 4
                        if e1_destory_index == 1:
                            enemy1_down_sound.stop()
                            #       print("e1stop",each.rect)
                            each.reset()

            #绘制中型飞机
            for each in mid_enemies:
                if each.active:
                    each.move()
                    screen.blit(each.image, each.rect)
                else:
                    #毁灭
                    if not (delay % 3):
                        if e2_destory_index == 0:
                            enemy2_down_sound.play()
                        screen.blit(each.destory_images[e1_destory_index],
                                    each.rect)
                        e2_destory_index = (e1_destory_index + 1) % 4
                        if e2_destory_index == 0:
                            enemy2_down_sound.stop()
                            each.reset()
                            score += 6000
                pygame.draw.line(screen, BLACK,
                                 (each.rect.left, each.rect.top - 5),
                                 (each.rect.right, each.rect.top - 5), 2)
                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)
            #绘制大型飞机
            for each in big_enemies:
                if each.active:
                    each.move()
                    screen.blit(each.image, each.rect)
                    #即将出现在画面中,播放音效
                    if each.rect.bottom >= -50:
                        enemy3_fly_sound.play(-1)
                else:
                    #毁灭
                    if not (delay % 3):
                        if e3_destory_index == 0:
                            enemy3_down_sound.play()
                        screen.blit(each.destory_images[e3_destory_index],
                                    each.rect)
                        e3_destory_index = (e3_destory_index + 1) % 6
                        if e3_destory_index == 0:
                            enemy3_down_sound.stop()
                            each.reset()
                            score += 10000
                pygame.draw.line(screen, BLACK,
                                 (each.rect.left, each.rect.top - 5),
                                 (each.rect.right, each.rect.top - 5), 2)
                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)

            #检测我方飞机是否被碰撞
            enemies_down = pygame.sprite.spritecollide(
                me, enemies, False, pygame.sprite.collide_mask)
            if enemies_down:
                me.active = False
                for e in enemies_down:
                    e.active = False
        #绘制暂停图标
        screen.blit(paused_image, paused_rect)
        #screen.blit(background,(0,0))
        if not running:
            #背景音乐停止
            pygame.mixer.music.stop()
            #停止全部音效
            pygame.mixer.stop()
            if not recorded:
                recorded = True
                #读取历史最高分
                with open("record/recorded.txt", 'r') as f:
                    record_score = int(f.read())
                #如果分数超记录则覆盖录入最高分数
                if score > record_score:
                    with open("record/recorded.txt", 'w') as f:
                        f.write(str(score))
            #绘制结束画面
            record_score_text = score_font.render("Best: %d" % record_score,
                                                  True, (255, 255, 255))
            screen.blit(background, (0, 0))
            screen.blit(record_score_text, (50, 50))
            gameover_text1 = game_over_font.render("Your Score", True,
                                                   (255, 255, 255))
            gameover_text1_rect = gameover_text1.get_rect()
            gameover_text1_rect.left, gameover_text1_rect.top = (
                bg_size[0] - gameover_text1_rect.width) // 2, bg_size[1] // 3
            screen.blit(gameover_text1, gameover_text1_rect)
            gameover_text2 = game_over_font.render(str(score), True,
                                                   (255, 255, 255))
            gameover_text2_rect = gameover_text2.get_rect()
            gameover_text2_rect.left, gameover_text2_rect.top = (
                bg_size[0] - gameover_text2_rect.width
            ) // 2, gameover_text1_rect.bottom + 10
            screen.blit(gameover_text2, gameover_text2_rect)
            again_rect.left, again_rect.top = (
                bg_size[0] -
                again_rect.width) // 2, gameover_text2_rect.bottom + 50
            screen.blit(again_image, again_rect)
            gameover_rect.left, gameover_rect.top = (
                bg_size[0] - gameover_rect.width) // 2, again_rect.bottom + 10
            screen.blit(gameover_image, gameover_rect)
            pygame.display.flip()
            while True:
                #检测用户鼠标操作
                #如果按下鼠标左键
                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()

        pygame.display.flip()
        delay += 1

        clock.tick(60)
Exemplo n.º 7
0
def main():
    pygame.mixer.music.play(-1)

    #生成我方飞机
    me = myplane.Myplane(bg_size)

    #切换我方飞机图片
    switch_image = True

    #生成敌方飞机
    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
    BULLEFT1_NUM = 4
    for i in range(BULLEFT1_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 - 30)))
        bullet2.append(
            bullet.Bullet2((me.rect.centerx + 33, me.rect.centery - 30)))

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

    #统计分数
    score = 0
    score_front = pygame.font.Font('font/font.ttf', 36)

    #标志是否暂停游戏
    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()
    paused_rect = pause_nor_image.get_rect()
    paused_rect.left, paused_rect.top = width - paused_rect.width - 10, 10
    paused_image = pause_nor_image

    #游戏结束画面
    again_image = pygame.image.load("images/again.png").convert_alpha()
    again_rect = again_image.get_rect()
    gameover_image = pygame.image.load("images/gameover.png").convert_alpha()
    gameover_rect = gameover_image.get_rect()

    #设置难度级别
    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', 40)
    bomb_num = 3

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

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

    #标记超级子弹
    is_double_bullet = False

    #解除无敌计时器
    INVINCIBLE_TIME = USEREVENT + 2

    #飞机生命
    life_image = pygame.image.load('images/life.png').convert_alpha()
    life_rect = life_image.get_rect()
    life_num = 3

    #用于延迟
    delay = 100
    clock = pygame.time.Clock()
    running = True
    recorded = False

    while running:
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
            elif event.type == MOUSEBUTTONDOWN:
                if event.button == 1 and paused_rect.collidepoint(event.pos):
                    paused = not paused
                    if paused:
                        pygame.time.set_timer(SUPPLY_TIME, 0)
                        pygame.mixer.music.pause()
                        pygame.mixer.pause()
                    else:
                        pygame.time.set_timer(SUPPLY_TIME, 30 * 1000)
                        pygame.mixer.music.unpause()
                        pygame.mixer.unpause()

            elif event.type == MOUSEMOTION:
                if paused_rect.collidepoint(event.pos):
                    if paused:
                        paused_image = resume_pressed_image
                    else:
                        paused_image = pause_pressed_image
                else:
                    if paused:
                        paused_image = resume_nor_image
                    else:
                        paused_image = pause_nor_image
            elif 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
            elif event.type == SUPPLY_TIME:
                supply_sound.play()
                if choice([True, False]):
                    bomb_supply.reset()
                else:
                    bullet_supply.reset()
            elif event.type == DOUBLE_BULLET_TIME:
                is_double_bullet = False
                pygame.time.set_timer(DOUBLE_BULLET_TIME, 0)
            elif 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()
            #增加敌机
            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()
            #增加敌机
            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()
            #增加敌机
            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 > 100000:
            level = 5
            upgrade_sound.play()
            #增加敌机
            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 life_num and not paused:
            #检测键盘操作
            key_preesd = pygame.key.get_pressed()

            if key_preesd[K_w] or key_preesd[K_UP]:
                me.moveUp()
            if key_preesd[K_s] or key_preesd[K_DOWN]:
                me.moveDown()
            if key_preesd[K_a] or key_preesd[K_LEFT]:
                me.moveLeft()
            if key_preesd[K_d] or key_preesd[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
            #h绘制超级子弹并检测是否获得
            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):
                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 + 33, 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) % BULLEFT1_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()
                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
                        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)
                        e.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
                        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
                        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)
            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
                    if me_destroy_index == 0:
                        life_num -= 1
                        me.reset()
                        pygame.time.set_timer(INVINCIBLE_TIME, 3 * 1000)

            #绘制剩余炸弹
            bomb_text = bomb_font.render('x %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_front.render('Score : %s ' % str(score), True,
                                            WHITE)
            screen.blit(score_text, (10, 5))
            # 绘制飞机生命数量
            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))
        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))
            #绘制结束界面
            record_score_text = score_front.render(
                'Best : %s ' % str(record_score), True, WHITE)
            screen.blit(record_score_text, (50, 50))

            gameover_text = score_front.render('Your Score: %s ' % str(score),
                                               True, WHITE)
            gameover_text_rect = gameover_text.get_rect()
            gameover_text_rect.left, gameover_text_rect.top = (
                width - gameover_text_rect.width) // 2, height // 2
            screen.blit(gameover_text,
                        (gameover_text_rect.left, gameover_text_rect.top))
            again_rect.left, again_rect.top = (
                width - again_rect.width) // 2, gameover_text_rect.bottom + 50
            screen.blit(again_image, (again_rect.left, again_rect.top))
            gameover_rect.left, gameover_rect.top = (
                width - gameover_rect.width) // 2, again_rect.bottom + 10
            screen.blit(gameover_image,
                        (gameover_rect.left, gameover_rect.top))
            #检测用户点击操作
            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()
                elif gameover_rect.left < pos[
                        0] < gameover_rect.right and gameover_rect.top < pos[
                            1] < gameover_rect.bottom:
                    pygame.quit()
                    sys.exit()
        #绘制暂停按钮
        screen.blit(paused_image, paused_rect)
        #切换图片
        if not (delay % 5):
            switch_image = not switch_image
        delay -= 1
        if not delay:
            delay = 100

        pygame.display.flip()
        clock.tick(60)
Exemplo n.º 8
0
def main():
    pygame.mixer.music.play(-1)

    #生成我方飞机
    me = myplane.Myplane(bg_size)

    #生成敌方飞机
    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())

    #生成超级子弹
    bullet2 = []
    bullet2_index = 0
    BULLET2_NUM = 8
    for i in range(BULLET2_NUM):
        bullet2.append(bullet.Bullet2())

    clock = pygame.time.Clock()

    #中弹图片索引
    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)

    #标志是否暂停游戏
    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()
    paused_rect = pause_nor_image.get_rect()
    paused_rect.left, paused_rect.top = width - paused_rect.width - 10, 10
    paused_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
    #每30秒发放一个补给包
    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
    #是否使用超级子弹
    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
    # 游戏结束画面
    gameover_font = pygame.font.Font("font/font.ttf", 48)
    again_image = pygame.image.load("images/again.png").convert_alpha()
    again_rect = again_image.get_rect()
    gameover_image = pygame.image.load("images/gameover.png").convert_alpha()
    gameover_rect = gameover_image.get_rect()
    #用于切换图片
    switch_image = True
    #用于延迟
    delay = 100

    runing = True

    while runing:
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
            elif event.type == MOUSEBUTTONDOWN:
                if event.button == 1 and paused_rect.collidepoint(event.pos):
                    paused = not paused
                    if paused:
                        pygame.time.set_timer(SUPPLY_TIME, 0)
                        pygame.mixer.music.pause()
                        pygame.mixer.pause()
                    else:
                        pygame.time.set_timer(SUPPLY_TIME, 30 * 1000)
                        pygame.mixer.music.unpause()
                        pygame.mixer.unpause()

            elif event.type == MOUSEMOTION:
                if paused_rect.collidepoint(event.pos):
                    if paused:
                        paused_image = resume_pressed_image
                    else:
                        paused_image = pause_pressed_image
                else:
                    if paused:
                        paused_image = resume_nor_image
                    else:
                        paused_image = pause_nor_image
            elif 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
            elif event.type == SUPPLY_TIME:
                supply_sound.play()
                if choice([True, False]):
                    bomb_supply.reset()
                else:
                    bullet_supply.reset()
            elif event.type == DOUBLE_BULLET_TIME:
                is_double_bullet = False
                pygame.time.set_timer(DOUBLE_BULLET_TIME, 0)
            elif 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 > 1000000:
            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 life_num and not paused:
            #检测用户的键盘操作
            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):
                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 + 31, 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.energy -= 1
                                e.hit = True
                                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
                    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)
                    #当生命值大于30%显示绿色,否则显示红色
                    energy_remain = each.energy / enemy.BigEnemy.energy
                    if energy_remain > 0.3:
                        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
                        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
                    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)
                    #当生命值大于40%显示绿色,否则显示红色
                    energy_remain = each.energy / enemy.MidEnemy.energy
                    if energy_remain > 0.4:
                        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
                        if e2_destroy_index == 0:
                            score += 6000
                            each.reset()  #被打死了回炉重造233
            #绘制小型敌机
            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
                        if e1_destroy_index == 0:
                            score += 1000
                            each.reset()  #被打死了回炉重造233

            #检测我方飞机是否被撞
            enemies_down = pygame.sprite.spritecollide(
                me, enemies, False, pygame.sprite.collide_mask)
            if enemies_down:
                if 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)
            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
                    if me_destroy_index == 0:
                        life_num -= 1
                        me.reset()
                        pygame.time.set_timer(INVINCIBLE_TIME, 3 * 1000)

            #切换图片增加动效
            if not (delay % 5):
                switch_image = not switch_image

            delay -= 1
            if not delay:
                delay = 100
            #绘制全屏炸弹数量
            bomb_text = bomb_font.render('x %d' % bomb_num, True, WHITE)
            text_rect = bomb_text.get_rect()
            screen.blit(bomb_image, (10, height - bomb_rect.height - 10))
            screen.blit(bomb_text,
                        (20 + bomb_rect.width, height - 5 - text_rect.height))
            #绘制剩余生命数量
            for i in range(life_num):
                screen.blit(life_image,
                            ((width - 10 - (i + 1) * life_rect.width),
                             (height - 10 - life_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('recorder.txt', 'r') as f:
                    record_score = int(f.read())
                    f.close()
            #如果玩家得分高于最高分,则存档
            if score > record_score:
                f = open('recorder.txt', 'w')
                f.write(str(score))
                f.close()
            #绘制结束界面
            record_score_text = score_font.render("Best : %d" % record_score,
                                                  True, (255, 255, 255))
            screen.blit(record_score_text, (50, 50))

            gameover_text1 = gameover_font.render("Your Score", True,
                                                  (255, 255, 255))
            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,
                                                  (255, 255, 255))
            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.left, again_rect.top = \
                             (width - again_rect.width) // 2, \
                             gameover_text2_rect.bottom + 50
            screen.blit(again_image, again_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.collidepoint(pos):
                    # 调用main函数,重新开始游戏
                    main()
                # 如果用户点击“结束游戏”
                elif gameover_rect.collidepoint(pos):
                    # 退出游戏
                    pygame.quit()
                    sys.exit()

        #绘制暂停按钮
        screen.blit(paused_image, paused_rect)

        pygame.display.flip()
        clock.tick(60)
Exemplo n.º 9
0
def main():
    #生成飞机
    me = myplane.Myplane(bg_size)
    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
    BULLET_NUM=4
    for i in range(BULLET_NUM):
        bullet1.append(bullet.Bullet1(me.rect.midtop))
        
        
    #中弹图片索引
    e1_destroy_index=0
    e2_destroy_index=0
    e3_destroy_index=0
    me_destroy_index=0
    
    
    #统计得分 
    
        
    score_font=pygame.font.Font('font/font.ttf',36)
    
    #暂停游戏
    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()
    paused_rect=pause_nor_image.get_rect()
    paused_rect.left,paused_rect.top=width-paused_rect.width-10,10
    paused_image=pause_nor_image
    
    #全屏炸弹
    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
    
    
    clock=pygame.time.Clock()
    
   
    Delay=100
    switch_image = True
    score=0
    
    
    running= True

    while running:
       
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
            #暂停继续键
            elif event.type == MOUSEBUTTONDOWN:
                if event.button==1 and paused_rect.collidepoint(event.pos):
                    paused=not paused 
            elif event.type == MOUSEMOTION:  
                if paused_rect.collidepoint(event.pos):
                    if paused:
                        paused_image=resume_pressed_image
                    else:
                        paused_image=pause_pressed_image
                else:
                     if paused:
                        paused_image=resume_nor_image
                     else:
                        paused_image=pause_nor_image
          #炸弹键              
            elif event.type==KEYDOWN:
                if event.key==K_SPACE:
                    if bomb_num:
                        bomb_num-=1
                        for each in enemies:
                            if each.rect.bottom>0:
                                each.active=False
        
        score_font=pygame.font.Font('font/font.ttf',36)
        screen.blit(background,(0,0))
        
        if not paused:
            #检测键盘操作
            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 not(Delay%10):
                bullet1[bullet1_index].reset(me.rect.midtop)
                bullet1_index=(bullet1_index+1)%BULLET_NUM
                
            #检测是否击中敌机
            for b in bullet1:
                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.energy-=1
                            if e.energy==0:
                                e.active=False
                        else:
                            e.active=False
            
            
            
            
            
            #绘制敌方飞机
            for each in big_enemies:
                if each.active:
                    each.move()
                    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)
                
                    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)
                
                else:
                    #毁灭
                    while e3_destroy_index < 4:
                        screen.blit(each.destroy_images[e3_destroy_index],each.rect)
                        e3_destroy_index+=1
                    score+=10000
                    each.reset()
                    
            for each in mid_enemies:
                if each.active:
                    each.move()
                    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)
                
                    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:
                    #毁灭
                    while e2_destroy_index < 4:
                        screen.blit(each.destroy_images[e2_destroy_index],each.rect)
                        e2_destroy_index+=1
                    score+=6000
                    each.reset()
                    
            for each in small_enemies:
                if each.active:
                    each.move()
                    screen.blit(each.image,each.rect)
                else:
                    #毁灭
                    while e1_destroy_index < 4:
                        screen.blit(each.destroy_images[e1_destroy_index],each.rect)
                        e1_destroy_index+=1
                    score+=1000
                    each.reset()
            
            
            #检测我方飞机被撞
            enemies_down=pygame.sprite.spritecollide(me,enemies,False,pygame.sprite.collide_mask)
            if enemies_down:
                me.active=False
                for e in enemies_down:
                    e.active=False
            #绘制我方飞机
            if me.active:
                
                screen.blit(me.image, me.rect)
             
            else:
                #毁灭
                while me_destroy_index < 4:
                        screen.blit(me.destroy_images[me_destroy_index],me.rect)
                        me_destroy_index+=1
                running=False
            
            
            #显示炸弹
            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))
            
            #绘制暂停
        screen.blit(paused_image,paused_rect)
   
        if not(Delay % 5):
            switch_image = not switch_image

        
        Delay-=1
        if not Delay:
            Delay = 100
        pygame.display.flip()
        clock.tick(60)
    pygame.quit()
    sys.exit
Exemplo n.º 10
0
def main():
    pygame.mixer.music.play(-1)

    #生成mylpane
    me = myplane.Myplane(bg_size)

    enemies = pygame.sprite.Group()

    #smallenemy
    small_enemies = pygame.sprite.Group()
    add_small_enemies(small_enemies, enemies, 15)

    #游戏结束画面
    gameover_font = pygame.font.Font('font/font_1.ttf', 48)
    gameover_fontx = pygame.font.Font('font/font_3.ttf', 28)

    #midenemy
    mid_enemies = pygame.sprite.Group()
    add_mid_enemies(mid_enemies, enemies, 5)

    #bigenemy
    big_enemies = pygame.sprite.Group()
    add_big_enemies(big_enemies, enemies, 2)

    #限制重复打开最高分记录文件
    record_tag = 1

    #定义子弹列表
    bullet2 = []
    bullet2_index = 0
    BULLET2_NUM = 10
    for i in range(BULLET2_NUM // 2):
        bullet2.append(bullet.Bullet2((me.rect.centerx - 28, me.rect.centery)))
        bullet2.append(bullet.Bullet2((me.rect.centerx + 25, me.rect.centery)))
    bullet1 = []
    bullet1_index = 0
    BULLET_NUM = 5
    for i in range(BULLET_NUM):
        bullet1.append(bullet.Bullet1(me.rect.midtop))

    #30秒一个补给
    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)

    #玩家飞机刷新间隔
    x = False

    #双发子弹定时器
    DOUBLE_BULLET_TIME = USEREVENT + 1

    INVINCIBLE = USEREVENT + 2

    #标记是否使用双子弹
    tag_double_bullet = False

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

    running = True

    board_image = pygame.image.load('images/board.png').convert_alpha()
    board_rect = board_image.get_rect()
    board_rect1 = board_rect
    board_rect2 = board_rect

    #暂停标志
    pause = False
    button_pa_1 = pygame.image.load('images/button_pa-1.png').convert_alpha()
    button_pa_2 = pygame.image.load('images/button_pa-2.png').convert_alpha()
    button_co_1 = pygame.image.load('images/button_co-1.png').convert_alpha()
    button_co_2 = pygame.image.load('images/button_co-2.png').convert_alpha()
    pause_rect = button_pa_1.get_rect()
    pause_rect.left, pause_rect.top = width - pause_rect.width - 10, 10
    pause_image = button_pa_1

    #炸弹
    bomb_image = pygame.image.load('images/bomb.png').convert_alpha()
    bomb_rect = bomb_image.get_rect()
    bomb_font = pygame.font.Font('font/font_1.ttf', 48)
    bomb_num = 3

    clock = pygame.time.Clock()

    score = 0
    score_font = pygame.font.Font('font/font_1.ttf', 36)

    #难度设置
    level = 1

    switch_image = True

    #中弹图片索引
    e1_destroy_index = 0
    e2_destroy_index = 0
    e3_destroy_index = 0
    me_destroy_index = 0
    #延迟
    delay = 100

    while running:
        #screen.blit(background , (0 , 0))
        bg1.map_update(screen)
        bg2.map_update(screen)
        bg1.map_rolling()
        bg2.map_rolling()

        if level == 1 and score > 2000:
            level = 2
            up_level.play()
            add_small_enemies(small_enemies, enemies, 3)
            add_mid_enemies(mid_enemies, enemies, 2)
            add_big_enemies(big_enemies, enemies, 1)
        if level == 2 and score > 5000:
            level = 3
            up_level.play()
            add_small_enemies(small_enemies, enemies, 3)
            add_mid_enemies(mid_enemies, enemies, 2)
            add_big_enemies(big_enemies, enemies, 1)
            increase_speed(small_enemies, 1)
        if level == 3 and score > 10000:
            level = 4
            up_level.play()
            add_small_enemies(small_enemies, enemies, 5)
            add_mid_enemies(mid_enemies, enemies, 3)
            add_big_enemies(big_enemies, enemies, 2)
            increase_speed(small_enemies, 1)
            increase_speed(mid_enemies, 1)
        if level == 4 and score > 20000:
            level = 5
            up_level.play()
            add_small_enemies(small_enemies, enemies, 5)
            add_mid_enemies(mid_enemies, enemies, 3)
            add_big_enemies(big_enemies, enemies, 2)
            increase_speed(small_enemies, 1)
            increase_speed(mid_enemies, 1)

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

            elif event.type == MOUSEBUTTONDOWN:
                if event.button == 1 and pause_rect.collidepoint(event.pos):
                    if pause_image == button_co_2:
                        pause_image = button_pa_2
                    else:
                        pause_image = button_co_2
                    screen.blit(pause_image, pause_rect)
                    pause = not pause
                    if pause:
                        pygame.time.set_timer(SUPPLY_TIME, 0)
                        pygame.mixer.music.pause()
                        pygame.mixer.pause()
                    else:
                        pygame.time.set_timer(SUPPLY_TIME, 30 * 1000)
                        pygame.mixer.music.unpause()
                        pygame.mixer.unpause()

            elif event.type == MOUSEMOTION:
                if pause_rect.collidepoint(event.pos):
                    if pause:
                        pause_image = button_co_2
                    else:
                        pause_image = button_pa_2
                else:
                    if pause:
                        pause_image = button_co_1
                    else:
                        pause_image = button_pa_1

            elif 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

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

            elif event.type == DOUBLE_BULLET_TIME:
                tag_double_bullet = False
                pygame.time.set_timer(DOUBLE_BULLET_TIME, 0)

            elif event.type == INVINCIBLE:
                me.invincible = False
                pygame.time.set_timer(INVINCIBLE, 0)

        #画暂停符号
        if life_num != 0:
            screen.blit(pause_image, pause_rect)
        if pause == False 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()
                    tag_double_bullet = True
                    pygame.time.set_timer(DOUBLE_BULLET_TIME, 20 * 1000)
                    bullet_supply.active = False

            #bullet
            if not (delay % 10):
                bullet_sound.play()
                if tag_double_bullet:
                    bullets = bullet2
                    bullets[bullet2_index].reset(
                        (me.rect.centerx - 28, me.rect.centery))
                    bullets[bullet2_index + 1].reset(
                        (me.rect.centerx + 25, 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) % BULLET_NUM

            #碰撞检测bullet
            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.energy -= 1
                                e.hit = True
                                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 + 20 , each.rect.top - 5),\
                                    (each.rect.right - 20 , each.rect.top - 5),\
                                     2)
                    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 + 20 , each.rect.top - 5), \
                                     (each.rect.left + 20 + (each.rect.width - 40) * energy_remain , \
                                      each.rect.top - 5) , 2)
                    #出场音效
                    if each.rect.bottom == -50:
                        enemy3_fly_sound.play()
                else:
                    #destroy
                    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
                        if e3_destroy_index == 0:
                            enemy3_fly_sound.stop()
                            score += 1500
                            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 + 20 , each.rect.top + 10),\
                                    (each.rect.right - 20 , each.rect.top + 10),\
                                     2)
                    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 + 20 , each.rect.top + 10), \
                                   (each.rect.left + 20 + (each.rect.width - 40) * energy_remain , \
                                    each.rect.top + 10) , 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
                        if e2_destroy_index == 0:
                            score += 600
                            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
                        if e1_destroy_index == 0:
                            score += 100
                            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 me.invincible:
                    if x:
                        if switch_image:
                            screen.blit(me.image1, me.rect)
                        else:
                            screen.blit(me.image2, me.rect)
                else:
                    if switch_image:
                        screen.blit(me.image1, me.rect)
                    else:
                        screen.blit(me.image2, me.rect)
            else:
                if not (delay % 3):
                    if me_destroy_index == 0:
                        me_down_sound.play()
                    screen.blit(each.destroy_images[me_destroy_index], me.rect)
                    me_destroy_index = (me_destroy_index + 1) % 4
                    if me_destroy_index == 0:
                        life_num -= 1
                        me.reset()
                        pygame.time.set_timer(INVINCIBLE, 3 * 1000)

            #画炸弹
            bomb_str = bomb_font.render('× %d' % bomb_num, True, WHITE)
            str_rect = bomb_str.get_rect()
            screen.blit(bomb_image, (10, height - 10 - bomb_rect.height))
            screen.blit(bomb_str,
                        (20 + bomb_rect.width, height - 5 - str_rect.height))

            #画生命数量
            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))
            #画计分板
            score_str = score_font.render('Score : %s' % str(score), True,
                                          WHITE)
            screen.blit(score_str, (5, 5))

        #没有生命的时候游戏结束
        elif life_num == 0:
            #音乐停止
            pygame.mixer.music.stop()
            pygame.mixer.stop()

            #停止发补给
            pygame.time.set_timer(SUPPLY_TIME, 0)

            if record_tag == 1:
                #查看历史最高分
                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))
                    record_score = score
                    print(record_score)
                record_tag = 0
            best_score_str = score_font.render(
                'Best Score : %d' % record_score, True, WHITE)
            screen.blit(best_score_str, (5, 5))

            best_score_text = gameover_font.render('Your Score', True, WHITE)
            best_score_text_rect = best_score_text.get_rect()
            best_score_text_rect.left = (width -
                                         best_score_text_rect.width) // 2
            best_score_text_rect.top = (height - best_score_text_rect.height -
                                        150) // 2
            screen.blit(best_score_text, best_score_text_rect)

            best_score_vtext = gameover_font.render(str(score), True, WHITE)
            best_score_vtext_rect = best_score_vtext.get_rect()
            best_score_vtext_rect.left = (width -
                                          best_score_vtext_rect.width) // 2
            best_score_vtext_rect.top = (
                height - best_score_vtext_rect.height - 30) // 2
            screen.blit(best_score_vtext, best_score_vtext_rect)

            board_rect1.left = (width - board_rect.width) // 2
            board_rect1.top = (height - board_rect.height + 150) // 2
            screen.blit(board_image, board_rect1)

            board_str1 = gameover_fontx.render('Start Again', True, BLACK)
            board_str1_rect = board_str1.get_rect()
            board_str1_rect.left = (width - board_rect.width) // 2 +\
                                   board_rect.width // 2 - board_str1_rect.width // 2
            board_str1_rect.top = (height - board_rect.height + 150) // 2 + 13
            screen.blit(board_str1, board_str1_rect)

            board_rect2.left = (width - board_rect.width) // 2
            board_rect2.top = (height - board_rect.height + 280) // 2
            screen.blit(board_image, board_rect2)

            board_str2 = gameover_fontx.render('Quit Game', True, BLACK)
            board_str2_rect = board_str2.get_rect()
            board_str2_rect.left = (width - board_rect.width) // 2 +\
                                   board_rect.width // 2 - board_str2_rect.width // 2
            board_str2_rect.top = (height - board_rect.height + 280) // 2 + 13
            screen.blit(board_str2, board_str2_rect)

            if pygame.mouse.get_pressed()[0]:
                pos = pygame.mouse.get_pos()
                #重新开始游戏
                if board_rect1.right > pos[0] > board_rect1.left and \
                   397 < pos[1] < 55 + 397:
                    main()
                #结束游戏
                elif board_rect2.right > pos[0] > board_rect2.left and \
                   462 < pos[1] < 55 + 462:
                    pygame.quit()
                    sys.exit()

        pygame.display.flip()

        if not (delay % 5):
            switch_image = not switch_image

        if not (delay % 20):
            x = not x

        delay -= 1

        if not delay:
            delay = 100

        clock.tick(60)
Exemplo n.º 11
0
def main():
    # 播放背景音乐 无限循环
    pygame.mixer.music.play(-1)

    # 暂停按钮
    pause_rect = pause_nor_image.get_rect()
    pause_rect.right, pause_rect.top = (width - 10, 10)
    pause_image = pause_nor_image

    # 炸弹
    bomb_rect = bomb_image.get_rect()
    bomb_rect.left, bomb_rect.bottom = (10, height - 10)
    bomb_num = 3

    # 设置难度
    level = 1

    # 帧数设置
    clock = pygame.time.Clock()

    # 血槽颜色
    white = (255, 255, 255)
    green = (0, 255, 0)
    red = (255, 0, 0)
    black = (0, 0, 0)
    orange = (255, 165, 0)

    # 分数统计
    score = 0
    score_font = pygame.font.Font('font/font.ttf', 36)

    # 用于限制文件打开次数
    recoded = False

    # 难度字体
    level_font = pygame.font.Font('font/font.ttf', 18)

    # 炸弹字体
    bomb_font = pygame.font.Font('font/font.ttf', 48)

    # 结束界面字体
    record_font = pygame.font.Font('font/font.ttf', 36)
    end_score_font = pygame.font.Font('font/font.ttf', 56)

    running = True

    pause = False

    # 实例化我方飞机
    me = myplane.Myplane(bg_size)

    # 命数
    life_image = pygame.image.load('image/life.png')
    life_rect = life_image.get_rect()
    life_num = 3

    # 载入补给
    bullet_supply = supply.Bullet_Supply(bg_size)
    bomb_supply = supply.Bomb_Supply(bg_size)
    laser_supply = supply.Laser_Supply(bg_size)
    wave_supply = supply.Wave_Supply(bg_size)
    defend_supply = supply.Defend_Supply(bg_size)

    # 自定义补给时间
    SUPPLY_TIME = USEREVENT

    # 剩余的下一个补给来的时间
    during_time = random.randint(10, 30) * 1000
    pygame.time.set_timer(SUPPLY_TIME, during_time)
    start_time = pygame.time.get_ticks()

    # 定义防护罩时间
    DEFEND_TIME = USEREVENT + 3
    # 防护罩闪烁计时
    defend_num = 0
    # 剩余的防护罩时间
    defend_during_time = 10 * 1000

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

    # 无敌时间计时器
    INVINCIBLE_TIME = USEREVENT + 2
    # 剩余的无敌的时间
    invincible_during_time = 3 * 1000

    # 标志是否使用子弹类型
    bullet_type = 1

    # 我方飞机毁灭动画索引
    me_down_index = 0

    # 实例化敌方飞机
    enemies = pygame.sprite.Group()

    small_enemies = pygame.sprite.Group()
    add_small_enemys(small_enemies, enemies, 15)
    mid_enemies = pygame.sprite.Group()
    add_mid_enemys(mid_enemies, enemies, 8)
    big_enemies = pygame.sprite.Group()
    add_big_enemys(big_enemies, enemies, 5)
    boss = enemy.Boss(bg_size)

    # 载入背景
    bg = background.Background1(bg_size)
    cloud = background.Cloud(bg_size)
    cloud_switch = False

    # 控制背景类型
    bg_type = 0

    # 实例化子弹
    bullet1 = []
    bullet1_index = 0
    bullet1_num = 4
    for i in range(bullet1_num):
        bullet1.append(bullet.Bullet1((0, 0)))

    # 实例化子弹2
    bullet2 = []
    bullet2_index = 0
    bullet2_num = 8
    for i in range(bullet2_num):
        bullet2.append(bullet.Bullet2((0, 0)))

    # 实例化子弹3
    bullet3 = []
    bullet3_index = 0
    bullet3_num = 20
    for i in range(bullet3_num):
        bullet3.append(bullet.Bullet3((0, 0)))

    # 实例化子弹4
    bullet4 = []
    bullet4_switch = 1
    bullet4.append(bullet.Bullet4((0, 0)))

    # 实例化子弹5
    bullet5 = []
    bullet5.append(bullet.Bullet5((0, 0)))

    # 实例化冲击波
    wave = bullet.Wave((0, 0))
    wave_flage = False

    # 实例化防护罩
    defend = bullet.Defend((0, 0))

    # 实例化炸弹爆炸
    bomb_fire = bullet.BombFire((0, 0))

    # 实例化Boss子弹
    boss_bullet = bullet.BossBullet((512, -500))
    boss_bullettwo = []
    boss_bullettwo_index = 0
    boss_bullettwo_num = 4
    boss_bullettwogroup = pygame.sprite.Group()
    for i in range(boss_bullettwo_num):
        boss_bullettwo.append(bullet.BossBulletTwo((0, 0)))
    for i in boss_bullettwo:
        boss_bullettwogroup.add(i)
    # Boss激光实例化
    boss_laser = bullet.BossLaser((0, 0))

    # 子弹放在一起
    bullet_fire1 = []
    bullet_fire1.extend(bullet1)
    bullet_fire1.extend(bullet2)
    bullet_fire1.extend(bullet3)
    bullet_fire2 = []
    bullet_fire2.extend(bullet4)
    bullet_fire2.extend(bullet5)

    # 切换飞机的延迟
    delay = 100

    # 用于切换飞机
    switch_image = True

    # 作弊开关
    cheat = 0

    # 程序启动
    while running:
        # 暂停设置
        mouse_left, mouse_top = pygame.mouse.get_pos()

        if pause_rect.collidepoint(mouse_left, mouse_top):
            if not pause:
                pause_image = pause_pressed_image
            else:
                pause_image = resume_pressed_image
        else:
            if not pause:
                pause_image = pause_nor_image
            else:
                pause_image = resume_nor_image

        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):
                    pause = not pause
                    if pause:
                        pause_time = pygame.time.get_ticks()
                        # 刷新剩余时间
                        if defend.active:
                            defend_during_time = defend_during_time - (pause_time - defend_start_time)
                        if me.invincible and not defend.active:
                            invincible_during_time = invincible_during_time - (pause_time - invincible_start_time)
                        during_time = during_time - (pause_time-start_time)
                        # 暂停补给计时器
                        pygame.time.set_timer(DEFEND_TIME, 0)
                        pygame.time.set_timer(INVINCIBLE_TIME, 0)
                        pygame.time.set_timer(SUPPLY_TIME, 0)
                        pygame.mixer.music.pause()
                        pygame.mixer.pause()
                    else:
                        pygame.time.set_timer(DEFEND_TIME, defend_during_time)
                        pygame.time.set_timer(INVINCIBLE_TIME, invincible_during_time)
                        pygame.time.set_timer(SUPPLY_TIME, during_time)
                        defend_start_time = pygame.time.get_ticks()
                        invincible_start_time = pygame.time.get_ticks()
                        start_time = pygame.time.get_ticks()
                        pygame.mixer.music.unpause()
                        pygame.mixer.unpause()
                # 结束界面的选择
                if life_num == 0:
                    if event.button == 1 and again_rect.collidepoint(event.pos):
                        main()
                    elif event.button == 1 and gameover_rect.collidepoint(event.pos):
                        pygame.quit()
                        sys.exit()

            # 发射炸弹
            if event.type == KEYDOWN and not pause:
                if event.key == K_SPACE and bomb_num:
                    bomb_sound.play()
                    bomb_num -= 1
                    bomb_fire.reset(me.rect.center)
                    bomb_fire.active = True
                    bomb_fire_pos = me.rect.center
                # 作弊
                if cheat != 4:
                    if event.key == K_r:
                        cheat = 1
                    elif event.key == K_y and cheat == 1:
                        cheat = 2
                    elif event.key == K_n and cheat == 2:
                        cheat = 3
                    elif event.key == K_b and cheat == 3:
                        cheat = 4
                    else:
                        cheat = 0

            # 补给
            if event.type == SUPPLY_TIME:
                supply_sound.play()
                during_time = random.randint(10, 30) * 1000
                pygame.time.set_timer(SUPPLY_TIME, during_time)
                start_time = pygame.time.get_ticks()
                if random.randint(0, 7-level) == 0:
                    laser_supply.reset()
                else:
                    supply_choice = random.choice([1, 2, 3, 4])
                    if supply_choice == 1:
                        bullet_supply.reset()
                    elif supply_choice == 2:
                        bomb_supply.reset()
                    elif supply_choice == 3:
                        wave_supply.reset()
                    elif supply_choice == 4:
                        defend_supply.reset()

            # 无敌时间结束
            if event.type == INVINCIBLE_TIME:
                pygame.time.set_timer(INVINCIBLE_TIME, 0)
                invincible_during_time = 3 * 1000
                me.invincible = False

            # 防护罩时间结束
            if event.type == DEFEND_TIME:
                pygame.time.set_timer(DEFEND_TIME, 0)
                defend_during_time = 10 * 1000
                defend.active = False
                me.invincible = False
                defend_num = 0

        # 绘制背景
        if bg_type == 2:
            # 载入背景
            bg = background.Background2(bg_size)
            bg_type = 0
        if bg_type == 3:
            # 载入背景
            bg = background.Background3(bg_size)
            bg_type = 0
        if not pause and not delay % 2:
            bg.move()
        screen.blit(bg.background1, bg.background1_rect)
        screen.blit(bg.background2, bg.background2_rect)

        if (level == 3 or level == 5) and cloud_switch:
            if not pause:
                cloud.move()
            screen.blit(cloud.image, cloud.rect)
            if level == 3 and cloud.rect.centery == height // 2:
                bg_type = 2
            if level == 5 and cloud.rect.centery == height // 2:
                bg_type = 3
            if cloud.rect.bottom == 0:
                cloud_switch = False

        if life_num and not pause:
            # 检测键盘操作
            key_pressed = pygame.key.get_pressed()
            if key_pressed[K_w] or key_pressed[KEYUP]:
                me.moveUp()
            if key_pressed[K_s] or key_pressed[KEYDOWN]:
                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()

            # 绘制补给,并检测碰撞
            # 弹2
            if bullet_supply.active:
                bullet_supply.move()
                screen.blit(bullet_supply.image, bullet_supply.rect)
                if pygame.sprite.collide_mask(me, bullet_supply):
                    get_bullet_sound.play()
                    if bullet_type == 2 or bullet_type == 3:
                        bullet_type = 3
                    else:
                        bullet_type = 2
                    bullet_supply.active = False
            # 激光
            if laser_supply.active:
                laser_supply.move()
                screen.blit(laser_supply.image, laser_supply.rect)
                if pygame.sprite.collide_mask(me, laser_supply):
                    get_bullet_sound.play()
                    if bullet_type == 4 or bullet_type == 5:
                        bullet_type = 5
                    else:
                        bullet_type = 4
                    laser_supply.active = False
            # 炸弹
            if bomb_supply.active:
                bomb_supply.move()
                screen.blit(bomb_supply.image, bomb_supply.rect)
                if pygame.sprite.collide_mask(me, bomb_supply):
                    get_bomb_sound.play()
                    if bomb_num < 3:
                        bomb_num += 1
                    bomb_supply.active = False

            # 冲击波
            if wave_supply.active:
                wave_supply.move()
                screen.blit(wave_supply.image, wave_supply.rect)
                if pygame.sprite.collide_mask(me, wave_supply):
                    get_bomb_sound.play()
                    wave_flage = True
                    wave_supply.active = False

            # 防护罩
            if defend_supply.active:
                defend_supply.move()
                screen.blit(defend_supply.image, defend_supply.rect)
                if pygame.sprite.collide_mask(me, defend_supply):
                    get_bomb_sound.play()
                    defend.active = True
                    pygame.time.set_timer(DEFEND_TIME, defend_during_time)
                    defend_start_time = pygame.time.get_ticks()
                    defend_supply.active = False

            # 检测我方飞机是否被撞
            if cheat != 4:
                enemies_down = pygame.sprite.spritecollide(me, enemies, False, pygame.sprite.collide_mask)  # 返回碰撞的列表,以mask方法检测
                if enemies_down and not me.invincible:
                    me.active = False
                    for each in enemies_down:
                        each.active = False
                if pygame.sprite.collide_mask(me, boss):
                    if not me.invincible:
                        me.active = False
                if boss_bullet.active:
                    if pygame.sprite.collide_mask(boss_bullet, me) and not me.invincible:
                        me.active = False
                        boss_bullet.active = False
                if pygame.sprite.spritecollide(me, boss_bullettwogroup, False, pygame.sprite.collide_mask) and not me.invincible:
                    me.active = False
                if boss_laser.active:
                    if pygame.sprite.collide_mask(boss_laser, me) and not me.invincible:
                        me.active = False

            # 难度变化
            if level == 1 and score >= 50000:
                level = 2
                upgrade_sound.play()
                add_small_enemys(small_enemies, enemies, 5)
                add_mid_enemys(mid_enemies, enemies, 1)
                for each in small_enemies:
                    each.speed += 1

            elif level == 2 and score >= 100000:
                level = 3
                cloud_switch = True
                upgrade_sound.play()
                add_small_enemys(small_enemies, enemies, 5)
                add_mid_enemys(mid_enemies, enemies, 3)
                add_big_enemys(big_enemies, enemies, 2)
                for each in small_enemies:
                    each.speed += 1
                for each in mid_enemies:
                    each.speed += 1

            elif level == 3 and score >= 150000:
                level = 4
                upgrade_sound.play()
                add_small_enemys(small_enemies, enemies, 5)
                add_mid_enemys(mid_enemies, enemies, 3)
                add_big_enemys(big_enemies, enemies, 2)
                for each in small_enemies:
                    each.speed += 1
                for each in mid_enemies:
                    each.speed += 1
                for each in big_enemies:
                    each.speed += 1

            elif level == 4 and score >= 200000:
                level = 5
                cloud_switch = True
                upgrade_sound.play()
                add_small_enemys(small_enemies, enemies, 5)
                add_mid_enemys(mid_enemies, enemies, 3)
                add_big_enemys(big_enemies, enemies, 2)
                for each in small_enemies:
                    each.speed += 2
                for each in mid_enemies:
                    each.speed += 2
                for each in big_enemies:
                    each.speed += 1

            elif level == 5 and score >= 270000:
                level = 6
                score_time = pygame.time.get_ticks()
                boss.active = True
                for e in enemies:
                    e.active = False

            # 绘制我方飞机
            if me.active:
                if not me.invincible or defend.active:
                    if not (delay % 5):
                        switch_image = not switch_image
                    if switch_image:
                        screen.blit(me.image1, me.rect)
                    else:
                        screen.blit(me.image2, me.rect)
                elif me.invincible and defend.active == False:
                    if not (delay % 3):
                        if not (delay % 5):
                            switch_image = not switch_image
                        if switch_image:
                            screen.blit(me.image1, me.rect)
                        else:
                            screen.blit(me.image2, me.rect)
            else:
                # 毁灭
                if me_down_index == 0:
                    me_down_sound.play()
                screen.blit(me.down_image[me_down_index], me.rect)
                if not delay % 5:
                    me_down_index = (me_down_index + 1) % 4
                    if me_down_index == 0:
                        if life_num > 0:
                            life_num -= 1
                            me.reset()
                            bullet_type = 1
                            bomb_num = 3
                            wave_flage = False
                            # 无敌时间
                            me.invincible = True
                            pygame.time.set_timer(INVINCIBLE_TIME, 3 * 1000)
                            invincible_start_time = pygame.time.get_ticks()

            # 绘制子弹
            if not (delay % 10):
                if bullet_type == 2:
                    bullet2[bullet2_index].reset((me.rect.centerx - 38, me.rect.centery))  # 只有这里调用了子弹的reset
                    bullet2[bullet2_index + 1].reset((me.rect.centerx + 26, me.rect.centery))  # 只有这里调用了子弹的reset
                    bullet2_index = (bullet2_index + 2) % bullet2_num
                elif bullet_type == 3:
                    bullet3[bullet3_index].reset((me.rect.centerx - 38, me.rect.centery))  # 只有这里调用了子弹的reset
                    bullet3[bullet3_index + 1].reset((me.rect.centerx + 26, me.rect.centery))  # 只有这里调用了子弹的reset
                    bullet3[bullet3_index + 2].reset(me.rect.midtop)  # 只有这里调用了子弹的reset
                    bullet3[bullet3_index + 3].reset((me.rect.centerx - 18, me.rect.centery))  # 只有这里调用了子弹的reset
                    bullet3[bullet3_index + 4].reset((me.rect.centerx + 6, me.rect.centery))  # 只有这里调用了子弹的reset
                    bullet3_index = (bullet3_index + 5) % bullet3_num
                elif bullet_type == 1:
                    bullet1[bullet1_index].reset(me.rect.midtop)  # 只有这里调用了子弹的reset
                    bullet1_index = (bullet1_index + 1) % bullet1_num
            if bullet_type == 4:
                bullet4[0].reset(me.rect.midtop)  # 只有这里调用了子弹的reset
            else:
                bullet4[0].active = False
            if bullet_type == 5:
                bullet5[0].reset(me.rect.midtop)  # 只有这里调用了子弹的reset
            else:
                bullet5[0].active = False

            # 冲击波绘制
            if not delay % 200:
                if wave_flage:
                    wave.reset(me.rect.midtop)

            # 防护罩绘制
            if defend.active:
                defend_num += 1
                me.invincible = True
                defend.reset(me.rect.center)
                if defend_num < 420:
                    screen.blit(defend.image, defend.rect)
                else:
                    if not delay % 5:
                        screen.blit(defend.image, defend.rect)
                # 检测防护罩是否被撞
                enemies_down = pygame.sprite.spritecollide(defend, enemies, False,
                                                           pygame.sprite.collide_mask)  # 返回碰撞的列表,以mask方法检测
                for each in enemies_down:
                    each.active = False

            # 炸弹爆炸绘制
            if bomb_fire.active:
                bomb_fire.move(bomb_fire_pos)
                screen.blit(bomb_fire.image, bomb_fire.rect)
                enemies_down = pygame.sprite.spritecollide(bomb_fire, enemies, False,
                                                           pygame.sprite.collide_mask)
                for each in enemies_down:
                    each.active = False

                # Boss与炸弹碰撞检测
                if boss.active:
                    if pygame.sprite.collide_mask(bomb_fire, boss) and boss.rect.top > 0:
                        if not delay % 5:
                            boss.hit = True
                            boss.energy -= 30
                            if boss.energy <= 0:
                                boss.active = False

            # Boss子弹绘制
            if boss.active and not delay % 400:
                boss_bullet.reset(boss.rect.center)

            if boss.active and not delay % 50 and boss.energy <= 0.5 * enemy.Boss.energy:
                boss_bullettwo[boss_bullettwo_index].reset(boss.rect.midtop)
                boss_bullettwo_index = (boss_bullettwo_index + 1) % boss_bullettwo_num

            # 子弹移动 碰撞检测
            # 子弹检测
            for b in bullet_fire1:
                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  # active = False并不会毁灭子弹,子弹只是不再显示,也不再检测碰撞, 不再移动
                        for e in enemy_hit:
                            if e in small_enemies:
                                e.active = False
                            else:
                                e.hit = True
                                e.energy -= 1
                                if e.energy <= 0:
                                    e.active = False
                    # Boss与子弹碰撞检测
                    if boss.active:
                        if pygame.sprite.collide_mask(b, boss) and boss.rect.top > 0:
                            b.active = False
                            boss.hit = True
                            boss.energy -= 1
                            if boss.energy <= 0:
                                boss.active = False

            # 激光检测
            for b in bullet_fire2:
                if b.active:
                    if bullet4_switch == 0:
                        screen.blit(b.image1, b.rect)
                    elif bullet4_switch == 1:
                        screen.blit(b.image2, b.rect)
                    enemy_hit = pygame.sprite.spritecollide(b, enemies, False, pygame.sprite.collide_mask)
                    if enemy_hit:
                        for e in enemy_hit:
                            if e.rect.bottom > 0:
                                if e in small_enemies:
                                    e.active = False
                                else:
                                    if bullet_type == 4:
                                        if not delay % 8:
                                            e.hit = True
                                            e.energy -= 1
                                            if e.energy <= 0:
                                                e.active = False
                                    elif bullet_type == 5:
                                        if not delay % 8:
                                            e.hit = True
                                            e.energy -= 3
                                            if e.energy <= 0:
                                                e.active = False
                    # Boss与激光碰撞检测
                    if boss.active:
                        if pygame.sprite.collide_mask(b, boss) and boss.rect.top > 0:
                            if bullet_type == 4:
                                if not delay % 10:
                                    boss.hit = True
                                    boss.energy -= 3
                                    if boss.energy <= 0:
                                        boss.active = False
                            elif bullet_type == 5:
                                if not delay % 10:
                                    boss.hit = True
                                    boss.energy -= 6
                                    if boss.energy <= 0:
                                        boss.active = False

            # 冲击波检测
            if wave.active:
                wave.move()
                if bullet4_switch == 0:
                    screen.blit(wave.image1, wave.rect)
                elif bullet4_switch == 1:
                    screen.blit(wave.image2, wave.rect)
                enemy_hit = pygame.sprite.spritecollide(wave, enemies, False, pygame.sprite.collide_mask)
                if enemy_hit:
                    for e in enemy_hit:
                        if e in small_enemies:
                            e.active = False
                        else:
                            if not delay % 12:
                                e.hit = True
                                e.energy = int(e.energy * 0.9 - 7)
                                if e.energy <= 0:
                                    e.active = False
                # Boss与冲击波碰撞检测
                if boss.active:
                    if pygame.sprite.collide_mask(wave, boss) and boss.rect.top > 0:
                        if not delay % 12:
                            boss.hit = True
                            boss.energy = int(boss.energy * 0.95 - 7)
                            if boss.energy <= 0:
                                boss.active = False

            # Boss子弹绘制
            if boss.active:
                if boss_bullet.active:
                    boss_bullet.move()
                    screen.blit(boss_bullet.image[boss_bullet.index], boss_bullet.rect)
                    if not delay % 10 and boss_bullet.index != 7:
                        boss_bullet.index += 1
                # 二号Boss子弹
                if boss.energy <= 0.5 * enemy.Boss.energy:
                    for b in boss_bullettwo:
                        if b.active:
                            b.move()
                            screen.blit(b.image, b.rect)
                        elif boss.energy <= 0.2 * enemy.Boss.energy:
                            # 子弹消失时出现激光
                            boss_laser.reset(b.rect.midtop)
                            if switch_image:
                                screen.blit(boss_laser.image1, boss_laser.rect)
                            else:
                                screen.blit(boss_laser.image2, boss_laser.rect)

            if not delay % 5:
                bullet4_switch = (bullet4_switch + 1) % 2

            # 绘制敌方飞机

            # Boss
            if boss.active:
                boss.move()
                if boss.hit:
                    if boss.energy > 0.5 * enemy.Boss.energy:
                        screen.blit(boss.image_hit, boss.rect)
                    elif 0.5 * enemy.Boss.energy >= boss.energy > 0.2 * enemy.Boss.energy:
                        screen.blit(boss.down_image[1], boss.rect)
                    else:
                        screen.blit(boss.down_image[2], boss.rect)
                    boss.hit = False
                else:
                    screen.blit(boss.image, boss.rect)

                # 绘制血槽
                pygame.draw.line(screen, white,
                                 (boss.rect.left, boss.rect.top - 5),
                                 (boss.rect.right, boss.rect.top - 5),
                                 5)
                # 不同血量显示不同颜色
                energy_remain = boss.energy / enemy.Boss.energy
                if energy_remain > 0.5:
                    energy_color = green
                elif 0.5 >= energy_remain > 0.2:
                    energy_color = orange
                else:
                    energy_color = red
                pygame.draw.rect(screen, energy_color,
                                 (boss.rect.left, boss.rect.top - 10,
                                  int((boss.rect.right - boss.rect.left) * energy_remain), 10))
                # 绘制血槽框
                pygame.draw.rect(screen, black, (boss.rect.left, boss.rect.top - 10, boss.rect.width, 10), 2)

                # 即将出现时播放音效
                if boss.rect.bottom == -18:
                    boss_sound.play()

            else:
                # 毁灭
                if boss.boss_down_index == 0 and boss.rect.top > 0:
                    boss_down_sound.play()
                    score_time_end = pygame.time.get_ticks()
                    score += 200000 - (score_time_end - score_time)
                screen.blit(boss.down_image[boss.boss_down_index], boss.rect)
                if not (delay % 10) and boss.rect.top > 0:
                    boss.boss_down_index = (boss.boss_down_index + 1) % 12
                    if boss.boss_down_index == 0:
                        life_num = 0


            # 大型飞机
            for each in big_enemies:
                if each.active:
                    each.move(boss.active)
                    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, white,
                                     (each.rect.left, each.rect.top - 5),
                                     (each.rect.right, each.rect.top - 5),
                                     5)
                    # 不同血量显示不同颜色
                    energy_remain = each.energy / enemy.BigEnemy.energy
                    if energy_remain > 0.5:
                        energy_color = green
                    elif 0.5 >= energy_remain > 0.2:
                        energy_color = orange
                    else:
                        energy_color =red
                    pygame.draw.rect(screen, energy_color,
                                     (each.rect.left, each.rect.top - 10,
                                      int((each.rect.right - each.rect.left) * energy_remain), 10))
                    # 绘制血槽框
                    pygame.draw.rect(screen, black, (each.rect.left, each.rect.top - 10, each.rect.width, 10), 2)

                    # 即将出现时播放音效
                    if each.rect.bottom == -50 or each.rect.bottom == -51 or each.rect.bottom == -52:
                        enemy3_flying_sound.play(-1)
                    if each.rect.top > height:
                        enemy3_flying_sound.stop()
                else:
                    # 毁灭
                    enemy3_flying_sound.stop()
                    if each.e3_down_index == 0:
                        enemy3_down_sound.play()
                    screen.blit(each.down_image[each.e3_down_index], each.rect)
                    if not (delay % 5):
                        each.e3_down_index = (each.e3_down_index + 1) % 6
                        if each.e3_down_index == 0:
                            score += 10000
                            if not boss.active:
                                each.reset()
                                big_enemies.remove(each)
                                while True:
                                    if pygame.sprite.spritecollide(each, big_enemies, False, pygame.sprite.collide_mask):
                                        each.reset()
                                    else:
                                        break
                                big_enemies.add(each)
                            else:
                                big_enemies.remove(each)
                                enemies.remove(each)

            # 中型飞机
            for each in mid_enemies:
                if each.active:
                    each.move(boss.active)
                    if each.hit:
                        screen.blit(each.image_hit, each.rect)
                        each.hit = False
                    else:
                        screen.blit(each.image, each.rect)
                    # 绘制血槽
                    pygame.draw.line(screen, white,
                                     (each.rect.left, each.rect.top - 5),
                                     (each.rect.right, each.rect.top - 5),
                                     5)
                    # 不同血量显示不同颜色
                    energy_remain = (each.energy / enemy.MidEnemy.energy)
                    if energy_remain > 0.5:
                        energy_color = green
                    elif 0.5 >= energy_remain > 0.2:
                        energy_color = orange
                    else:
                        energy_color = red
                    pygame.draw.rect(screen, energy_color,
                                     (each.rect.left, each.rect.top - 10,
                                     int((each.rect.right - each.rect.left) * energy_remain), 10))
                    # 绘制血槽框
                    pygame.draw.rect(screen, black, (each.rect.left, each.rect.top - 10, each.rect.width, 10), 2)

                else:
                    # 毁灭
                    if each.e2_down_index == 0:
                        enemy2_down_sound.play()
                    screen.blit(each.down_image[each.e2_down_index], each.rect)
                    if not (delay % 5):
                        each.e2_down_index = (each.e2_down_index + 1) % 4
                        if each.e2_down_index == 0:
                            score += 3000
                            if not boss.active:
                                each.reset()
                                mid_enemies.remove(each)
                                while True:
                                    if pygame.sprite.spritecollide(each, mid_enemies, False, pygame.sprite.collide_mask):
                                        each.reset()
                                    else:
                                        break
                                mid_enemies.add(each)
                            else:
                                mid_enemies.remove(each)
                                enemies.remove(each)

            # 小型飞机
            for each in small_enemies:
                if each.active:
                    each.move(boss.active)
                    screen.blit(each.image, each.rect)
                else:
                    # 毁灭
                    if each.e1_down_index == 0:
                        enemy1_down_sound.play()
                    screen.blit(each.down_image[each.e1_down_index], each.rect)
                    if not (delay % 5):
                        each.e1_down_index = (each.e1_down_index + 1) % 4
                        if each.e1_down_index == 0:
                            score += 1000
                            if not boss.active:
                                each.reset()
                                small_enemies.remove(each)
                                while True:
                                    if pygame.sprite.spritecollide(each, small_enemies, False, pygame.sprite.collide_mask):
                                        each.reset()
                                    else:
                                        break
                                small_enemies.add(each)
                            else:
                                small_enemies.remove(each)
                                enemies.remove(each)

            # 绘制炸弹
            bomb_text = bomb_font.render('X %d' % bomb_num, True, white)
            bomb_text_rect = bomb_rect.copy()
            bomb_text_rect.left = bomb_rect.width + 20
            screen.blit(bomb_image, bomb_rect)
            screen.blit(bomb_text, bomb_text_rect)

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

        # 绘制结束画面
        elif life_num == 0:
            pygame.mixer.music.stop()
            pygame.mixer.stop()
            pygame.time.set_timer(SUPPLY_TIME, 0)
            if not recoded:
                # 读取历史最高分
                with open('record.txt', 'r') as f:
                    record_score = int(f.read())

                # 如果玩家打破纪录
                if score > record_score:
                    record_score = score
                    with open('record.txt', 'w') as f:
                        f.write(str(score))
                recoded = True

            # 结束界面
            record_score_text = record_font.render('BestScore : %s' % record_score, True, white)
            screen.blit(record_score_text, (10, 10))
            end_score_text1 = end_score_font.render('Your Score', True, white)
            end_score_text2 = end_score_font.render(str(score), True, white)
            end_score_rect1 = end_score_text1.get_rect()
            end_score_rect2 = end_score_text2.get_rect()
            screen.blit(end_score_text1,
                        ((width - end_score_rect1.width) // 2, (height - end_score_rect1.height) // 2 - 80))
            screen.blit(end_score_text2,
                        ((width - end_score_rect2.width) // 2, (height - end_score_rect1.height) // 2 - 100 + end_score_rect1.height))
            screen.blit(again_image, again_rect)
            screen.blit(gameover_image, gameover_rect)

        if life_num:
            # 绘制难度
            level_text = level_font.render('level : %s' % str(level), True, white)
            screen.blit(level_text, (10, 50))
            # 绘制暂停按钮
            screen.blit(pause_image, pause_rect)
            # 绘制分数
            score_text = score_font.render('Score : %d' % score, True, white)
            screen.blit(score_text, (10, 10))
        delay -= 1
        if not delay:
            delay = 1000

        pygame.display.flip()

        # 帧数
        clock.tick(60)
Exemplo n.º 12
0
def main():
    pygame.mixer.music.play(-1)

    #生成我方飞机
    me = myplane.Myplane(bg_size)

    #生成地方飞机
    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)

    #生成普通子弹1
    bullet1 = []
    bullet1_index = 0
    BULLET1_NUM = 6
    for i in range(BULLET1_NUM):
        bullet1.append(bullet.Bullet1(me.rect.midtop))
    #生成超级子弹1
    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)))

    clock = pygame.time.Clock()

    #中弹图片索引
    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)

    #标志是否暂停游戏
    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()
    paused_rect = pause_nor_image.get_rect()
    paused_rect.left, paused_rect.top = width - paused_rect.width - 10, 10
    paused_image = pause_nor_image

    #设置难度级别
    level = 1

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

    #每30秒发放一个补给包
    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

    #标识是否使用超级子弹
    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

    #游戏结束画面
    gameover_font = pygame.font.Font("font/font.TTF", 48)
    again_image = pygame.image.load("images/again.png").convert_alpha()
    again_rect = again_image.get_rect()
    gameover_image = pygame.image.load("images/gameover.png").convert_alpha()
    gameover_rect = gameover_image.get_rect()

    #切换主角飞机图片
    switch_image = True

    #用于切换图片延迟
    delay = 100

    running = True

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

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

            elif event.type == MOUSEMOTION:
                if paused_rect.collidepoint(event.pos):
                    if paused:
                        paused_image = resume_pressed_image
                    else:
                        paused_image = pause_pressed_image
                else:
                    if paused:
                        paused_image = resume_nor_image
                    else:
                        paused_image = pause_nor_image

            elif 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

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

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

            elif 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 > 1000000:
            level = 5
            upgrade_sound.play()
            #增加5架小型敌机、3架中型敌机、2架大型敌机
            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)
            inc_speed(mid_enemies, 1)

        screen.blit(background, (0, 0))

        if life_num and not paused:
            #检测用户的键盘操作
            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):
                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
                        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, 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
                        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
                        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)
            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
                    if me_destroy_index == 0:
                        life_num -= 1
                        me.reset()
                        pygame.time.set_timer(INVINCIBLE_TIME, 3 * 1000)

            #绘制全屏炸弹剩余个数
            bomb_text = bomb_font.render("x %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))

            #绘制剩余生命数量
            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))
            #绘制得分
            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))

            #绘制游戏结束界面
            record_score_text = score_font.render(\
                "Best : %d" %record_score,True,(255,255,255))
            screen.blit(record_score_text, (50, 50))
            gameover_text1 = gameover_font.render(\
                "You Score", True,(255,255,255))
            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,
                                                  (255, 255, 255))
            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.left, again_rect.top = \
                             (width - again_rect.width)//2, \
                             gameover_text2_rect.bottom+50
            screen.blit(again_image, again_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(paused_image, paused_rect)

        #切换图片
        if not (delay % 5):
            switch_image = not switch_image

        delay -= 1
        if not delay:
            delay = 100

        pygame.display.flip()

        clock.tick(60)
Exemplo n.º 13
0
def main():
    # 重新开始和结束游戏的图片
    image_restart = pygame.image.load(
        r'Images/surface/game_again.png').convert_alpha()
    image_restart_rect = image_restart.get_rect()
    image_restart_rect.center = (width // 2, height // 2 + 20)

    image_over = pygame.image.load(
        r'Images/surface/game_over.png').convert_alpha()
    image_over_rect = image_over.get_rect()
    image_over_rect.center = (width // 2, height // 2 + 80)

    # 控制帧率
    clock = pygame.time.Clock()

    while True:

        # 播放bgm
        pygame.mixer.music.play(-1)

        # 中弹图片索引值
        big_enemy_down_index = 0
        mid_enemy_down_index = 0
        small_enemy_down_index = 0
        hero_down_index = 0

        # 保存得分变量
        score = 0
        score_font = pygame.font.SysFont(name='方正舒体', size=50)

        # 标志是否暂停游戏
        pause = False
        pause_nor_image = pygame.image.load(
            r'Images/surface/game_pause_nor.png').convert_alpha()
        pause_pressed_image = pygame.image.load(
            r'Images/surface/game_pause_pressed.png').convert_alpha()
        resume_nor_image = pygame.image.load(
            r'Images/surface/game_resume_nor.png').convert_alpha()
        resume_pressed_image = pygame.image.load(
            r'Images/surface/game_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

        # 用于限制重复打开记录文件
        is_recorded = False

        # 游戏难度级别
        level = 1

        # 全屏炸弹
        bomb_image = pygame.image.load(r'Images/bomb/bomb.png').convert_alpha()
        bomb_rect = bomb_image.get_rect()
        bomb_font = pygame.font.SysFont(name='方正舒体', size=60)
        bomb_num = 3

        # 每30s 提供一个补给包
        supply_bomb = supply.SupplyBomb(bg_size)
        supply_bullet = supply.SupplyBullet(bg_size)
        SUPPLY_TIMER = USEREVENT
        # supply_remain_time = 30 * 1000
        pygame.time.set_timer(SUPPLY_TIMER, 30 * 1000)
        # supply_timer_restart = pygame.time.get_ticks()

        # 超级子弹
        BULLET_SUPER_TIMER = USEREVENT + 1
        # 标志是否使用超级子弹
        is_bullet_super = False

        # 解除我方无敌计时器
        GOD_TIMER = USEREVENT + 2

        # 初始化我的飞机
        hero = myplane.Myplane(bg_size)

        # 生成普通子弹
        bullet_common = []
        bullet_common_index = 0
        BULLET_COMMON_NUM = 4
        for i in range(BULLET_COMMON_NUM):
            bullet_common.append(bullet.BulletCommon(hero.rect.midtop))

        # 生成超级子弹
        bullet_super = []
        bullet_super_index = 0
        BULLET_SUPER_NUM = 8
        for i in range(BULLET_SUPER_NUM // 2):
            bullet_super.append(
                bullet.BulletSuper(
                    (hero.rect.centerx - 33, hero.rect.centery)))
            bullet_super.append(
                bullet.BulletSuper(
                    (hero.rect.centerx + 30, hero.rect.centery)))

        # 生成敌方飞机,保存在这个组里面
        enemies = pygame.sprite.Group()

        # 初始生成小 15 中 4 大 2
        # 生成小飞机
        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)

        # 屏幕中大型敌方飞机数量
        big_enemy_num = 0

        running = True
        count = 100
        switch_image = True  # 这个变量用于表现飞机喷气效果

        # 超级子弹剩余时间
        # super_bullet_remain_time = 0

        # 还有多少条命
        life_num = 3  # gsp@
        life_image = pygame.image.load(r'Images/hero/fly/hero_icon.png')
        life_rect = life_image.get_rect()

        while running:
            # 所有事件监测
            for event in pygame.event.get():
                # 检测退出
                if event.type == QUIT:
                    pygame.quit()
                    sys.exit()

                # 事件为鼠标按下按键
                elif event.type == MOUSEBUTTONDOWN:
                    # 响应用户点击暂停按键的事件,在图标区域内并且按下左键
                    if event.button == 1 and pause_rect.collidepoint(
                            event.pos):
                        # 选择应该画的暂停图片
                        if pause:  # 如果当前状态是pause,那么用户按下后就应该继续游戏,图标应该是暂停的样式
                            pause_image = pause_pressed_image
                        else:
                            pause_image = resume_pressed_image

                        # 响应用户的按键操作
                        pause = not pause

                        # 暂停声音,停止计时器
                        if pause:
                            # 补给计时器停止
                            # supply_remain_time -= (pygame.time.get_ticks() - supply_timer_restart)
                            pygame.time.set_timer(SUPPLY_TIMER, 0)
                            '''
                            # 如果补给剩余时间为0或者负数,表示应该投放补给了
                            if supply_remain_time <= 0:
                                print('ATTENTION: supply_remain_time = %d' % supply_remain_time)
                                supply_remain_time = 1
                            '''

                            # 超级子弹计时器停止
                            if is_bullet_super:
                                pygame.time.set_timer(BULLET_SUPER_TIMER, 0)
                            '''
                            #   如果超级子弹还有时间,证明需要结算它的剩余时间
                            if super_bullet_remain_time:
                                pygame.time.set_timer(BULLET_SUPER_TIMER, 0)
                                super_bullet_remain_time -= (pygame.time.get_ticks() - super_bullet_timer_restart)
                                # 如果发现实际剩余时间为负数,表示已经没有超级时间了,需要取消超级子弹时间
                                if super_bullet_remain_time <= 0:
                                    print('ATTENTION: super_bullet_remain_time = %d' % super_bullet_remain_time)
                                    super_bullet_remain_time = 0
                                    is_bullet_super = False
                            '''
                            pygame.mixer.music.pause()
                            pygame.mixer.pause()

                        # 重启剩余,重启所有计时器
                        else:
                            # 重启补给包计时器
                            # supply_timer_restart = pygame.time.get_ticks()
                            # pygame.time.set_timer(SUPPLY_TIMER, supply_remain_time)
                            pygame.time.set_timer(SUPPLY_TIMER, 30 * 1000)

                            # 重启超级子弹计时器
                            if is_bullet_super:
                                pygame.time.set_timer(BULLET_SUPER_TIMER,
                                                      18 * 1000)
                            '''
                            if super_bullet_remain_time:
                                super_bullet_timer_restart = pygame.time.get_ticks()
                                pygame.time.set_timer(SUPPLY_TIMER, super_bullet_remain_time)
                            '''

                            pygame.mixer.music.unpause()
                            pygame.mixer.unpause()

                    # 关闭游戏
                    elif event.button == 1 and image_over_rect.collidepoint(
                            event.pos):
                        pygame.quit()

                    elif event.button == 1 and image_restart_rect.collidepoint(
                            event.pos):
                        running = False
                        break

                # 鼠标移动到暂停键哪里,需要变颜色
                elif event.type == MOUSEMOTION:
                    if pause_rect.collidepoint(event.pos):
                        if pause:
                            pause_image = resume_pressed_image
                        else:
                            pause_image = pause_pressed_image
                    else:
                        if pause:
                            pause_image = resume_nor_image
                        else:
                            pause_image = pause_nor_image

                # 按下空格丢炸弹
                elif event.type == KEYDOWN:
                    if event.key == K_SPACE:
                        if bomb_num:
                            bomb_num -= 1
                            bombSound.play()
                            for each in enemies:
                                if each.rect.bottom > 0:
                                    each.active = False

                # 补给包投放定时器触发事件
                elif event.type == SUPPLY_TIMER:
                    # supply_timer_restart = pygame.time.get_ticks()
                    # supply_remain_time = 30 * 1000
                    # 播放补给包声音,待添加,gsp@
                    if random.choice([True, False]):
                        supply_bomb.reset()
                    else:
                        supply_bullet.reset()

                # 通知关闭超级子弹,18秒已过
                elif event.type == BULLET_SUPER_TIMER:
                    is_bullet_super = False
                    # super_bullet_remain_time = 0
                    # pygame.time.set_timer(BULLET_SUPER_TIMER, 0)

                elif event.type == GOD_TIMER:
                    hero.god = False
                    pygame.time.set_timer(GOD_TIMER, 0)

            # 等级难度设置
            # 难度2:增加3个小机,2个中飞机,1个大型机,小飞机加速1
            if level == 1 and score > 50000:
                level = 2
                #增加3个小机,2个中飞机,1个大型机
                add_small_enemies(small_enemies, enemies, 3)
                add_mid_enemies(mid_enemies, enemies, 2)
                add_big_enemies(big_enemies, enemies, 1)
                #提升小飞机速度
                speed_up(small_enemies, 1)
            # 难度3:增加4个小机,3个中飞机,1个大型机,中飞机加速1
            elif level == 2 and score > 300000:
                level = 3
                # 增加4个小机,3个中飞机,1个大型机
                add_small_enemies(small_enemies, enemies, 4)
                add_mid_enemies(mid_enemies, enemies, 3)
                add_big_enemies(big_enemies, enemies, 1)
                # 提升中飞机速度
                speed_up(mid_enemies, 1)
            # 难度4:增加5个小机,3个中飞机,2个大型机,小飞机加速1
            elif level == 3 and score > 600000:
                level = 4
                #增加5个小机,3个中飞机,2个大型机
                add_small_enemies(small_enemies, enemies, 5)
                add_mid_enemies(mid_enemies, enemies, 3)
                add_big_enemies(big_enemies, enemies, 2)
                #提升小飞机速度
                speed_up(small_enemies, 1)
            # 难度5:增加5个小机,3个中飞机,2个大型机,小飞机加速1,中飞机加速1
            elif level == 4 and score > 1000000:
                level = 5
                #增加5个小机,3个中飞机,2个大型机
                add_small_enemies(small_enemies, enemies, 5)
                add_mid_enemies(mid_enemies, enemies, 3)
                add_big_enemies(big_enemies, enemies, 2)
                #提升小飞机速度
                speed_up(small_enemies, 1)
                speed_up(mid_enemies, 1)

            # 绘制背景
            screen.blit(background, (0, 0))

            if not pause and life_num:
                # 喷气效果切换变量转换部分
                if not (count % 5):
                    switch_image = not switch_image

                # 检测用户的键盘操作控制飞机
                key_pressed = pygame.key.get_pressed()  # 获取所有按键的序列,按下为True
                if key_pressed[K_w] or key_pressed[K_UP]:
                    hero.moveUp()
                if key_pressed[K_s] or key_pressed[K_DOWN]:
                    hero.moveDown()
                if key_pressed[K_a] or key_pressed[K_LEFT]:
                    hero.moveLeft()
                if key_pressed[K_d] or key_pressed[K_RIGHT]:
                    hero.moveRight()

                # 此处开始绘制所有的图 #####################################################################################
                # 绘制补给包并且检测飞机是否获得
                if supply_bomb.active:
                    supply_bomb.move()
                    screen.blit(supply_bomb.image, supply_bomb.rect)
                    # 碰撞检测
                    if pygame.sprite.collide_mask(supply_bomb, hero):
                        supply_bomb.active = False
                        # 播放获得补给声音 gsp@
                        if bomb_num < 3:
                            bomb_num += 1

                # 绘制补给包并且检测飞机是否获得
                if supply_bullet.active:
                    supply_bullet.move()
                    screen.blit(supply_bullet.image, supply_bullet.rect)
                    # 碰撞检测
                    if pygame.sprite.collide_mask(supply_bullet, hero):
                        supply_bullet.active = False
                        # 播放获得补给声音 gsp@
                        is_bullet_super = True
                        # super_bullet_remain_time = 18 * 1000
                        # pygame.time.set_timer(BULLET_SUPER_TIMER, 0)
                        pygame.time.set_timer(BULLET_SUPER_TIMER, 18 * 1000)
                        # super_bullet_timer_restart = pygame.time.get_ticks()

                # 每10帧绘制一个子弹
                if not (count % 10):
                    # 播放子弹声音
                    # 超级子弹
                    if is_bullet_super:
                        bullets = bullet_super
                        bullets[bullet_super_index].reset(
                            (hero.rect.centerx - 33, hero.rect.centery))
                        bullets[bullet_super_index + 1].reset(
                            (hero.rect.centerx + 30, hero.rect.centery))
                        bullet_super_index = (bullet_super_index +
                                              2) % BULLET_SUPER_NUM

                    else:
                        bullets = bullet_common
                        bullets[bullet_common_index].reset(hero.rect.midtop)
                        bullet_common_index = (bullet_common_index +
                                               1) % BULLET_COMMON_NUM

                # 检测子弹是否击中敌方飞机
                for b in bullets:
                    if b.active:
                        # bulletSound.play()
                        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:
                            # 绘制hit特效
                            screen.blit(each.image_hit, each.rect)
                            each.hit = False
                        else:
                            # 喷气动画切换
                            if switch_image:
                                screen.blit(each.image_fly1, each.rect)
                            else:
                                screen.blit(each.image_fly2, each.rect)

                        # 绘制血槽, 黑色作为底槽
                        pygame.draw.line(screen, BLACK,\
                                         (each.rect.left, each.rect.top - 5),\
                                         (each.rect.right, each.rect.top - 5),\
                                         2)
                        # 生命值大于20%显示绿色
                        energy_ratio = each.energy / enemy.BigEnemy.energy
                        if energy_ratio > 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_ratio, each.rect.top - 5),\
                                         2)

                        # 播放声音
                        if each.rect.bottom == -50:
                            big_enemy_num += 1
                            print('1 create\t\t', big_enemy_num)
                            # 播放大型机到来声音
                            bigEnemyFlySound.play(-1)
                        # 停止播放飞机声音
                        elif each.rect.top == each.bg_height - 50:
                            big_enemy_num -= 1
                            print('2 ------\t\t', big_enemy_num)
                            if big_enemy_num == 0:
                                print('3 num==0\t\t', big_enemy_num)
                                bigEnemyFlySound.stop()
                    else:
                        # 毁灭
                        if not (count % 3):
                            if big_enemy_down_index == 0:
                                bigEnemyDownSound.play()
                                big_enemy_num -= 1
                                print('4 destroy\t\t', big_enemy_num)
                                if big_enemy_num == 0:
                                    bigEnemyFlySound.stop()
                            screen.blit(
                                each.image_destroy[big_enemy_down_index],
                                each.rect)
                            big_enemy_down_index = (big_enemy_down_index +
                                                    1) % 6
                            if big_enemy_down_index == 0:
                                score += 10000
                                each.reset()

                # 绘制敌方中型机
                for each in mid_enemies:
                    if each.active:
                        each.move()

                        if each.hit:
                            # 绘制hit特效
                            screen.blit(each.image_hit, each.rect)
                            each.hit = False
                        else:
                            screen.blit(each.image_fly, each.rect)

                        if each.rect.bottom == -50:
                            # 播放型机到来声音
                            midEnemyFlySound.play()

                        # 绘制血槽, 黑色作为底槽
                        pygame.draw.line(screen, BLACK,\
                                         (each.rect.left, each.rect.top - 5),\
                                         (each.rect.right, each.rect.top - 5),\
                                         2)
                        # 生命值大于20%显示绿色
                        energy_ratio = each.energy / enemy.MidEnemy.energy
                        if energy_ratio > 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_ratio, each.rect.top - 5),\
                                         2)
                    else:
                        # 毁灭
                        if not (count % 3):
                            if mid_enemy_down_index == 0:
                                midEnemyDownSound.play()
                            screen.blit(
                                each.image_destroy[mid_enemy_down_index],
                                each.rect)
                            mid_enemy_down_index = (mid_enemy_down_index +
                                                    1) % 4
                            if mid_enemy_down_index == 0:
                                score += 4000
                                each.reset()

                # 绘制敌方小型机
                for each in small_enemies:
                    if each.active:
                        each.move()
                        screen.blit(each.image_fly, each.rect)
                    else:
                        # 毁灭
                        if not (count % 3):
                            if small_enemy_down_index == 0:
                                smallEnemyDownSound.play()
                            screen.blit(
                                each.image_destroy[small_enemy_down_index],
                                each.rect)
                            small_enemy_down_index = (small_enemy_down_index +
                                                      1) % 4
                            if small_enemy_down_index == 0:
                                score += 1000
                                each.reset()

                # 我们和敌机的碰撞检测
                enemies_down = pygame.sprite.spritecollide(
                    hero, enemies, False, pygame.sprite.collide_mask)
                if enemies_down and not hero.god:
                    hero.active = False
                    for e in enemies_down:
                        e.active = False

                # 绘制我方飞机
                if hero.active:
                    if switch_image:
                        screen.blit(hero.image1,
                                    (hero.rect.left, hero.rect.top))
                    else:
                        if not hero.god:
                            screen.blit(hero.image2,
                                        (hero.rect.left, hero.rect.top))
                        else:
                            screen.blit(hero.image_god,
                                        (hero.rect.left, hero.rect.top))
                else:
                    # 毁灭
                    heroDownSound.play()
                    if not (count % 3):
                        screen.blit(hero.image_destroy[hero_down_index],
                                    hero.rect)
                        hero_down_index = (hero_down_index + 1) % 4
                        if hero_down_index == 0:
                            life_num -= 1
                            if not life_num:
                                # game over
                                pass
                            else:
                                hero.reset()
                                pygame.time.set_timer(GOD_TIMER, 3000)

                #左下角绘制炸弹
                bomb_text = bomb_font.render('X %d' % bomb_num, True, WHITE)
                screen.blit(bomb_image, (10, height - 5 - bomb_rect.height))
                screen.blit(
                    bomb_text,
                    (20 + bomb_rect.width, height - 15 - bomb_rect.height))

                # 右下角绘制剩余生命数量
                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)\
                                    )

                # count自减一和重置部分
                count -= 1
                if not count:
                    count = 100
            # game over
            elif life_num == 0:
                # 这里面的部分只执行一次
                if not is_recorded:
                    is_recorded = True

                    # 背景音乐停止
                    pygame.mixer.music.stop()
                    # 停止全部音效
                    pygame.mixer.stop()
                    # 停止发放补给
                    pygame.time.set_timer(SUPPLY_TIMER, 0)

                    # 获取历史最高分并且保存在record.txt 中
                    # 如果不存在,就创建,并且在里面存一个0
                    if not os.path.isfile('record.txt'):
                        with open('record.txt', 'w') as t:
                            t.write('0')
                            t.close()

                    with open('record.txt', 'r+') as f:
                        temp_score_str = f.read()

                        # 是否为十进制字符串
                        if temp_score_str.isdecimal():
                            highest_score = int(temp_score_str)
                        else:
                            print('ERROR:record.txt中的内容为:%s' % temp_score_str)
                            highest_score = 0

                        if score > highest_score:
                            highest_score = score
                            f.seek(0, 0)
                            f.write(str(highest_score))

                    # 屏幕显示历史最高分的资源图片生成
                    highest_score_font = pygame.font.SysFont(name='方正舒体',
                                                             size=58)
                    highest_score_text = highest_score_font.render(
                        'Best : %s' % str(highest_score), True, WHITE)

                    # Your score 字体和此次得分的字体
                    now_score_font = pygame.font.SysFont(name='方正舒体', size=68)
                    # Your Score 的资源图片生成
                    your_score = now_score_font.render('Your Score', True,
                                                       WHITE)
                    your_score_rect = your_score.get_rect()
                    your_score_rect.center = (width // 2, height // 2 - 150)
                    # 此次得分的资源图片生成
                    score_text = now_score_font.render('%s' % str(score), True,
                                                       WHITE)
                    score_text_rect = score_text.get_rect()
                    score_text_rect.center = (width // 2, height // 2 - 70)

                # 绘制历史最高分
                screen.blit(highest_score_text, (50, 30))
                # 屏幕显示Your Score
                screen.blit(your_score, your_score_rect)
                # 显示此次得分
                screen.blit(score_text, score_text_rect)
                # 绘制从新开始和结束游戏
                screen.blit(image_restart, image_restart_rect)
                screen.blit(image_over, image_over_rect)

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

                #绘制暂停按钮
                screen.blit(pause_image, pause_rect)

            pygame.display.flip()

            clock.tick(60)