示例#1
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, 18)
    #中型
    mid_enemies = pygame.sprite.Group()
    add_mid_enemies(mid_enemies, enemies, 3)
    #大型
    big_enemies = pygame.sprite.Group()
    add_big_enemies(big_enemies, enemies, 1)

    #初级子弹
    bullet1 = []
    bullet1_index = 0
    BULLET1_NUM = 5
    for i in range(BULLET1_NUM):
        bullet1.append(bullet.Bullet1(me.rect.midtop))
    #二级子弹
    bullet2 = []
    bullet2_index = 0
    BULLET2_NUM = 5
    for i in range(BULLET2_NUM):
        bullet2.append(bullet.Bullet2(me.rect.midtop))
    #三级子弹
    bullet3 = []
    bullet3_index = 0
    BULLET3_NUM = 10
    for i in range(BULLET3_NUM // 2):
        bullet3.append(bullet.Bullet1((me.rect.centerx - 33, me.rect.centery)))
        bullet3.append(bullet.Bullet1((me.rect.centerx + 30, me.rect.centery)))
    #四级子弹
    bullet4 = []
    bullet4_index = 0
    BULLET4_NUM = 10
    for i in range(BULLET4_NUM // 2):
        bullet4.append(bullet.Bullet2((me.rect.centerx - 33, me.rect.centery)))
        bullet4.append(bullet.Bullet2((me.rect.centerx + 30, me.rect.centery)))
    #五级子弹
    bullet5 = []
    bullet5_index = 0
    BULLET5_NUM = 15
    for i in range(BULLET5_NUM // 3):
        bullet5.append(bullet.Bullet1(me.rect.midtop))
        bullet5.append(bullet.Bullet1((me.rect.centerx - 33, me.rect.centery)))
        bullet5.append(bullet.Bullet1((me.rect.centerx + 30, me.rect.centery)))
    #六级子弹
    bullet6 = []
    bullet6_index = 0
    BULLET6_NUM = 15
    for i in range(BULLET5_NUM // 3):
        bullet6.append(bullet.Bullet2(me.rect.midtop))
        bullet6.append(bullet.Bullet2((me.rect.centerx - 33, me.rect.centery)))
        bullet6.append(bullet.Bullet2((me.rect.centerx + 30, me.rect.centery)))

    clock = pygame.time.Clock()

    #无敌状态计=计时器
    INVINCIBLE_TIME = USEREVENT + 2

    #用于防止反复打开记录文件
    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()

    #每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)

    #武器等级
    weapon_level = 1

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

    #统计得分
    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

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

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

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

    #用于延迟
    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.pause()
                    else:
                        pygame.time.set_timer(SUPPLY_TIME, 30 * 1000)
                        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 == 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 > 150000:
            level = 3
            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(mid_enemies, 1)
        elif level == 3 and score > 300000:
            level = 4
            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 == 4 and score > 500000:
            level = 5
            upgrade_sound.play()
            # 添加小型敌机*5,中型敌机*2,大型敌机*1
            add_small_enemies(small_enemies, enemies, 5)
            add_mid_enemies(mid_enemies, enemies, 2)
            add_big_enemies(big_enemies, enemies, 1)
            inc_speed(mid_enemies, 1)
        elif level == 5 and score > 750000:
            level = 6
            upgrade_sound.play()
            # 添加小型敌机*5,中型敌机*3,大型敌机*1
            add_small_enemies(small_enemies, enemies, 5)
            add_mid_enemies(mid_enemies, enemies, 2)
            add_big_enemies(big_enemies, enemies, 1)
            # 提升小型敌机的速度
            inc_speed(small_enemies, 1)
        elif level == 6 and score > 1000000:
            level = 7
            upgrade_sound.play()
            # 添加小型敌机*5,中型敌机*3,大型敌机*1
            add_small_enemies(small_enemies, enemies, 5)
            add_mid_enemies(mid_enemies, enemies, 2)
            add_big_enemies(big_enemies, enemies, 1)
            inc_speed(mid_enemies, 1)
        elif level == 7 and score > 1500000:
            level = 8
            upgrade_sound.play()
            # 添加小型敌机*5,中型敌机*3,大型敌机*1
            add_small_enemies(small_enemies, enemies, 5)
            add_mid_enemies(mid_enemies, enemies, 2)
            add_big_enemies(big_enemies, enemies, 1)
            # 提升小型敌机的速度
            inc_speed(small_enemies, 1)
        elif level == 8 and score > 2000000:
            level = 9
            upgrade_sound.play()
            # 添加小型敌机*5,中型敌机*3,大型敌机*1
            add_small_enemies(small_enemies, enemies, 5)
            add_mid_enemies(mid_enemies, enemies, 2)
            add_big_enemies(big_enemies, enemies, 1)
            inc_speed(mid_enemies, 1)

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

        if not paused and life_num:
            #检查用户的键盘操作
            key_pressed = pygame.key.get_pressed()

            if key_pressed[K_w] or key_pressed[K_UP] or key_pressed[K_k]:
                me.moveUp()
            if key_pressed[K_s] or key_pressed[K_DOWN] or key_pressed[K_j]:
                me.moveDown()
            if key_pressed[K_a] or key_pressed[K_LEFT] or key_pressed[K_h]:
                me.moveLeft()
            if key_pressed[K_d] or key_pressed[K_RIGHT] or key_pressed[K_l]:
                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()
                    bullet_supply.active = False
                    #武器等级提升
                    if weapon_level < 6:
                        weapon_level += 1

            #根据武器等级绘制子弹
            if not (delay % 10):
                bullet_sound.play()
                if weapon_level == 1:
                    bullets = bullet1
                    bullets[bullet1_index].reset(me.rect.midtop)
                    bullet1_index = (bullet1_index + 1) % BULLET1_NUM
                if weapon_level == 2:
                    bullets = bullet2
                    bullets[bullet2_index].reset(me.rect.midtop)
                    bullet2_index = (bullet2_index + 1) % BULLET2_NUM
                if weapon_level == 3:
                    bullets = bullet3
                    bullets[bullet3_index].reset(
                        (me.rect.centerx - 33, me.rect.centery))
                    bullets[bullet3_index + 1].reset(
                        (me.rect.centerx + 30, me.rect.centery))
                    bullet3_index = (bullet3_index + 2) % BULLET3_NUM
                if weapon_level == 4:
                    bullets = bullet4
                    bullets[bullet4_index].reset(
                        (me.rect.centerx - 33, me.rect.centery))
                    bullets[bullet4_index + 1].reset(
                        (me.rect.centerx + 30, me.rect.centery))
                    bullet4_index = (bullet4_index + 2) % BULLET4_NUM
                if weapon_level == 5:
                    bullets = bullet5
                    bullets[bullet5_index].reset(me.rect.midtop)
                    bullets[bullet5_index + 1].reset(
                        (me.rect.centerx - 33, me.rect.centery))
                    bullets[bullet5_index + 2].reset(
                        (me.rect.centerx + 30, me.rect.centery))
                    bullet5_index = (bullet5_index + 3) % BULLET5_NUM
                if weapon_level == 6:
                    bullets = bullet6
                    bullets[bullet6_index].reset(me.rect.midtop)
                    bullets[bullet6_index + 1].reset(
                        (me.rect.centerx - 33, me.rect.centery))
                    bullets[bullet6_index + 2].reset(
                        (me.rect.centerx + 30, me.rect.centery))
                    bullet6_index = (bullet6_index + 3) % BULLET6_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
                                if e.energy == 0:
                                    e.active = False
                            else:
                                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_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 += 20000
                            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_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 e2_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 e2_destroy_index == 0:
                        life_num -= 1
                        me.reset()
                        pygame.time.set_timer(INVINCIBLE_TIME, 3 * 1000)

            #绘制炸弹数量
            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))

            #绘制生命数量
            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_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.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)
示例#2
0
def main():
    fight_music, welcome_music = True, True
    # pygame.mixer.music.load(welcome_musice_path)
    # pygame.mixer.music.play(-1)
    # pygame.mixer.music.play(-1)
    # welcome_sound.play(-1)

    # 游戏欢迎界面图标元素
    startGame_image = pygame.image.load(
        "resources/image/startGame.png").convert_alpha()
    startGame_image_rect = startGame_image.get_rect()
    startGameChoose_image = pygame.image.load(
        "resources/image/startGameChoose.png").convert_alpha()
    startGameChoose_image_rect = startGameChoose_image.get_rect()
    start_image = startGame_image
    start_image_rect = start_image.get_rect()
    start_image_rect.left, start_image_rect.top = (
        width - start_image_rect.width) // 2, height // 2 + 20
    double_image = pygame.image.load(
        "resources/image/double.png").convert_alpha()
    double_image_rect = double_image.get_rect()
    doubleChoose_image = pygame.image.load(
        "resources/image/doubleChoose.png").convert_alpha()
    doubleChoose_image_rect = doubleChoose_image.get_rect()
    d_image = double_image
    d_image_rect = d_image.get_rect()
    d_image_rect.left, d_image_rect.top = (
        width - d_image_rect.width) // 2, start_image_rect.bottom + 10

    # 分数
    score = 0
    # 字体
    score_font = pygame.font.Font("resources/font/MarkerFelt.ttf", 36)

    # 控制暂停
    paused = False
    stop = False
    pause_nor_image = pygame.image.load(
        "resources/image/pause_nor.png").convert_alpha()
    pause_pressed_image = pygame.image.load(
        "resources/image/pause_pressed.png").convert_alpha()
    resume_nor_image = pygame.image.load(
        "resources/image/resume_nor.png").convert_alpha()
    resume_pressed_image = pygame.image.load(
        "resources/image/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

    #生成我方飞机
    me1 = myplane.MyPlane(bg_size, "resources/image/player_blue.png",
                          "resources/image/player_blue1.png", width // 4)
    me2 = myplane.MyPlane(bg_size, "resources/image/player_pink.png",
                          "resources/image/player_pink1.png", width // 1.5)
    clock = pygame.time.Clock()

    # 生成我方飞机组,用于碰撞检测
    myplanes = pygame.sprite.Group()
    myplanes.add(me1)

    #我方飞机无敌计时器
    INVINCIBLE_TIME = USEREVENT + 2

    #生成总敌方飞机组,用于碰撞检测
    enemis = pygame.sprite.Group()
    #生成三种敌方飞机组,并新建各种敌机添加到组内
    small_enemis = pygame.sprite.Group()
    add_small_enemis(small_enemis, enemis, 25)
    mid_enemis = pygame.sprite.Group()
    add_mid_enemis(mid_enemis, enemis, 5)
    big_enemis = pygame.sprite.Group()
    add_big_enemis(big_enemis, enemis, 2)

    BULLET1_NUM = 4
    BULLET2_NUM = 8

    #生成子弹
    for i in range(BULLET1_NUM):
        me1.bullet1.append(bullet.Bullet1(me1.rect.midtop))
        me2.bullet1.append(bullet.Bullet1(me2.rect.midtop))
    #生成超级子弹
    for i in range(BULLET2_NUM // 2):
        me1.bullet2.append(
            bullet.Bullet2((me1.rect.centerx - 33, me1.rect.centery)))
        me2.bullet2.append(
            bullet.Bullet2((me2.rect.centerx - 33, me2.rect.centery)))
        me1.bullet2.append(
            bullet.Bullet2((me1.rect.centerx + 30, me1.rect.centery)))
        me2.bullet2.append(
            bullet.Bullet2((me2.rect.centerx + 30, me2.rect.centery)))

    # 全屏炸弹
    bomb_image = pygame.image.load("resources/image/bomb.png").convert_alpha()
    bomb_rect = bomb_image.get_rect()
    bomb_rect.left, bomb_rect.top = 10, height - bomb_rect.height - 10
    bomb_num = 1  # 初始一个炸弹
    bomb_font = pygame.font.Font("resources/font/MarkerFelt.ttf", 48)

    # 每30秒发放一个随机补给包
    bullet_supply = supply.Bullet_Supply(bg_size)
    bomb_supply = supply.Bomb_Supply(bg_size)
    SUPPLY_TIME = USEREVENT
    pygame.time.set_timer(SUPPLY_TIME, 5 * 1000)

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

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

    # 备用飞机图标-生命值
    life_image = pygame.image.load("resources/image/life.png").convert_alpha()
    life_image = pygame.transform.scale(life_image, (40, 40))
    life_rect = life_image.get_rect()
    life_font = pygame.font.Font("resources/font/MarkerFelt.ttf", 40)

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

    #用于切换图片的flag
    switch_image = True

    #用于延迟
    delay = 100

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

    # 游戏结束界面图标
    gameover_img = pygame.image.load(
        "resources/image/gameover1.png").convert_alpha()
    gameover_rect = gameover_img.get_rect()

    # 游戏结束界面
    gameover_font = pygame.font.Font("resources/font/MarkerFelt.ttf", 48)
    again_image = pygame.image.load(
        "resources/image/again.png").convert_alpha()
    again_rect = again_image.get_rect()
    return_image = pygame.image.load(
        "resources/image/return.png").convert_alpha()
    return_rect = return_image.get_rect()

    #游戏主体循环
    running = True
    gamestart = False
    doublePlayer = False
    addPlayer = False
    stop_index = 0

    while running:

        if not gamestart:
            if welcome_music:
                welcome_music = False
                fight_music = True
                pygame.mixer.init()
                pygame.mixer.music.load(welcome_musice_path)
                pygame.mixer.music.set_volume(0.2)
                pygame.mixer.music.play(-1)

            # 绘制游戏欢迎界面
            screen.blit(startbg, (0, 0))
            #单人或者双人选择
            screen.blit(start_image, start_image_rect)
            screen.blit(d_image, d_image_rect)
            # 绘制'开始游戏'
            for event in pygame.event.get():
                # 检测事件
                if event.type == QUIT:
                    pygame.quit()
                    sys.exit()

                elif event.type == MOUSEMOTION:
                    if start_image_rect.collidepoint(event.pos):
                        start_image = startGameChoose_image
                    else:
                        start_image = startGame_image
                    if d_image_rect.collidepoint(event.pos):
                        d_image = doubleChoose_image
                    else:
                        d_image = double_image

                # 如果玩家按下左键
                elif pygame.mouse.get_pressed()[0]:
                    # 获取鼠标坐标
                    pos1 = pygame.mouse.get_pos()
                    # 如果鼠标在“重新开始”上
                    if start_image_rect.left < pos1[0] < start_image_rect.right and \
                            start_image_rect.top < pos1[1] < start_image_rect.bottom:
                        gamestart = True
                    # 如果鼠标在“双人游戏”上
                    if d_image_rect.left < pos1[0] <d_image_rect.right and \
                            d_image_rect.top < pos1[1] <d_image_rect.bottom:
                        doublePlayer = True
                        addPlayer = True
                        gamestart = True

        elif addPlayer:
            # 添加第二架我方飞机
            add_myPlane(me2, myplanes)
            addPlayer = False

        elif gamestart:
            if fight_music:
                fight_music = False
                welcome_music = True
                pygame.mixer.init()
                pygame.mixer.music.load(fight_music_path)
                pygame.mixer.music.set_volume(0.2)
                pygame.mixer.music.play(-1)

            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):
                        # 1代表左键,并且时间范围在paused_rect内
                        paused = not paused  #取反
                        if paused:
                            pygame.time.set_timer(SUPPLY_TIME, 0)
                            pygame.mixer.music.pause()
                            pygame.mixer.pause()
                        else:
                            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 > 0:
                            bomb_num -= 1
                            for each in enemis:
                                if each.rect.bottom > 0:
                                    # 屏幕内的所有敌机炸毁
                                    each.active = False

                elif event.type == SUPPLY_TIME:
                    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:
                    for each in myplanes:
                        # 计时器时间结束
                        each.invincible = False
                        pygame.time.set_timer(INVINCIBLE_TIME, 0)

            #绘制屏幕
            screen.blit(background, (0, 0))

            # 根据用户得分增加难度
            if level == 1 and score > 50000:
                level_up_sound.play()
                level = 2
                # 增加3架小飞机,2架中型飞机,1架大型飞机
                add_small_enemis(small_enemis, enemis, 3)
                add_mid_enemis(mid_enemis, enemis, 2)
                add_big_enemis(big_enemis, enemis, 1)
                # 提升敌机的速度
                inc_speed(small_enemis, 1)
            elif level == 2 and score > 300000:
                level_up_sound.play()
                level = 3
                # 增加4架小飞机,增加3架中型飞机,增加2个大型敌机
                add_small_enemis(small_enemis, enemis, 3)
                add_mid_enemis(mid_enemis, enemis, 3)
                add_big_enemis(big_enemis, enemis, 1)
                inc_speed(mid_enemis, 1)
            elif level == 3 and score > 600000:
                level_up_sound.play()
                level = 4
                # 增加4架小飞机,增加4架中型飞机,增加1个大型敌机
                add_small_enemis(small_enemis, enemis, 3)
                add_mid_enemis(mid_enemis, enemis, 2)
                add_big_enemis(big_enemis, enemis, 1)
                inc_speed(mid_enemis, 1)
                inc_speed(big_enemis, 1)
            elif level == 4 and score > 1200000:
                level_up_sound.play()
                level = 5
                # 增加4架小飞机,增加5架中型飞机,增加1个大型敌机
                add_small_enemis(small_enemis, enemis, 3)
                add_mid_enemis(mid_enemis, enemis, 2)
                add_big_enemis(big_enemis, enemis, 1)
                inc_speed(mid_enemis, 1)
                inc_speed(big_enemis, 1)
            elif level == 5 and score > 2400000:
                level_up_sound.play()
                # 增加6架小飞机,增加6架中型飞机,增加5个大型敌机
                add_small_enemis(small_enemis, enemis, 6)
                add_mid_enemis(mid_enemis, enemis, 6)
                add_big_enemis(big_enemis, enemis, 1)
                inc_speed(small_enemis, 1)
                inc_speed(mid_enemis, 1)
                inc_speed(big_enemis, 1)

            if (not doublePlayer and me1.energy
                    and not paused) or (doublePlayer and
                                        (me1.energy or me2.energy)
                                        and not paused):

                # 检测用户键盘操作
                key_pressed = pygame.key.get_pressed()
                if key_pressed[K_UP]:
                    me1.moveUp()
                if key_pressed[K_DOWN]:
                    me1.moveDown()
                if key_pressed[K_LEFT]:
                    me1.moveLeft()
                if key_pressed[K_RIGHT]:
                    me1.moveRight()

                if doublePlayer:
                    if key_pressed[K_w]:
                        me2.moveUp()
                    if key_pressed[K_s]:
                        me2.moveDown()
                    if key_pressed[K_a]:
                        me2.moveLeft()
                    if key_pressed[K_d]:
                        me2.moveRight()

                # 绘制全屏炸弹补给并检测能否获得
                if bomb_supply.active:
                    bomb_supply.move()
                    screen.blit(bomb_supply.image, bomb_supply.rect)
                    if pygame.sprite.spritecollide(bomb_supply, myplanes,
                                                   False):
                        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.spritecollide(bullet_supply, myplanes,
                                                   False):
                        # 发射超级子弹
                        is_double_bullet = True
                        pygame.time.set_timer(DOUBLE_BULLET_TIME, 18 * 1000)
                        bullet_supply.active = False

                # 装填子弹
                if delay % 10 == 0:
                    bullet_sound.play()
                    if is_double_bullet:
                        me1.bullets = me1.bullet2
                        me1.bullets[me1.bullet2_index].reset(
                            (me1.rect.centerx - 33, me1.rect.centery))
                        me1.bullets[me1.bullet2_index + 1].reset(
                            (me1.rect.centerx + 30, me1.rect.centery))
                        me1.bullet2_index = (me1.bullet2_index +
                                             2) % BULLET2_NUM
                        if doublePlayer:
                            me2.bullets = me2.bullet2
                            me2.bullets[me2.bullet2_index].reset(
                                (me2.rect.centerx - 33, me2.rect.centery))
                            me2.bullets[me2.bullet2_index + 1].reset(
                                (me2.rect.centerx + 30, me2.rect.centery))
                            me2.bullet2_index = (me2.bullet2_index +
                                                 2) % BULLET2_NUM
                    else:
                        me1.bullets = me1.bullet1
                        me1.bullets[me1.bullet1_index].reset(me1.rect.midtop)
                        me1.bullet1_index = (me1.bullet1_index +
                                             1) % BULLET1_NUM
                        if doublePlayer:
                            me2.bullets = me2.bullet1
                            me2.bullets[me2.bullet1_index].reset(
                                me2.rect.midtop)
                            me2.bullet1_index = (me2.bullet1_index +
                                                 1) % BULLET1_NUM

                # 发射子弹+检测子弹是否击中敌机
                for each in myplanes:
                    for b in each.bullets:
                        if b.active:
                            b.move()
                            screen.blit(b.image, b.rect)
                            enemy_hit = pygame.sprite.spritecollide(
                                b, enemis, False, pygame.sprite.collide_mask)
                            if enemy_hit:
                                b.active = False
                                for e in enemy_hit:
                                    if e in mid_enemis or e in big_enemis:
                                        e.hit = True
                                        e.energy -= 1
                                        if e.energy == 0:
                                            e.active = False
                                    else:
                                        e.active = False

                # 检测我方飞机是否发生碰撞
                for each in myplanes:
                    enemis_down = pygame.sprite.spritecollide(
                        each, enemis, False, pygame.sprite.collide_mask)
                    if enemis_down and not each.invincible:
                        each.active = False
                        for e in enemis_down:
                            e.active = False

                #绘制我方飞机
                for me in myplanes:
                    if me.active:
                        if switch_image:
                            screen.blit(me.image1, me.rect)
                        else:
                            screen.blit(me.image2, me.rect)
                    else:
                        # 毁灭
                        if delay % 3 == 0:
                            if me_destory_index == 0:
                                me_down_sound.play()
                            screen.blit(me.destory_images[me_destory_index],
                                        me.rect)
                            me_destory_index = (me_destory_index + 1) % 4
                            if me_destory_index == 0:
                                if me.energy > 0:
                                    me.energy -= 1
                                    me.reset()
                                    pygame.time.set_timer(
                                        INVINCIBLE_TIME, 1 * 1000)
                                if me.energy <= 0:
                                    myplanes.remove(me)

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

                # 绘制生命值图标
                if me1.energy:
                    life_text = score_font.render("1P", True, WHITE)
                    screen.blit(life_text, (width - life_rect.width * 4,
                                            height - life_rect.height - 10))
                    for i in range(me1.energy):
                        screen.blit(life_image,
                                    (5 + width - life_rect.width *
                                     (i + 1), height - life_rect.height - 10))
                if doublePlayer:
                    if me2.energy:
                        life2_text = score_font.render("2P", True, WHITE)
                        screen.blit(life2_text,
                                    (width - life_rect.width * 4,
                                     height - life_rect.height * 2 - 10))
                        for i in range(me2.energy):
                            screen.blit(life_image,
                                        (5 + width - life_rect.width * (i + 1),
                                         height - life_rect.height * 2 - 10))

                # 绘制大飞机
                for each in big_enemis:
                    if each.active:
                        each.move()
                        # 即将出现在画面中,给个牌面
                        if each.rect.bottom == -20:
                            enemy3_fly_sound.play(-1)
                        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)
                    else:
                        # 毁灭
                        if delay % 3 == 0:
                            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:
                                score += 10000
                                enemy3_fly_sound.stop()
                                each.reset()

                # 绘制中飞机
                for each in mid_enemis:
                    if each.active:
                        each.move()
                        if each.hit:
                            screen.blit(each.image_hit, each.rect)
                            each.hit = False
                        else:
                            screen.blit(each.image, each.rect)

                        # 绘制血条
                        pygame.draw.line(screen, BLACK,
                                         (each.rect.left, each.rect.top - 5),
                                         (each.rect.right, each.rect.top - 5),
                                         2)
                        # 当生命值大于20%显示绿色,否则红色
                        energy_remain = each.energy / enemy.MidEnemy.energy
                        if energy_remain > 0.2:
                            energy_color = GREEN
                        else:
                            energy_color = RED
                        pygame.draw.line(
                            screen, energy_color,
                            (each.rect.left, each.rect.top - 5),
                            (each.rect.left + each.rect.width * energy_remain,
                             each.rect.top - 5), 2)
                    else:
                        #毁灭
                        if delay % 3 == 0:
                            if e2_destory_index == 0:
                                enemy2_down_sound.play()
                            screen.blit(each.destory_images[e2_destory_index],
                                        each.rect)
                            e2_destory_index = (e2_destory_index + 1) % 4
                            if e2_destory_index == 0:
                                score += 6000
                                each.reset()

                # 绘制小飞机
                for each in small_enemis:
                    if each.active:
                        each.move()
                        screen.blit(each.image, each.rect)
                    else:
                        # 毁灭
                        if e1_destory_index == 0:
                            enemy1_down_sound.play()
                        if delay % 3 == 0:
                            screen.blit(each.destory_images[e1_destory_index],
                                        each.rect)
                            e1_destory_index = (e1_destory_index + 1) % 4
                            if e1_destory_index == 0:
                                score += 1000
                                each.reset()

                # 分数
                score_text = score_font.render(
                    "Score : {0}".format(str(score)), True, WHITE)
                screen.blit(score_text, (10, 5))

            # 玩家死亡
            elif (not doublePlayer and not me1.energy) or (not me1.energy
                                                           and not me2.energy):
                # 背景音乐停止
                pygame.mixer.music.stop()
                # 停止全部音效
                pygame.mixer.stop()
                # 停止发放补给
                pygame.time.set_timer(SUPPLY_TIME, 0)

                # 判断是否将分数记录在记录文件中
                if not recorded:
                    recorded = True
                    # 读取历史最高得分
                    with open("maxScore.txt", "r") as f:
                        stream = f.read()
                        if stream == '':
                            stream = f.read() + '0'
                        record_score = int(stream)
                    # 如果玩家得分大于历史最高分,则存档
                    if score > record_score:
                        with open("maxScore.txt", "w") as f:
                            f.write(str(score))

                # 绘制游戏结束界面
                screen.blit(gameover_img, (0, 0))
                record_score_text = score_font.render(
                    "Best Score : {0}".format(record_score), True, (0, 0, 255))
                screen.blit(record_score_text, (20, 10))
                # 在屏幕中央绘制'你的分数'
                your_score_text = gameover_font.render("Your Score", True,
                                                       WHITE)
                your_score_text_rect = your_score_text.get_rect()
                your_score_text_rect.left,your_score_text_rect.top = (width - your_score_text_rect.width)//2,\
                                                                   height//2-your_score_text_rect.height-40
                screen.blit(your_score_text, your_score_text_rect)
                # 在'你的分数'下方绘制本局分数
                gameover_text = gameover_font.render(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,\
                                                        your_score_text_rect.bottom + 50
                screen.blit(gameover_text, gameover_text_rect)
                # 绘制重新开始按钮图标
                again_rect.left,again_rect.top = (width-again_rect.width)//2,\
                                                    gameover_text_rect.bottom+50
                screen.blit(again_image, again_rect)
                # 绘制退出游戏按钮图标
                return_rect.left, return_rect.top = (width - return_rect.width) // 2, \
                                                  again_rect.bottom + 50
                screen.blit(return_image, return_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 return_rect.left < pos[
                            0] < return_rect.right and return_rect.top < pos[
                                1] < return_rect.bottom:
                        # 退出游戏
                        pygame.quit()
                        sys.exit()

            if (not doublePlayer
                    and me1.energy) or (doublePlayer and
                                        (me1.energy or me2.energy)):
                # 绘制暂停按钮
                screen.blit(paused_image, paused_rect)

            #设定延迟
            if delay % 5 == 0:
                switch_image = not switch_image
            delay -= 1
            if delay == 0:
                delay = 100

        pygame.display.flip()
        clock.tick(60)
示例#3
0
def main():

    # 创建背景图片对象
    position = 0, height
    buss = []
    background = background_1.Screen(position, bg_size)
    # background = background_1.Ground(bg_size)
    buss.append(background)

    my_dist = 1
    # 播放背景音乐
    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 = 100
    for i in range(BULLET1_NUM):
        bullet1.append(bullet.Bullet1(me.rect.midtop))

    # 生成超级子弹
    bullet2 = []
    bullet2_index = 0
    BULLET2_NUM = 200
    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.SysFont("arial", 30)

    # 标志是否暂停游戏
    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.SysFont("arial", 35)
    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

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

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

    # 游戏结束画面
    gameover_font = pygame.font.SysFont("arial", 35)
    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:
        s = delay
        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
                        move_hz = 0
                        bomb_sound.play()
                        hongzha = Bomber.HongZha(screen)
                        while move_hz <= 100:
                            for each in buss:
                                screen.blit(each.image, each.rect)
                            for each in enemies:
                                screen.blit(each.image, each.rect)
                                screen.blit(me.image, me.rect)

                            # 显示轰炸机
                            hongzha.move(move_hz)  # 轰炸机的移动
                            hongzha.display()
                            pygame.display.update()
                            # time.sleep(0.05)
                            move_hz += 1

                        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)

        # 绘制背景
        for each in buss:
            each.move()
            if each.rect.top > height:
                buss.remove(each)
                each.action = False

            if my_dist < 10:
                screen.blit(each.image, each.rect)
            if 10 < my_dist < 20:
                screen.blit(each.image, each.rect)
            if 20 < my_dist < 30:
                screen.blit(each.image, each.rect)
            if 30 < my_dist < 40:
                screen.blit(each.image, each.rect)
            if 40 < my_dist < 50:
                screen.blit(each.image, each.rect)
            if 50 < my_dist < 60:
                screen.blit(each.image, each.rect)
            if 160 < my_dist < 70:
                screen.blit(each.image, each.rect)

        if each.action:

            position = each.rect.left, each.rect.top
            speed_test = [0, 1]
            background = background_1.Screen(position, bg_size)
            buss.append(background)
# ****************************************************************

        # 根据用户的得分增加难度
        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

            s = s * level
            if level == 3:
                if not((s + 2) % 10):
                    s += 2
                if not((s + 1) % 10):
                    s += 1
            if level == 4:
                if s % 10 != 0:
                    s += 2
            # 发射子弹
            if not(s % 10):
                # bullet_sound.play()
                if is_double_bullet:
                    bullets = bullet2
                    bullets[bullet2_index].reset(
                        (me.rect.centerx - 105, me.rect.centery - 20))
                    bullets[bullet2_index +
                            1].reset((me.rect.centerx - 15, me.rect.centery - 20))
                    bullet2_index = (bullet2_index + 2) % BULLET2_NUM
                else:
                    bullets = bullet1
                    bullets[bullet1_index].reset(
                        (me.rect.midtop[0] - 17, me.rect.midtop[1]))
                    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()
                    # screen.blit(each.image, each.rect)

                    if each.hit:
                        screen.blit(each.image_hit, each.rect)
                        each.hit = False
                    else:
                        if switch_image:
                            screen.blit(each.image, each.rect)
                        else:
                            screen.blit(each.image1, 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()
                    screen.blit(each.image, each.rect)

                    if each.hit:
                        screen.blit(each.image_hit, each.rect)
                        each.hit = False
                    else:
                        screen.blit(each.image, each.rect)

                    # 绘制血槽
                    pygame.draw.line(screen, BLACK,
                                     (each.rect.left, each.rect.top - 5),
                                     (each.rect.right, each.rect.top - 5),
                                     2)
                    # 当生命大于20%显示绿色,否则显示红色
                    energy_remain = each.energy / enemy.MidEnemy.energy
                    if energy_remain > 0.2:
                        energy_color = GREEN
                    else:
                        energy_color = RED
                    pygame.draw.line(screen, energy_color,
                                     (each.rect.left, each.rect.top - 5),
                                     (each.rect.left + each.rect.width * energy_remain,
                                      each.rect.top - 5), 2)
                else:
                    # 毁灭
                    if not(delay % 3):
                        if e2_destroy_index == 0:
                            enemy2_down_sound.play()
                        screen.blit(each.destroy_images[
                                    e2_destroy_index], each.rect)
                        e2_destroy_index = (e2_destroy_index + 1) % 4
                        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 += 10000
                            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.image, me.rect)
                else:
                    screen.blit(me.image1, 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
                        bomb_num = 3
                        me.reset()
                        pygame.time.set_timer(INVINCIBLE_TIME, 3 * 1000)

            # 绘制全屏炸弹数量
            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))

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

            bomb_num = 0
            # 停止发放补给
            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(
                "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.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)
示例#4
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(me.rect.midtop))

    # ���ɳ����ӵ�
    bullet2 = []
    bullet2_index = 0
    BULLET2_NUM = 8
    for i in range(BULLET2_NUM // 2):
        bullet2.append(bullet.Bullet2((me.rect.centerx - 33, me.rect.centery)))
        bullet2.append(bullet.Bullet2((me.rect.centerx + 30, me.rect.centery)))

    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

    # ��־�Ƿ�ʹ�ó����ӵ�
    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 = 5

    # ������ֹ�ظ��򿪼�¼�ļ�
    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 > 10000:
            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 > 50000:
            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 > 200000:
            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 > 500000:
            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 + 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_hit, each.rect)
                        each.hit = False
                    else:
                        screen.blit(each.image, each.rect)

                    # ����Ѫ��
                    pygame.draw.line(screen, BLACK, \
                                     (each.rect.left, each.rect.top - 5), \
                                     (each.rect.right, each.rect.top - 5), \
                                     2)
                    # ����������20%��ʾ��ɫ��������ʾ��ɫ
                    energy_remain = each.energy / enemy.MidEnemy.energy
                    if energy_remain > 0.2:
                        energy_color = GREEN
                    else:
                        energy_color = RED
                    pygame.draw.line(screen, energy_color, \
                                     (each.rect.left, each.rect.top - 5), \
                                     (each.rect.left + each.rect.width * energy_remain, \
                                      each.rect.top - 5), 2)
                else:
                    # ����
                    if not (delay % 3):
                        if e2_destroy_index == 0:
                            enemy2_down_sound.play()
                        screen.blit(each.destroy_images[e2_destroy_index], each.rect)
                        e2_destroy_index = (e2_destroy_index + 1) % 4
                        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("�� %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("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.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)
示例#5
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, 10)

    big_enemies = pygame.sprite.Group()
    add_big_enemies(big_enemies, enemies, 8)

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

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

    #飞机毁灭图片
    e1_destroy_index = 0
    e2_destroy_index = 0
    e3_destroy_index = 0
    me_destroy_index = 0

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

    #标识是否暂停游戏
    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 = 5

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

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

    #无敌定时器
    INVINCIBLE_TIME = USEREVENT + 2

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

    clock = pygame.time.Clock()
    #用于切换图片
    switch_image = True
    #延时变量
    delay = 100
    #判断是否记录
    recorded = False

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

    #游戏结束画面
    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()

    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 > 10000:
            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 > 40000:
            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 > 100000:
            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 > 500000:
            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 not paused and life_num:
            #检测用户键盘操作
            key_pressed = pygame.key.get_pressed()

            if key_pressed[K_w] or key_pressed[K_UP]:
                me.moveUp()
            if key_pressed[K_s] or key_pressed[K_DOWN]:
                me.moveDown()
            if key_pressed[K_a] or key_pressed[K_LEFT]:
                me.moveLeft()
            if key_pressed[K_d] or key_pressed[K_RIGHT]:
                me.moveRight()
            #绘制全屏炸弹并检测是否获得

            if bomb_supply.active:
                bomb_supply.move()
                screen.blit(bomb_supply.image, bomb_supply.rect)
                if pygame.sprite.collide_mask(bomb_supply, me):
                    get_bomb_sound.play()
                    if bomb_num < 9:
                        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.life -= 1
                                if e.life == 0:
                                    e.active = False
                            else:
                                e.active = False

            #检测我放飞机是否被撞
            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:
                #毁灭飞机
                me_down_sound.play()
                if not (delay % 3):
                    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 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))

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

            #绘制敌方飞机
            for each in big_enemies:
                if each.active:
                    each.move()
                    if each.hit == True:
                        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%显示绿色,否则红色
                    life_remain = each.life / enemy.BigEnemy.life
                    if life_remain > 0.2:
                        life_color = GREEN
                    else:
                        life_color = RED
                    pygame.draw.line(screen,life_color,\
                                     (each.rect.left, each.rect.top - 5),\
                                     (each.rect.left + each.rect.width*life_remain, each.rect.top - 5),2)

                    #大飞机来临前播放音效
                    if each.rect.bottom > -50:
                        enemy3_fly_sound.play()
                else:
                    #毁灭飞机
                    if not (delay % 3):
                        if e3_destroy_index == 1:
                            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 == True:
                        screen.blit(each.image_hit, each.rect)
                        each.hit = False
                    else:
                        screen.blit(each.image, each.rect)
                    #绘制血槽
                    pygame.draw.line(screen, BLACK,\
                                     (each.rect.left, each.rect.top - 5),\
                                     (each.rect.right,each.rect.top - 5), 2)
                    #当生命大于20%显示绿色,否则红色
                    life_remain = each.life / enemy.MidEnemy.life
                    if life_remain > 0.2:
                        life_color = GREEN
                    else:
                        life_color = RED
                    pygame.draw.line(screen,life_color,\
                                     (each.rect.left, each.rect.top - 5),\
                                     (each.rect.left + each.rect.width*life_remain, each.rect.top - 5),2)
                else:
                    #毁灭飞机

                    if not (delay % 3):
                        if e2_destroy_index == 1:
                            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 += 1000
                            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 == 1:
                            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 += 500
                            each.reset()

            #绘制炸弹数量
            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))

        #绘制游戏结束画面
        elif life_num == 0:

            #音乐停止
            pygame.mixer.music.stop()
            pygame.mixer.stop()
            #补给停止
            pygame.time.set_timer(SUPPLY_TIME, 0)
            if not recorded:
                recorded = not recorded

                #读取历史最高分
                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 // 2
            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,\
                                      height // 2 + 50

            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 = 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)

        delay -= 1
        if not delay:
            delay = 100
        switch_image = not switch_image

        pygame.display.flip()

        clock.tick(60)
示例#6
0
def main():
    pygame.mixer.music.play(-1)

    #  Create Player plane
    me = myplane.MyPlane(bg_size)

    enemies = pygame.sprite.Group()

    # Create Small Enemy
    small_enemies = pygame.sprite.Group()
    add_small_enemies(small_enemies, enemies, 15)

    # Create Mid Enemy
    mid_enemies = pygame.sprite.Group()
    add_mid_enemies(mid_enemies, enemies, 4)

    # Create Big Enemy
    big_enemies = pygame.sprite.Group()
    add_big_enemies(big_enemies, enemies, 2)

    # Create normal bullet
    bullet1 = []
    bullet1_index = 0
    BULLET1_NUM = 4
    for i in range(BULLET1_NUM):
        bullet1.append(bullet.Bullet1(me.rect.midtop))

    # Create super bullet
    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()

    # Hit pic index
    e1_destroy_index = 0
    e2_destroy_index = 0
    e3_destroy_index = 0
    me_destroy_index = 0

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

    # pause
    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

    # Difficulty
    level = 1

    # Bomb pic
    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

    # Supply every 30 sec
    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)

    # Super bullet supply timer
    DOUBLE_BULLET_TIME = USEREVENT + 1

    # Invincible timer
    INVINCIBLE_TIME = USEREVENT + 2

    # Use super bullet or not
    is_double_bullet = False

    # switch image
    switch_image = True

    # delay
    delay = 100

    # Life number
    life_image = pygame.image.load("images/life.png").convert_alpha()
    life_rect = life_image.get_rect()
    life_num = 3

    # Limit file open time
    recorded = False

    # GameOver pic
    gameover_font = pygame.font.Font("font/font.ttf", 48)
    again_image = pygame.image.load("images/again1.png").convert_alpha()
    again_rect = again_image.get_rect()
    gameover_image = pygame.image.load("images/gameover1.png").convert_alpha()
    gameover_rect = gameover_image.get_rect()

    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)

        # Increase difficulty
        if level == 1 and score > 50000:
            level = 2
            upgrade_sound.play()
            # add 3 small, 2 mid, 1 big enemy
            add_small_enemies(small_enemies, enemies, 3)
            add_mid_enemies(mid_enemies, enemies, 2)
            add_big_enemies(big_enemies, enemies, 1)
            # increase speed
            inc_speed(small_enemies, 1)
        elif level == 2 and score > 300000:
            level = 3
            upgrade_sound.play()
            # add 5 small, 3 mid , 2 big enemy
            add_small_enemies(small_enemies, enemies, 5)
            add_mid_enemies(mid_enemies, enemies, 3)
            add_big_enemies(big_enemies, enemies, 2)
            # increase speed
            inc_speed(small_enemies, 1)
            inc_speed(mid_enemies, 1)
        elif level == 3 and score > 600000:
            level = 4
            upgrade_sound.play()
            # add 5 small, 3 mid , 2 big enemy
            add_small_enemies(small_enemies, enemies, 5)
            add_mid_enemies(mid_enemies, enemies, 3)
            add_big_enemies(big_enemies, enemies, 2)
            # increase speed
            inc_speed(small_enemies, 1)
            inc_speed(mid_enemies, 1)
        elif level == 4 and score > 1000000:
            level = 5
            upgrade_sound.play()
            # add 5 small, 3 mid , 2 big enemy
            add_small_enemies(small_enemies, enemies, 5)
            add_mid_enemies(mid_enemies, enemies, 3)
            add_big_enemies(big_enemies, enemies, 2)
            # increase speed
            inc_speed(small_enemies, 1)
            inc_speed(mid_enemies, 1)

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

        if life_num and not paused:
            # Check keyboard
            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()

            # Draw bomb supply
            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

            # Draw super bullet supply
            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

            # Launch bullet
            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

            # Check Hit
            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

            # Draw big enemy
            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)

                    # Energy
                    pygame.draw.line(screen, BLACK, \
                                     (each.rect.left, each.rect.top - 5), \
                                     (each.rect.right, each.rect.top - 5), \
                                     2)
                    # >20 % Green else Red
                    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)

                    # Play sound
                    if each.rect.bottom == -50:
                        enemy3_fly_sound.play(-1)
                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 += 10000
                            each.reset()

            # Draw Mid enemy
            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)

                    # Energy
                    pygame.draw.line(screen, BLACK, \
                                     (each.rect.left, each.rect.top - 5), \
                                     (each.rect.right, each.rect.top - 5), \
                                     2)
                    # >20% Green else Red
                    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:
                    # Destroy
                    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()

            # Draw small enemy:
            for each in small_enemies:
                if each.active:
                    each.move()
                    screen.blit(each.image, each.rect)
                else:
                    # Destroy
                    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()

            # Check if player get hit
            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

            # Draw player
            if me.active:
                if switch_image:
                    screen.blit(me.image1, me.rect)
                else:
                    screen.blit(me.image2, me.rect)
            else:
                # Destroy
                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)

            # Draw Bomb number
            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))

            # Draw life number
            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))

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

        elif life_num == 0:
            # Stop background music
            pygame.mixer.music.stop()
            # Stop sound
            pygame.mixer.stop()
            # Stop supply
            pygame.time.set_timer(SUPPLY_TIME, 0)

            if not recorded:
                recorded = True
                # Read history score
                with open("record.txt", "r") as f:
                    record_score = int(f.read())

                # If current score is higher than record, override
                if score > record_score:
                    with open("record.txt", "w") as f:
                        f.write(str(score))

            # Draw GameOver
            record_score_text = score_font.render(
                "Best Score : %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 // 3
            screen.blit(gameover_text1, gameover_text1_rect)

            gameover_text2 = gameover_font.render(str(score), True, WHITE)
            gameover_text2_rect = gameover_text2.get_rect()
            gameover_text2_rect.left, gameover_text2_rect.top = \
                (width - gameover_text2_rect.width) // 2, \
                gameover_text1_rect.bottom + 10
            screen.blit(gameover_text2, gameover_text2_rect)

            again_rect.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)

            # Check mouse action
            if pygame.mouse.get_pressed()[0]:
                # Get mouse pos
                pos = pygame.mouse.get_pos()
                # If again is clicked
                if again_rect.left < pos[0] < again_rect.right and \
                        again_rect.top < pos[1] < again_rect.bottom:
                    # restart
                    main()
                # If end is clicked
                elif gameover_rect.left < pos[0] < gameover_rect.right and \
                        gameover_rect.top < pos[1] < gameover_rect.bottom:
                    # Quit
                    pygame.quit()
                    sys.exit()

        # Draw pause botton
        screen.blit(paused_image, paused_rect)

        # switch player image
        if not (delay % 5):
            switch_image = not switch_image

        delay -= 1
        if not delay:
            delay = 100

        pygame.display.flip()
        clock.tick(60)
示例#7
0
def main():
    pygame.mixer.music.play(-1)

    #mkdir myplace
    me = myplane.MyPlane(bg_size)

    #madir enemy
    enemies = pygame.sprite.Group()

    #madir small enemy
    small_enemies = pygame.sprite.Group()
    add_small_enemies(small_enemies, enemies, 15)

    #madir mid enemy
    mid_enemies = pygame.sprite.Group()
    add_mid_enemies(mid_enemies, enemies, 4)

    #madir big enemy
    big_enemies = pygame.sprite.Group()
    add_big_enemies(big_enemies, enemies, 2)

    #madir bullet1
    bullet1 = []
    bullet1_index = 0
    BULLTE1_NUM = 4
    for i in range(BULLTE1_NUM):
        bullet1.append(bullet.Bullet1(me.rect.midtop))

    clock = pygame.time.Clock()

    #madir bullet2
    bullet2 = []
    bullet2_index = 0
    BULLTE2_NUM = 8
    for i in range(BULLTE2_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()

    #shot images
    e1_destroy_index = 0
    e2_destroy_index = 0
    e3_destroy_index = 0
    me_destroy_index = 0

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

    #game over screen
    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()

    #pause
    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

    #game level
    level = 1

    #screen boom
    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

    #every 30 seconds,supply one
    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)

    #super bullet
    DOUBLE_BULLET_TIME = USEREVENT + 1
    is_double_bullet = False

    #
    INVINCIBLE_TIME = USEREVENT + 2

    #live number
    life_image = pygame.image.load("images/life.png").convert_alpha()
    life_rect = life_image.get_rect()
    life_num = 3

    recorded = False

    #change planepicture
    switch_image = True

    #delay variable
    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)

        #level from score
        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 > 1000000:
            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:
            #check user keyboard
            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()
                    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) % BULLTE2_NUM
                else:
                    bullets = bullet1
                    bullet1[bullet1_index].reset(me.rect.midtop)
                    bullet1_index = (bullet1_index + 1) % BULLTE1_NUM

            #check enemy shot by 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.hit = True
                                e.energy -= 1
                                if e.energy == 0:
                                    e.active = False
                            else:
                                e.active = False

            #draw big enemy
            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)

                    #draw haemal strand
                    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)

                    #when in the screen , music
                    if each.rect.bottom == -50:
                        enemy3_fly_sound.play(-1)
                else:
                    #Out
                    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()

            #draw mid enemy
            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)

                    # draw haemal strand
                    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:
                    #Out
                    if not (delay % 3):
                        if e2_destroy_index == 0:
                            enemy2_down_sound.play()
                        screen.blit(each.destroy_images[e2_destroy_index],
                                    each.rect)
                        e3_destroy_index = (e2_destroy_index + 1) % 4
                        if e2_destroy_index == 0:
                            score += 6000
                            each.reset()

            #draw small enemy
            for each in small_enemies:
                if each.active:
                    each.move()
                    screen.blit(each.image, each.rect)
                else:
                    #Out
                    if not (delay % 3):
                        if e1_destroy_index == 0:
                            enemy1_down_sound.play()
                        screen.blit(each.destroy_images[e1_destroy_index],
                                    each.rect)
                        e3_destroy_index = (e1_destroy_index + 1) % 4
                        if e1_destroy_index == 0:
                            score += 1000
                            each.reset()

            #Check myplane collide
            enemeies_down = pygame.sprite.spritecollide(
                me, enemies, False, pygame.sprite.collide_mask)
            if enemeies_down and not me.invincible:
                me.active = False
                for e in enemeies_down:
                    e.active = False

            #draw myplane
            if me.active:
                if switch_image:
                    screen.blit(me.image1, me.rect)
                else:
                    screen.blit(me.image2, me.rect)
            else:
                #Out
                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) % 3
                    if me_destroy_index == 0:
                        life_num -= 1
                        me.reset()
                        pygame.time.set_timer(INVINCIBLE_TIME, 3 * 1000)

            #draw bomb
            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))

            #draw life number
            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, 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)

            # 检测用户的鼠标操作
            # 如果用户按下鼠标左键
            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)
示例#8
0
def main():
    pygame.mixer.music.play(-1)

    clock = pygame.time.Clock()

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

    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, 1)

    running = True
    switch_image = True
    delay = 100
    score = 0
    score_font = pygame.font.Font("font/font.ttf", 36)

    bullets = []

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

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

    # 游戏结束画面
    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()

    DOUBLE_BULLET_TIME = USEREVENT + 1

    # 解除我方飞机无敌状态
    INVINCEBLE_TIME = USEREVENT + 2

    # 生成超级子弹
    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)))

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

    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)

    # 阻止重复读取成绩记录文件
    recorded = False

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

    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()
                        paused_image = resume_pressed_image
                    else:
                        pygame.time.set_timer(SUPPLY_TIME, 30 * 1000)
                        pygame.mixer.music.unpause()
                        pygame.mixer.unpause()
                        paused_image = pause_pressed_image
            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 = paused_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]):
                    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 == INVINCEBLE_TIME:
                me.invincible = False
                pygame.time.set_timer(INVINCEBLE_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 > 300000:
            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 > 1000000:
            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:
            # 绘制全屏炸弹补给并检测是否获得
            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 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) % 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

            # 绘制全屏炸弹补给并检测是否获得
            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

            # 绘制大型敌机
            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)
                    if each.rect.bottom == -50:
                        enemy3_fly_sound.play(-1)

                    # 绘制血槽
                    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:
                    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:
                            me_down_sound.stop()
                            score += 10000
                            each.reset()

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

                    if each.hit:
                        screen.blit(each.image_hit, each.rect)
                        each.hit = False
                    else:
                        screen.blit(each.image1, 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:
                    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 += 5000
                            each.reset()

            # 绘制小型敌机
            for each in small_enemies:
                if each.active:
                    each.move()
                    screen.blit(each.image1, 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()

            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()

            # 检测我方飞机是否被撞
            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:
                me_down_sound.play()
                if not (delay % 3):
                    screen.blit(each.destroy_images[me_destroy_index],
                                each.rect)
                    me_destroy_index = (me_destroy_index + 1) % 4
                    # 剩余生命数量
                    if me_destroy_index == 0:
                        life_num -= 1
                        me.reset()
                        pygame.time.set_timer(INVINCEBLE_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(str("Score: %s" % 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))
                with open("user.txt", "a") as fe:
                    fe.write(usr_name + ' ' + str(score) + '\n')

            # 绘制结束画面
            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)

            # 检测用户的鼠标操作
            # 如果用户按下鼠标左键
            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)
示例#9
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 = 200
    for i in range(BULLET1_NUM):
        bullet1.append(bullet.Bullet1(me.rect.midtop))

    # 生成超级子弹
    bullet2 = []
    bullet2_index = 0
    BULLET2_NUM = 200
    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_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

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

    # 用于阻止重复打开记录文件
    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()

    # 跳转网页按钮
    congratulation_image = pygame.image.load("images/Congratulations.png").convert_alpha()
    congratulation_rect = congratulation_image.get_rect()
    jump_image = pygame.image.load("images/jump.png").convert_alpha()
    jump_rect = jump_image.get_rect()

    # 用于切换图片
    switch_image = True

    # 用于延迟
    delay = 100
    
    # 射速
    shoot_speed = 25

    # 目标分数
    target_score = 20150217

    running = True

    while running:
        # 检查是否达到目标分数
        if score > target_score:
            paused = True
            pygame.time.set_timer(SUPPLY_TIME, 0)
            pygame.mixer.music.pause()
            pygame.mixer.pause()

        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:
                        if score > target_score:
                            target_score = 9999999999999999
                        pygame.time.set_timer(SUPPLY_TIME, 30 * 1000)
                        pygame.mixer.music.unpause()
                        pygame.mixer.unpause()
                elif event.button == 1 and score > target_score and jump_rect.collidepoint(event.pos):
                    webbrowser.open("https://chiangel.github.io/gift/love.html")

            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 > 1000000:
            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 > 5000000:
            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)
            # 增加射速
            shoot_speed = 20
        elif level == 3 and score > 10000000:
            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(mid_enemies, 1)
            # 增加射速
            shoot_speed = 10
        elif level == 4 and score > 15000000:
            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)
            # 增加射速
            shoot_speed = 3
            
        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 % shoot_speed):
                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 += 400000
                            each.reset()

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

                    if each.hit:
                        screen.blit(each.image_hit, each.rect)
                        each.hit = False
                    else:
                        screen.blit(each.image, each.rect)

                    # 绘制血槽
                    pygame.draw.line(screen, BLACK, \
                                     (each.rect.left, each.rect.top - 5), \
                                     (each.rect.right, each.rect.top - 5), \
                                     2)
                    # 当生命大于20%显示绿色,否则显示红色
                    energy_remain = each.energy / enemy.MidEnemy.energy
                    if energy_remain > 0.2:
                        energy_color = GREEN
                    else:
                        energy_color = RED
                    pygame.draw.line(screen, energy_color, \
                                     (each.rect.left, each.rect.top - 5), \
                                     (each.rect.left + each.rect.width * energy_remain, \
                                      each.rect.top - 5), 2)
                else:
                    # 毁灭
                    if not(delay % 3):
                        if e2_destroy_index == 0:
                            enemy2_down_sound.play()
                        screen.blit(each.destroy_images[e2_destroy_index], each.rect)
                        e2_destroy_index = (e2_destroy_index + 1) % 4
                        if e2_destroy_index == 0:
                            score += 160000
                            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 += 30000
                            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("× %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))

        elif paused and score > target_score:
            congratulation_rect.left, congratulation_rect.top = (width - congratulation_rect.width) // 2, 150
            screen.blit(congratulation_image, congratulation_rect)

            jump_rect.left, jump_rect.top = (width - jump_rect.width) // 2, congratulation_rect.bottom + 10
            screen.blit(jump_image, jump_rect)

            '''# 检测用户的鼠标操作
            # 如果用户按下鼠标左键
            if pygame.mouse.get_pressed()[0]:
                # 获取鼠标坐标
                pos = pygame.mouse.get_pos()
                # 如果用户点击“跳转至精美相册”
                if jump_rect.left < pos[0] < jump_rect.right and \
                   jump_rect.top < pos[1] < jump_rect.bottom:
                    # 跳转网页
                    target_score = 9999999999999999
                    webbrowser.open("https://chiangel.github.io/gift/love.html")
                # 如果用户点击“暂停/继续按钮”            
                elif paused_rect.left < pos[0] < paused_rect.right and \
                     paused_rect.top < pos[1] < paused_rect.bottom:
                    # 继续游戏
                    paused = False
                    pygame.time.set_timer(SUPPLY_TIME, 30 * 1000)
                    pygame.mixer.music.unpause()
                    pygame.mixer.unpause()'''
        
        # 绘制游戏结束画面
        elif life_num == 0:
            # 背景音乐停止
            pygame.mixer.music.stop()

            # 停止全部音效
            pygame.mixer.stop()

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

            if not recorded:
                recorded = True
                # 读取历史最高得分
                try:
                    with open("recor.txt", "r") as f:
                        print(type(f))
                        record_score = int(f.read())
                except:
                    record_score = 0

                # 如果玩家得分高于历史最高得分,则存档
                if score > record_score:
                    record_score = score
                    with open("record.txt", "w") as f:
                        f.write(str(record_score))

            # 绘制结束画面
            record_score_text = score_font.render("Best : %d" % record_score, True, (255, 255, 255))
            screen.blit(record_score_text, (10, 100))
            
            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.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)
        
        # 绘制目标得分
        target_score_text = score_font.render("Target : %s" % str(target_score), True, WHITE)
        screen.blit(target_score_text, (10, 5))

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

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

        delay -= 1
        if not delay:
            delay = 100

        pygame.display.flip()
        clock.tick(60)
示例#10
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(me.rect.midtop))

    #生成2级子弹
    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()

    running = True
    switch_image = True
    delay = 100

    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)

    #是否暂停
    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
    paused = 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()

    #难度级别
    level = 1

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

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

    #二级子弹计时
    DOUBLE_BULLET_TIME = USEREVENT + 1

    #无敌时间
    INVINCIBLE_TIME = USEREVENT + 2

    #是否为二级子弹
    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

    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 random.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 > 800000:
            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 > 2000000:
            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_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_bullet_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
                    bullet1[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)
                    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_flying_sound.play(-1)
                else:
                    if not (delay % 5):
                        if e1_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:
                            score += 10000
                            enemy3_flying_sound.stop()
                            each.reset()

            #绘制中飞机
            for each in mid_enemies:
                if each.active:
                    each.move()
                    if each.hit:
                        screen.blit(each.image_hit, each.rect)
                        each.hit = False
                    else:
                        screen.blit(each.image, each.rect)

                    pygame.draw.line(screen, BLACK,\
                                     (each.rect.left, each.rect.top -5 ),\
                                     (each.rect.right, each.rect.top -5 ), 2)
                    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 % 5):
                        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 % 5):
                        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 % 5):
                    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_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))

            #绘制life数
            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("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.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)
示例#11
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(me.rect.midtop))

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

    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

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

    # 用于切换图片
    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)

        # 根据用户的得分增加难度
        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 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_hit, each.rect)
                        each.hit = False
                    else:
                        screen.blit(each.image, each.rect)

                    # 绘制血槽
                    pygame.draw.line(screen, BLACK, \
                                     (each.rect.left, each.rect.top - 5), \
                                     (each.rect.right, each.rect.top - 5), \
                                     2)
                    # 当生命大于20%显示绿色,否则显示红色
                    energy_remain = each.energy / enemy.MidEnemy.energy
                    if energy_remain > 0.2:
                        energy_color = GREEN
                    else:
                        energy_color = RED
                    pygame.draw.line(screen, energy_color, \
                                     (each.rect.left, each.rect.top - 5), \
                                     (each.rect.left + each.rect.width * energy_remain, \
                                      each.rect.top - 5), 2)
                else:
                    # 毁灭
                    if not (delay % 3):
                        if e2_destroy_index == 0:
                            enemy2_down_sound.play()
                        screen.blit(each.destroy_images[e2_destroy_index],
                                    each.rect)
                        e2_destroy_index = (e2_destroy_index + 1) % 4
                        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:
                # 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:
                        print("Game Over!")
                        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)
示例#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, 15)
    #只打开一次文件
    recorded = False
    #一般的子弹
    bullet1 = []
    bullet1_index = 0
    BULLET1_NUM = 6
    for i in range(BULLET1_NUM):
        bullet1.append(bullet.Bullet1(me.rect.midtop))
    clock = pygame.time.Clock()
    #超级子弹
    DOUBLE_BULLTET_TIME = USEREVENT + 1
    is_double_bullet = False
    bullet2 = []
    bullet2_index = 0
    BULLET2_NUM = 12
    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()
    #无敌时间
    INVINCIBLE_TIME = USEREVENT + 2
    #命
    life_image = pygame.image.load('images/life.png').convert_alpha()
    life_rect = life_image.get_rect()
    life_num = 5
    #中弹图片索引
    e1_destroy_index = 0
    e2_destroy_index = 0
    e3_destroy_index = 0
    me_destroy_index = 0
    #统计得分
    score = 0
    score_font = pygame.font.Font('font/againts refresh.ttf', 44)
    #难度
    level = 1
    #炸弹
    bomb_image = pygame.image.load('images/bomb.png').convert_alpha()
    bomb_rect = bomb_image.get_rect()
    bomb_font = pygame.font.Font('font/againts refresh.ttf', 54)
    bomb_num = 3
    # 游戏结束画面
    gameover_font = pygame.font.Font('font/againts refresh.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()
    #发放补给包
    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)
    #暂停
    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_pressed.png').convert_alpha()
    resume_pressed_image = pygame.image.load(
        'images/resume_nor.png').convert_alpha()
    paused_rect = pause_nor_image.get_rect()
    paused_rect.left, paused_top = width - paused_rect.width - 10, 10
    paused_image = pause_nor_image
    #飞机喷气
    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_BULLTET_TIME:
                is_double_bullet = False
                pygame.time.set_timer(DOUBLE_BULLTET_TIME, 0)
            elif event.type == INVINCIBLE_TIME:
                me.invincible = False
                pygame.time.set_timer(INVINCIBLE_TIME, 0)

    #根据得分增加难度
        if level == 1 and score > 5000:
            level += 1
            upgrade_sound.play()
            #增加3架小型,2架中型,1架大型
            add_small_enemies(small_enemies, enemies, 3)
            add_mid_enemies(mid_enemies, enemies, 2)
            add_small_enemies(big_enemies, enemies, 1)
            inc_speed(small_enemies, 1)
        elif level == 2 and score > 30000:
            level += 1
            upgrade_sound.play()
            #增加5架小型,2架中型,1架大型
            add_small_enemies(small_enemies, enemies, 5)
            add_mid_enemies(mid_enemies, enemies, 3)
            add_small_enemies(big_enemies, enemies, 2)
            inc_speed(small_enemies, 1)
            inc_speed(mid_enemies, 1)
        elif level == 3 and score > 60000:
            level += 1
            upgrade_sound.play()
            #增加5架小型,2架中型,1架大型
            add_small_enemies(small_enemies, enemies, 5)
            add_mid_enemies(mid_enemies, enemies, 3)
            add_small_enemies(big_enemies, enemies, 2)
            inc_speed(small_enemies, 1)
            inc_speed(mid_enemies, 1)
            inc_speed(big_enemies, 1)
        elif level == 4 and score > 100000:
            level += 1
            upgrade_sound.play()
            #增加5架小型,2架中型,1架大型
            add_small_enemies(small_enemies, enemies, 5)
            add_mid_enemies(mid_enemies, enemies, 3)
            add_small_enemies(big_enemies, enemies, 2)
            inc_speed(small_enemies, 1)
            inc_speed(mid_enemies, 1)
            inc_speed(big_enemies, 1)
        elif level == 5 and score > 200000:
            level += 1
            upgrade_sound.play()
            #增加5架小型,2架中型,1架大型
            add_small_enemies(small_enemies, enemies, 5)
            add_mid_enemies(mid_enemies, enemies, 3)
            add_small_enemies(big_enemies, enemies, 2)
            inc_speed(small_enemies, 1)
            inc_speed(mid_enemies, 1)
            inc_speed(big_enemies, 1)
        elif level == 6 and score > 500000:
            level += 1
            upgrade_sound.play()
            #增加5架小型,2架中型,1架大型
            add_small_enemies(small_enemies, enemies, 5)
            add_mid_enemies(mid_enemies, enemies, 3)
            add_small_enemies(big_enemies, enemies, 2)
            inc_speed(small_enemies, 1)
            inc_speed(mid_enemies, 1)
            inc_speed(big_enemies, 1)
        elif level == 7 and score > 1000000:
            level += 1
            upgrade_sound.play()
            #增加5架小型,2架中型,1架大型
            add_small_enemies(small_enemies, enemies, 5)
            add_mid_enemies(mid_enemies, enemies, 3)
            add_small_enemies(big_enemies, enemies, 2)
            inc_speed(small_enemies, 1)
            inc_speed(mid_enemies, 1)
            inc_speed(big_enemies, 1)
        screen.blit(background, (0, 0))
        if not paused and life_num:
            #检测用户的操作
            key_pressed = pygame.key.get_pressed()
            if key_pressed[K_w] or key_pressed[K_UP]:
                me.moveUp()
            if key_pressed[K_s] or key_pressed[K_DOWN]:
                me.moveDown()
            if key_pressed[K_a] or key_pressed[K_LEFT]:
                me.moveLeft()
            if key_pressed[K_d] or key_pressed[K_RIGHT]:
                me.moveRight()
            if bomb_supply.active:
                bomb_supply.move()
                screen.blit(bomb_supply.image, bomb_supply.rect)
                if pygame.sprite.collide_mask(me, bomb_supply):
                    get_bomb_sound.play()
                    if bomb_num < 10:
                        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(me, bullet_supply):
                    get_bullet_sound.play()
                    # 发射超级子弹
                    is_double_bullet = True
                    pygame.time.set_timer(DOUBLE_BULLTET_TIME, 15 * 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.hit = True
                                e.energy -= 1
                                if e.energy == 0:
                                    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 == -5:
                        enemy3_fly_sound.play(-1)

                else:
                    enemy3_down_sound.play()
                    enemy3_fly_sound.stop()
                    score += 1000
                    each.reset()
                    #毁灭
                    # if e3_destroy_index == 0:
                    #     enemy3_down_sound.play()
                    # if not(delay % 2):
                    #     screen.blit(each.destroy_images[
                    #                 e3_destroy_index], each.rect)
                    #     e3_destroy_index = (e3_destroy_index + 2) % 6
                    #     if e3_destroy_index == 0:
                    #         enemy3_fly_sound.stop()
                    #         score += 1000
                    #         each.reset()
        #画中型机
            for M in mid_enemies:
                if M.active:
                    M.move()
                    if M.hit:
                        screen.blit(M.image_hit, M.rect)
                        M.hit = False
                    else:
                        screen.blit(M.image, M.rect)
                    pygame.draw.line(screen,BLACK,\
                    (M.rect.left,M.rect.top -5),\
                    (M.rect.right,M.rect.top -5),\
                    2)
                    #血量低于20%变红
                    energy_remain = M.energy / enemy.MidEnemy.energy
                    if energy_remain > 0.2:
                        energy_color = GREEN
                    else:
                        energy_color = RED
                    pygame.draw.line(screen,energy_color,\
                    (M.rect.left,M.rect.top-5),\
                    (M.rect.left+M.rect.width*energy_remain,\
                    M.rect.top-5),2)
                else:
                    # 毁灭
                    if e2_destroy_index == 0:
                        enemy2_down_sound.play()
                    if not (delay % 2):
                        screen.blit(M.destroy_images[e2_destroy_index], M.rect)
                        e2_destroy_index = (e2_destroy_index + 1) % 4
                        if e2_destroy_index == 0:
                            score += 600
                            M.reset()
        #画小飞机
            for S in small_enemies:
                if S.active:
                    S.move()
                    if M.hit:
                        screen.blit(M.image_hit, M.rect)
                        M.hit = False
                    else:
                        screen.blit(S.image, S.rect)
                else:
                    if e1_destroy_index == 0:
                        enemy1_down_sound.play()
                    if not (delay % 3):
                        screen.blit(S.destroy_images[e1_destroy_index], S.rect)
                        e1_destroy_index = (e1_destroy_index + 1) % 4
                        if e1_destroy_index == 0:
                            score += 100
                            S.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 - 20))
            screen.blit(bomb_text,
                        (20 + bomb_rect.width, height - 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))
        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("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)
        #画得分
        score_text = score_font.render('Score : %s' % str(score), True, WHITE)
        screen.blit(score_text, (10, 5))
        screen.blit(paused_image, paused_rect)
        #5帧切换一次
        if not (delay % 5):
            switch_image = not switch_image
        delay -= 1
        if not delay:
            delay = 100
        pygame.display.flip()
        clock.tick(60)
示例#13
0
def main():
    pygame.mixer.music.play(-1)  # -1表示循环播放

    # 生成玩家飞机
    me = my_plane.MyPlane(bg_size)

    # 生成子弹
    bullets = []
    nor_bullets = []
    nor_bullet_index = 0
    nor_bullet_num = 6
    for i in range(nor_bullet_num):
        nor_bullets.append(bullet.Nor_bullet(me.rect.midtop))

    # 生成超级子弹
    sup_bullets = []
    sup_bullet_index = 0
    sup_bullet_num = 12
    for i in range(sup_bullet_num//2):
        sup_bullets.append(bullet.Sup_bullet((me.rect.centerx-33, me.rect.centery)))
        sup_bullets.append(bullet.Sup_bullet((me.rect.centerx+30, me.rect.centery)))
    # 累计得分
    score = 0
    score_font = pygame.font.Font("H:/font/font.ttf", 36)

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

    # 切换飞机图片的变量
    switch_plane = True

    # 用于延时变量,使飞机突突突
    tim_delay = 5

    # 表示是否暂停游戏的按钮
    pause = False
    paused_not_image = pygame.image.load("H:/images/pause_nor.png").convert_alpha()
    paused_pressed_image = pygame.image.load("H:/images/pause_pressed.png").convert_alpha()
    resume_not_image = pygame.image.load("H:/images/resume_nor.png").convert_alpha()
    resume_pressed_image = pygame.image.load("H:/images/resume_pressed.png").convert_alpha()
    pause_rect = paused_not_image.get_rect()
    pause_rect.left, pause_rect.top = width - pause_rect.width - 10, 10
    paused_image = paused_not_image

    running = True

    # 用于阻止重复打开记录文件
    recording = True

    # 设置难度级别
    leave = 1

    # 击落图片索引
    e1_destroy_index = 0
    e2_destroy_index = 0
    e3_destroy_index = 0
    me_destroy_index = 0

    # 解除玩家飞机复活无敌定时器
    invincible_tim = USEREVENT + 2

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

    # 炸弹补给
    boom_image = pygame.image.load("H:/images/bomb.png").convert_alpha()
    boom_rect = boom_image.get_rect()
    boom_font = pygame.font.Font("H:/font/font.ttf", 48)
    boom_num = 3

    # 超级子弹定时器
    super_bullet_tim = USEREVENT + 1
    super_bullet_choice = False

    # 玩家生命数量
    life_image = pygame.image.load("H:/images/life.png")
    life_rect = life_image.get_rect()
    life_num = 3
    # 每30秒发放一个补给包
    bullet_supply = supply.Bullet_Supply(bg_size)
    bomb_supply = supply.Boom_Supply(bg_size)
    supply_tim = USEREVENT
    pygame.time.set_timer(supply_tim, 30*1000)

    clock = pygame.time.Clock()
    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):
                    pause = not pause
                    if pause:
                        pygame.time.set_timer(supply_tim, 0)
                        pygame.mixer.music.pause()
                        pygame.mixer.pause()
                    else:
                        pygame.time.set_timer(supply_tim, 30*1000)
                        pygame.mixer.music.play(-1)
                        pygame.mixer.unpause()

            elif event.type == MOUSEMOTION:
                if pause_rect.collidepoint(event.pos):
                    if pause:
                        paused_image = resume_pressed_image
                    else:
                        paused_image = paused_pressed_image
                else:
                    if pause:
                        paused_image = resume_not_image
                    else:
                        paused_image = paused_not_image

                # 按下空格键,全屏轰炸
            elif event.type == KEYDOWN:
                if event.key == K_SPACE:
                    if boom_num:
                        if not pause:
                            boom_num -= 1
                            bomb_sound.play()
                            for each in enemies:
                                if each.rect.bottom > 0:
                                    each.active = False

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

            elif event.type == super_bullet_tim:
                super_bullet_choice = False
                pygame.time.set_timer(super_bullet_tim, 0)

            elif event.type == invincible_tim:
                me.Invincible = False
                pygame.time.set_timer(invincible_tim, 0)
        # 绘制背景图片
        screen.blit(background, (0, 0))

        # 根据玩家的分增加难度
        if leave == 1 and score > 90000:
            leave = 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)
            enemy_speed_up(small_enemies, 1)

        elif leave == 2 and score > 300000:
            leave = 3
            upgrade_sound.play()
            add_small_enemies(small_enemies, enemies, 3)
            add_mid_enemies(mid_enemies, enemies, 2)
            add_big_enemies(big_enemies, enemies, 1)
            enemy_speed_up(mid_enemies, 1)

        elif leave == 3 and score > 700000:
            leave = 4
            upgrade_sound.play()
            add_small_enemies(small_enemies, enemies, 3)
            add_mid_enemies(mid_enemies, enemies, 2)
            add_big_enemies(big_enemies, enemies, 2)
            enemy_speed_up(small_enemies, 1)
            enemy_speed_up(mid_enemies, 2)

        elif leave == 4 and score > 1200000:
            leave = 5
            upgrade_sound.play()
            add_small_enemies(small_enemies, enemies, 3)
            add_mid_enemies(mid_enemies, enemies, 2)
            add_big_enemies(big_enemies, enemies, 2)
            enemy_speed_up(small_enemies, 1)
            enemy_speed_up(big_enemies, 1)

        if not pause and life_num:
            # 检测玩家的键盘操作
            key_pressed = pygame.key.get_pressed()
            # 玩家飞机移动
            if key_pressed[K_w]:
                me.moveUp()
            if key_pressed[K_s]:
                me.moveDn()
            if key_pressed[K_a]:
                me.moveLf()
            if key_pressed[K_d]:
                me.moveRt()

            # 检测补给数目与是否能获得
            if bomb_supply.active is True:
                bomb_supply.move()
                screen.blit(bomb_supply.image, bomb_supply.rect)
                if pygame.sprite.collide_mask(bomb_supply, me):
                    if boom_num < 3:
                        get_bomb_sound.play()
                        boom_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):
                    super_bullet_choice = True
                    get_bullet_sound.play()
                    bullet_supply.active = False
                    pygame.time.set_timer(super_bullet_tim, 18*1000)

            # 类似定时器
            tim_delay -= 1
            if not tim_delay:
                tim_delay = 100

            if tim_delay % 5 == 0:
                switch_plane = not switch_plane

            # 10帧发射一次子弹
            if not (tim_delay % 9):
                bullet_sound.play()
                if super_bullet_choice:
                    bullets = sup_bullets
                    bullets[sup_bullet_index].reset((me.rect.centerx-33, me.rect.centery))
                    bullets[sup_bullet_index+1].reset((me.rect.centerx+30, me.rect.centery))
                    sup_bullet_index = (sup_bullet_index + 2) % 12
                else:
                    bullets = nor_bullets
                    bullets[nor_bullet_index].reset(me.rect.midtop)
                    nor_bullet_index = (nor_bullet_index + 1) % 4

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

            # 检测飞机碰撞
            crashed = pygame.sprite.spritecollide(me, enemies, False, pygame.sprite.collide_mask)
            if crashed:
                if me.Invincible is False:
                    me.active = False
                for e in crashed:
                    e.active = False

            # 绘制玩家飞机
            if me.active is True:
                if switch_plane:
                    screen.blit(me.image, me.rect)
                else:
                    screen.blit(me.image2, me.rect)
            else:
                if not (tim_delay % 3):
                    if me_destroy_index == 1:
                        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_tim, 3*1000)

            # 绘制地方飞机
            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_plane:
                            screen.blit(each.image, each.rect)
                        else:
                            screen.blit(each.image_2, each.rect)

                    # 绘制血槽
                    pygame.draw.line(screen, black,
                                     (each.rect.left, each.rect.top - 5),
                                     (each.rect.right, each.rect.top - 5),
                                     2)
                    energy_part = each.energy / enemy.Big_enemy.energy
                    if energy_part > 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_part*each.rect.width, each.rect.top - 5),
                                     2)
                    if each.rect.bottom == -50:
                        enemy3_fly_sound.play(-1)
                else:
                    # 敌机毁灭
                    if not (tim_delay % 3):
                        screen.blit(each.destroy_images[e3_destroy_index], each.rect)
                        e3_destroy_index = (e3_destroy_index + 1) % 6
                        if e3_destroy_index == 0:
                            each.reset()
                            enemy3_fly_sound.stop()
                            enemy3_down_sound.play()
                            score += 10000

            # 显示得分
            score_text = score_font.render("Score : %s" % str(score), True, white)
            screen.blit(score_text, (10, 5))

            for each in mid_enemies:
                if each.active:
                    each.move()
                    if each.hit:
                        screen.blit(each.image_hit, each.rect)
                        each.hit = False
                    else:
                        screen.blit(each.image, each.rect)
                    # 绘制血槽
                    pygame.draw.line(screen, black,
                                     (each.rect.left, each.rect.top - 5),
                                     (each.rect.right, each.rect.top - 5),
                                     2)
                    energy_part = each.energy / enemy.Mid_enemy.energy
                    if energy_part > 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_part*each.rect.width, each.rect.top - 5),
                                     2)
                else:
                    # 敌机毁灭
                    if not (tim_delay % 3):
                        if e2_destroy_index == 1:
                            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:
                            each.reset()
                            score += 6000

            for each in small_enemies:
                if each.active:
                    each.move()
                    screen.blit(each.image, each.rect)
                else:
                    # 敌机毁灭
                    if not (tim_delay % 3):
                        if e1_destroy_index == 1:
                            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:
                            each.reset()
                            score += 1000

        elif life_num == 0:
            # 背景音乐停止, 音效,停止发放补给
            pygame.mixer.music.stop()
            pygame.mixer.stop()
            pygame.time.set_timer(supply_tim, 0)
            if recording:
                # 读取历史最高得分
                recording = False
                with open("H:/record.txt", "r") as f:
                    record_score = int(f.read())
                if score > record_score:
                    record_score = score
                    with open("H:/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("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.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()

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

        # 绘制剩余炸弹补给
        boom_text = boom_font.render("x %d" % boom_num, True, white)
        text_rect = boom_text.get_rect()
        screen.blit(boom_image, (10, height - 10 - boom_rect.height), boom_rect)
        screen.blit(boom_text, (20 + boom_rect.width, height - 5 - text_rect.height))

        screen.blit(paused_image, pause_rect)
        pygame.display.flip()

        clock.tick(60)
示例#14
0
def main():
    #--背景音乐开始 循环
    pygame.mixer_music.play(-1)
    #---生成我方飞机
    me = myplane.MyPlane(bg_size)
    #生成敌方飞机 并把他们全放在这个enemies里
    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  #--定义4颗子弹  加上他的速度  大约有80%的射程
    for i in range(BULLET1_NUM):
        bullet1.append(bullet.Bullet1(
            me.rect.midtop))  #---生成位置  rect.midtop  图片中央上方

    #-生成超级子弹
    bullet2 = []
    bullet2_index = 0
    BULLET2_NUM = 8  #--定义4颗子弹  加上他的速度  大约有80%的射程
    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(None, 36)  #--显示得分的字体
    score_font.set_bold(True)

    #--标识是否暂停游戏
    puased = False
    puase_nor_image = pygame.image.load(
        "G:/PersonPro/PythonPro/每日任务/爬虫的自我修养/pygame/飞机大战/images/pause_nor.png"
    ).convert_alpha()
    puase_pressed_image = pygame.image.load(
        "G:/PersonPro/PythonPro/每日任务/爬虫的自我修养/pygame/飞机大战/images/pause_pressed.png"
    ).convert_alpha()
    resume_nor_image = pygame.image.load(
        "G:/PersonPro/PythonPro/每日任务/爬虫的自我修养/pygame/飞机大战/images/resume_nor.png"
    ).convert_alpha()
    resume_pressed_image = pygame.image.load(
        "G:/PersonPro/PythonPro/每日任务/爬虫的自我修养/pygame/飞机大战/images/resume_pressed.png"
    ).convert_alpha()

    puased_rect = puase_nor_image.get_rect()
    puased_rect.left, puased_rect.top = width - puased_rect.width - 10, 10
    puased_image = puase_nor_image

    #--设置游戏难度级别
    level = 1

    #--全屏炸弹
    bomb_image = pygame.image.load(
        "G:/PersonPro/PythonPro/每日任务/爬虫的自我修养/pygame/飞机大战/images/bomb.png"
    ).convert_alpha()
    bomb_rect = bomb_image.get_rect()
    bomb_font = pygame.font.Font(None, 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)  #-设定事件每10秒触发一次

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

    #---解除我方无敌状态计时器
    wudi_time = USEREVENT + 2

    #--限制重复打开记录文件
    read = False

    #--标识是否使用超级子弹
    is_double_bullet = False

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

    #用于延迟我方图片切换速度
    delay = 100

    #--我方飞机生命次数
    life_image = pygame.image.load(
        "G:/PersonPro/PythonPro/每日任务/爬虫的自我修养/pygame/飞机大战/images/life.png"
    ).convert_alpha()
    life_rect = life_image.get_rect()
    life_num = 3

    #----结束界面
    gameover_font = pygame.font.Font(None, 48)
    again_image = pygame.image.load(
        "G:/PersonPro/PythonPro/每日任务/爬虫的自我修养/pygame/飞机大战/images/again.png"
    ).convert_alpha()
    again_rect = again_image.get_rect()
    gameover_image = pygame.image.load(
        "G:/PersonPro/PythonPro/每日任务/爬虫的自我修养/pygame/飞机大战/images/gameover.png"
    ).convert_alpha()
    gameover_rect = gameover_image.get_rect()

    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 puased_rect.collidepoint(
                        event.pos):  #---event.pos会返回当前鼠标的位置
                    puased = not puased  #collidepoint 会自动检测传入的这个点是否在矩形内
                    if puased:  #-是返回True 不是返回Flase
                        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 puased_rect.collidepoint(event.pos):
                    if puased:
                        puased_image = resume_pressed_image
                    else:
                        puased_image = puase_pressed_image
                else:
                    if puased:
                        puased_image = resume_nor_image
                    else:
                        puased_image = puase_nor_image

            elif event.type == KEYDOWN:  #---如果空格 炸了 飞机死了
                if event.key == K_SPACE:
                    if bomb_num:
                        bomb_num -= 1
                        bomb_sound.play()
                        if bomb_num == 0:
                            bomb_num += 1  #---终极sb行为  没了 固定加1ha哈哈哈
                        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]):
                    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 == wudi_time:
                me.wudi = False
                pygame.time.set_timer(wudi_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, 2)
                add_big_enemies(big_enemies, enemies, 1)
                #--小飞机速度提升
                inc_speed(small_enemies, 1)
                #--中飞机速度提升
                inc_speed(mid_enemies, 1)
            elif level == 3 and score > 600000:
                level = 4
                upgrade_sound.play()  #--播放提升难度的音效
                #--增加8架小飞机  增加4架中型飞机  和3架 大飞机
                add_small_enemies(small_enemies, enemies, 5)
                add_mid_enemies(mid_enemies, enemies, 2)
                add_big_enemies(big_enemies, enemies, 1)
                #--小飞机速度提升
                inc_speed(small_enemies, 2)
                #--中飞机速度提升
                inc_speed(mid_enemies, 1)
            elif level == 4 and score > 800000:
                level = 5
                upgrade_sound.play()  #--播放提升难度的音效
                #--增加5架小飞机  增加3架中型飞机  和2架 大飞机
                add_small_enemies(small_enemies, enemies, 3)
                add_mid_enemies(mid_enemies, enemies, 1)
                add_big_enemies(big_enemies, enemies, 2)
                #--小飞机速度提升
                inc_speed(small_enemies, 1)
                #--中飞机速度提升
                inc_speed(mid_enemies, 2)
                #--大飞机速度提升
                inc_speed(big_enemies, 1)

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

        if life_num and not puased:
            #------检测用户的键盘操作
            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  #--先将他的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  #-绘制结束 hit为false
                    else:
                        if switch_iamge:  #--绘制正常形态
                            screen.blit(each.image1, each.rect)
                        else:
                            screen.blit(each.image2, each.rect)

                    #--绘制血槽#--line画一条直线的line  颜色黑色 底部血槽起点 终点 宽度
                    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_flying_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  #--默认索引进是0 绘制第一张   +1除6 除不尽 继续循环 然后第二张
                        if e3_destroy_index == 0:  #---一直进来索引为5的图片  也就是最后一张 +1%6除尽了  0了
                            enemy3_flying_sound.stop()
                            score += 10000  #--大型飞机毁灭 +10000
                            each.reset()  #--执行 each.reset()
            #--绘制中型飞机
            for each in mid_enemies:
                if each.active:
                    each.move()
                    if each.hit:
                        screen.blit(each.image2_hit, each.rect)
                        each.hit = False

                    else:
                        screen.blit(each.image, each.rect)
                    #--绘制血槽 颜色黑色 底部血槽起点 终点 宽度
                    pygame.draw.line(screen,BLACK,\
                        (each.rect.left,each.rect.top - 5),\
                            (each.rect.right,each.rect.top - 5),\
                                2)
                    #-当生命值大于20% 绘制绿色  否则红色
                    energy_remain = each.energy / enemy.MidEnemy.energy
                    if energy_remain > 0.2:
                        energy_color = GREEN
                    else:
                        energy_color = RED
                    pygame.draw.line(screen,energy_color,\
                        (each.rect.left,each.rect.top - 5),\
                            (each.rect.left + each.rect.width * energy_remain,\
                                each.rect.top - 5),2)
                else:
                    #--毁灭
                    if not (delay % 3):
                        if e2_destroy_index == 0:
                            enemy2_down_sound.play()
                        screen.blit(each.destroy_images[e2_destroy_index],
                                    each.rect)
                        e2_destroy_index = (e2_destroy_index + 1) % 4
                        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()

            #---检测我方飞机是否碰撞
            memies_down = pygame.sprite.spritecollide(
                me, enemies, False, pygame.sprite.collide_mask
            )  #--检测me这个精灵  enemes一组精灵  如果碰撞 返回一个列表
            if memies_down and not me.wudi:
                me.active = False
                for i in memies_down:
                    i.active = False

            if me.active:
                #--绘制我方飞机
                if switch_iamge:
                    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(wudi_time, 3 * 1000)

            #----绘制炸弹
            bomb_text = score_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:
                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)  #-用render函数将得分渲染成surface对象
            #---渲染的东西  抗锯齿  颜色
            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 read:
                read = True
            #-打开记录文件
            #----读取历史最高分
            with open("G:/PersonPro/PythonPro/每日任务/爬虫的自我修养/pygame/飞机大战/成绩.txt",
                      "r") as f:
                record = int(f.read())

            #-如果玩家高于历史 则存档
            if score > record:
                with open(
                        "G:/PersonPro/PythonPro/每日任务/爬虫的自我修养/pygame/飞机大战/成绩.txt",
                        "w") as f:
                    f.write(str(score))

            #--绘制结束界面
            record_text = score_font.render("Best:%d" % record, True,
                                            RED)  #--最高分
            screen.blit(record_text, (50, 50))

            gameover_text1 = gameover_font.render("You Score", True, WHITE)
            gameover_text1_rect = gameover_text1.get_rect()  #--你的成绩
            gameover_text1_rect.left,gameover_text1_rect.top = \
               (width - gameover_text1_rect.width)//2,height // 3
            screen.blit(gameover_text1, gameover_text1_rect)

            gameover_text2 = gameover_font.render(str(score), True, GREEN)
            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()
                #如果点击退出
                if gameover_rect.left < pos[0] < gameover_rect.right and\
                    again_rect.top < pos[1] <gameover_rect.bottom:
                    pygame.quit()
                    sys.exit()

        #--绘制暂停按钮
        screen.blit(puased_image, puased_rect)

        #---切换我方飞机
        if not (delay % 5):
            switch_iamge = not switch_iamge  #(只有delay能被五整出 才会not打开切换开关)
        delay -= 1
        if not delay:  #(每一帧-=1 如果没有重新给100)
            delay = 100

        pygame.display.flip()

        clock.tick(60)
示例#15
0
def main():
    pygame.mixer.music.play(-1)
    clock = pygame.time.Clock()
    #初始化英雄飞机
    heroPlan = hero.Hero(bg_size)
    #用于切换图片
    switch_image = True
    #用于延迟
    delay = 100
    #中弹图片索引
    e1_destroy_index = 0
    e2_destroy_index = 0
    e3_destroy_index = 0
    hero_destroy_index = 0

    #初始化敌机
    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(heroPlan.rect.midtop))

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

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

    #设置难度级别
    level = 1

    #全屏炸弹
    bomb_image = pygame.image.load("images/bomb.png")
    bomb_rect = bomb_image.get_rect()
    bomb_font = pygame.font.Font("font/font.otf", 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

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

    #标志是否暂停游戏
    paused = False
    paused_nor_image = pygame.image.load("images/paused_nor.png")
    paused_pressed_image = pygame.image.load("images/paused_pressed.png")
    resume_nor_image = pygame.image.load("images/resume_nor.png")
    resume_pressed_image = pygame.image.load("images/resume_pressed.png")
    paused_rect = paused_nor_image.get_rect()
    paused_rect.left, paused_rect.top = width - paused_rect.width - 10, 10
    paused_image = paused_nor_image

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

    #解除英雄机无敌状态定时器
    INVINCIBLE_TIME = USEREVENT + 2

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

    #游戏结束画面
    gameover_font = pygame.font.Font("font/font.otf", 48)
    restart_image = pygame.image.load("images/restart_nor.png")
    restart_rect = restart_image.get_rect()
    quit_image = pygame.image.load("images/quit_nor.png")
    quit_rect = quit_image.get_rect()

    #主流程
    while True:
        # 设置需要显示的背景图
        screen.blit(background, (0, 0))

        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 = paused_pressed_image
                else:
                    if paused:
                        paused_image = resume_nor_image
                    else:
                        paused_image = paused_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]):
                    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)
        #根据用户的得分增加难度
        if level == 1 and score > 5000:
            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)
            #提高小型机的速度
            add_speed(small_enemies, 1)
        elif level == 2 and score > 30000:
            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)
            # 提高小型机的速度
            add_speed(small_enemies, 1)
            add_speed(mid_enemies, 1)
        elif level == 3 and score > 60000:
            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)
            # 提高小型机的速度
            add_speed(small_enemies, 1)
            add_speed(mid_enemies, 1)
        elif level == 4 and score > 100000:
            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)
            # 提高小型机的速度
            add_speed(small_enemies, 1)
            add_speed(mid_enemies, 1)
            add_speed(big_enemies, 1)
        elif event.type == INVINCIBLE_TIME:
            heroPlan.invincible = False
            pygame.time.set_timer(INVINCIBLE_TIME, 0)

        if life_num and not paused:
            #检测用户的键盘操作
            key_pressed = pygame.key.get_pressed()
            if key_pressed[K_w] or key_pressed[K_UP]:
                heroPlan.moveUp()
            if key_pressed[K_s] or key_pressed[K_DOWN]:
                heroPlan.moveDown()
            if key_pressed[K_a] or key_pressed[K_LEFT]:
                heroPlan.moveLeft()
            if key_pressed[K_d] or key_pressed[K_RIGHT]:
                heroPlan.moveRight()

            # 绘制超级子弹补给并检测是否获得
            if bullet_supply.active:
                bullet_supply.move()
                screen.blit(bullet_supply.image, bullet_supply.rect)
                if pygame.sprite.collide_mask(bullet_supply, heroPlan):
                    get_bomb_sound.play()
                    #发射超级子弹
                    is_double_bullet = True
                    pygame.time.set_timer(DOUBLE_BULLET_TIME, 18 * 1000)
                    bullet_supply.active = False

            #绘制全屏炸弹补给并检测是否获得
            if bomb_supply.active:
                bomb_supply.move()
                screen.blit(bomb_supply.image, bomb_supply.rect)
                if pygame.sprite.collide_mask(bomb_supply, heroPlan):
                    get_bomb_sound.play()
                    if bomb_num < 3:
                        bomb_num += 1
                    bomb_supply.active = False

            # 发射子弹
            if not (delay % 10):
                bullet_sound.play()
                if is_double_bullet:
                    bullets = bullet2
                    bullets[bullet2_index].reset(
                        (heroPlan.rect.centerx - 25, heroPlan.rect.centery))
                    bullets[bullet2_index + 1].reset(
                        (heroPlan.rect.centerx + 20, heroPlan.rect.centery))
                    bullet2_index = (bullet2_index + 2) % BULLET2_NUM
                else:
                    bullets = bullet1
                    bullets[bullet1_index].reset(heroPlan.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_hit, each.rect)
                        each.hit = False
                    else:
                        screen.blit(each.image, each.rect)

                    #绘制血槽
                    pygame.draw.line(screen, BLACK,
                                     (each.rect.left, each.rect.top - 5),
                                     (each.rect.right, each.rect.top - 5), 2)
                    #当生命大于20%显示绿色,否则显示红色
                    energy_remain = each.energy / enemy.MidEnemy.energy
                    if energy_remain > 0.2:
                        energy_color = GREEN
                    else:
                        energy_color = RED
                    pygame.draw.line(screen,energy_color,
                                     (each.rect.left,each.rect.top - 5),
                                     (each.rect.left + each.rect.width * energy_remain,each.rect.top - 5),\
                                     2)

                else:
                    #毁灭
                    if not (delay % 3):
                        screen.blit(each.destroy_images[e2_destroy_index],
                                    each.rect)
                        e2_destroy_index = (e2_destroy_index + 1) % 4
                        if e2_destroy_index == 0:
                            enemy2_down_sound.play()
                            score += 6000
                            each.reset()
            #小型敌机
            for each in small_enemies:
                if each.active:
                    each.move()
                    screen.blit(each.image, each.rect)
                else:
                    #毁灭
                    if not (delay % 5):
                        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(
                heroPlan, enemies, False, pygame.sprite.collide_mask)
            if enemies_down and not heroPlan.invincible:
                heroPlan.active = False
                for e in enemies_down:
                    e.active = False

            #绘制英雄飞机
            if heroPlan.active:
                if switch_image:
                    screen.blit(heroPlan.image1, heroPlan.rect)
                else:
                    screen.blit(heroPlan.image2, heroPlan.rect)
            else:
                #毁灭
                hero_down_sound.play()
                if not (delay % 3):
                    screen.blit(heroPlan.destroy_images[hero_destroy_index],
                                heroPlan.rect)
                    hero_destroy_index = (hero_destroy_index + 1) % 4
                    if hero_destroy_index == 0:
                        life_num -= 1
                        heroPlan.reset()
                        pygame.time.set_timer(INVINCIBLE_TIME, 3 * 1000)

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

            #绘制全屏炸弹数量
            bomb_text = bomb_font.render("x %d" % bomb_num, True, RED)
            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("Scroe : %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, WHITE)
            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 -gameover_text1_rect.height) // 2 - 50
            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)

            restart_rect.left, restart_rect.top = (
                width - restart_rect.width) // 2, (gameover_text2_rect.bottom +
                                                   50)
            screen.blit(restart_image, restart_rect)

            quit_rect.left, quit_rect.top = (
                width - quit_rect.width) // 2, restart_rect.bottom + 10
            screen.blit(quit_image, quit_rect)

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

        #绘制暂停按钮
        screen.blit(paused_image, paused_rect)
        # 显示需要显示的内容
        # pygame.display.update()
        pygame.display.flip()
        clock.tick(60)
        #切换图片
        if not (delay % 5):
            switch_image = not switch_image
        delay -= 1
        if not delay:
            delay = 100
        #增加延时,解决cup占用率较高的问题
        time.sleep(0.01)
示例#16
0
文件: main.py 项目: swb123/gg
def main():
    pygame.mixer.music.play(-1)
    bullets = []
    #统计得分
    score = 0
    score_font = pygame.font.Font("font/59011=VTCBelialsBlade3d.ttf", 36)

    #标志是否暂停
    paused = False
    pause_nor_image = pygame.image.load(
        "image/game_pause_nor.png").convert_alpha()
    pause_pressed_image = pygame.image.load(
        "image/game_pause_pressed.png").convert_alpha()
    resume_nor_image = pygame.image.load(
        "image/game_resume_nor.png").convert_alpha()
    resume_pressed_image = pygame.image.load(
        "image/game_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("image/bomb.png").convert_alpha()
    bomb_rect = bomb_image.get_rect()
    bomb_font = pygame.font.SysFont("calibriz", 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

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

    #解除我方无敌状态定时器
    INVINCIBLE_TIME = USEREVENT + 2

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

    #游戏结束画面
    gameover_font = pygame.font.SysFont("calibrib", 48)
    again_image = pygame.image.load("image/game_again.png").convert_alpha()
    again_rect = again_image.get_rect()
    gameover_image = pygame.image.load("image/game_over.png").convert_alpha()
    gameover_rect = gameover_image.get_rect()

    #游戏开始界面
    start_flag = True
    gamestart_font = pygame.font.SysFont("ALGER", 55)
    game_start_text = gamestart_font.render("boom", True, BLUE)
    game_start_rect = game_start_text.get_rect()
    game_start_rect.left,game_start_rect.top = (width - game_start_rect.width)//2,\
                                               (height - game_start_rect.height)//2
    #设置开始定时器
    START_TIME = USEREVENT + 3
    pygame.time.set_timer(START_TIME, 5 * 1000)

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

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

    clock = pygame.time.Clock()

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

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

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

    #用于切换图片
    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
                    button_sound.play()
                    if paused:
                        pygame.time.set_timer(SUPPLY_TIME, 0)
                        pygame.mixer.music.pause()
                        pygame.mixer.pause()
                        paused_image = resume_nor_image
                    else:
                        pygame.time.set_timer(SUPPLY_TIME, 30 * 1000)
                        pygame.mixer.music.unpause()
                        pygame.mixer.unpause()
                        paused_image = pause_nor_image
                if event.button == 1 and gameover_rect.collidepoint(event.pos):
                    pygame.quit()
                    sys.exit()
                if event.button == 1 and again_rect.collidepoint(event.pos):
                    life_num = 3

            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 = 0
            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)
            elif event.type == START_TIME:
                start_flag = False
                pygame.time.set_timer(START_TIME, 0)

        #根据用户的得分增加难度
        if level == 1 and score > 5000:
            level = 2
            #增加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)
        elif level == 2 and score > 30000:
            level = 3
            #增加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
            #增加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
            #增加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 start_flag:
            screen.blit(game_start_text, game_start_rect)

        if life_num and not paused and not start_flag:
            #检测用户的键盘操作
            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_fly_sound.stop()
                            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:
                            score += 10000
                            each.reset()

            #绘制中型敌机
            for each in mid_enemies:
                if each.active:
                    each.move()
                    if each.hit:
                        screen.blit(each.image_hit, each.rect)
                        each.hit = False
                    else:
                        screen.blit(each.image, each.rect)

                    #绘制血槽
                    pygame.draw.line(screen,BLACK,(each.rect.left,each.rect.top-5),\
                                     (each.rect.right,each.rect.top-5),2)
                    #当生命大于20%显示绿色,否则显示红色
                    energy_remain = each.energy / enemy.MidEnemy.energy
                    if energy_remain > 0.2:
                        energy_color = GREEN
                    else:
                        energy_color = RED
                    pygame.draw.line(screen,energy_color,\
                                     (each.rect.left,each.rect.top-5),\
                                     (each.rect.left+each.rect.width*energy_remain,each.rect.top-5),\
                                     2)
                else:
                    #毁灭
                    if not (delay % 3):
                        if e2_destroy_index == 0:
                            enemy2_down_sound.play()
                        screen.blit(each.destroy_images[e2_destroy_index],
                                    each.rect)
                        e2_destroy_index = (e2_destroy_index + 1) % 4
                        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 each in enemies_down:
                    each.active = False

            #绘制我方飞机
            if me.active:
                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.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 - (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_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 -gameover_text1_rect.height)//2

            screen.blit(gameover_text1, gameover_text1_rect)

            gameover_text2 = gameover_font.render(str(score), True, RED)
            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 - gameover_rect.width)//2,\
                                           again_rect.bottom + 10
            screen.blit(gameover_image, gameover_rect)

        #绘制得分
        score_text = score_font.render("Score : %s" % str(score), True, WHITE)
        if life_num and not start_flag:
            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(30)
示例#17
0
def main():
    # 设置播放通道的最大数
    pygame.mixer.set_num_channels(20)
    pygame.mixer.music.play(-1)

    # 生成我方飞机
    me = myplane.MyPlane(bg_size)
    # 生成普通子弹
    bullet1 = []
    bullet1_index = 0
    BULLET1_NUM = 10
    for i in range(BULLET1_NUM):
        bullet1.append(bullet.Bullet1(me.rect.midtop))

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

    # 生成敌方小、中、大飞机
    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, 7)
    # 大型敌机
    big_enemies = pygame.sprite.Group()
    add_big_enemies(big_enemies, enemies, 1)

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

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

    # 生成超级子弹
    bullet2 = []
    bullet2_index = 0
    BULLET2_NUM = 20
    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)))

    # 用于切换飞机图片
    switch = True
    # 用于控制帧率
    delay = 100

    # 中弹图片索引
    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 = resume_pressed_image = pygame.image.load(
        'images/bomb.png').convert_alpha()
    bobm_image_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)

    # 用于阻止重复打开记录文件
    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()

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

    running = True
    while running:
        for event in pygame.event.get():
            # 检测用户是否关闭窗口
            if event.type == QUIT:
                pygame.quit()
                sys.exit()

            elif event.type == MOUSEBUTTONUP:
                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 == KEYUP:
                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]):
                    bullet_supply.reset()
                else:
                    bomb_supply.reset()

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

        # 根据用户的得分增加难度
        if level == 1 and score > 500:
            level = 2
            upgrade_sound.play()
            # 增加5架小型机,3架中型机,1架大型机
            add_small_enemies(small_enemies, enemies, 5)
            add_mid_enemies(mid_enemies, enemies, 3)
            add_big_enemies(big_enemies, enemies, 1)

        elif level == 2 and score > 1500:
            level = 3
            upgrade_sound.play()
            # 增加5架小型机,3架中型机,1架大型机
            add_small_enemies(small_enemies, enemies, 5)
            add_mid_enemies(mid_enemies, enemies, 3)
            add_big_enemies(big_enemies, enemies, 1)
            # 提升飞机型机的速度
            inc_speed(small_enemies, 1)

        elif level == 3 and score > 3000:
            level = 4
            upgrade_sound.play()
            # 增加5架小型机,3架中型机,1架大型机
            add_small_enemies(small_enemies, enemies, 5)
            add_mid_enemies(mid_enemies, enemies, 3)
            add_big_enemies(big_enemies, enemies, 1)
            inc_speed(small_enemies, 1)
            inc_speed(mid_enemies, 1)

        elif level == 4 and score > 5000:
            level = 5
            upgrade_sound.play()
            # 增加5架小型机,3架中型机,1架大型机
            add_small_enemies(small_enemies, enemies, 5)
            add_mid_enemies(mid_enemies, enemies, 3)
            add_big_enemies(big_enemies, enemies, 1)
            inc_speed(small_enemies, 1)
            inc_speed(mid_enemies, 1)
            inc_speed(big_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, 20 * 1000)
                    bullet_supply.active = False

            # 发射子弹
            if not (delay % 5):
                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.hp -= 1
                                if e.hp == 0:
                                    e.active = False
                            else:
                                e.hp -= 1
                                if e.hp == 0:
                                    e.active = False

            # 绘制敌机(大)
            for each in big_enemies:
                if each.active:
                    each.move()
                    if each.hit == True:
                        # 绘制被打到的特效
                        screen.blit(each.image_hit, each.rect)
                        each.hit = False
                    else:
                        if switch:
                            screen.blit(each.image1, each.rect)
                        else:
                            screen.blit(each.image2, each.rect)

                    # 绘制血槽
                    hp(each, enemy.BigEnmy)

                    # 敌机出现开始播放音效
                    if each.rect.bottom == -50:
                        enemy3_fly_sound.play(-1)
                else:
                    # 毁灭
                    if not (delay % 3):
                        if e3_destroy_index == 0:
                            enemy3_fly_sound.stop()
                            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:
                            score += 100
                            each.reset()
            # 绘制敌机(中)
            for each in mid_enemies:
                if each.active:
                    each.move()
                    if each.hit == True:
                        # 绘制被打到的特效
                        screen.blit(each.image_hit, each.rect)
                        each.hit = False
                    else:
                        screen.blit(each.image, each.rect)

                    # 绘制血槽
                    hp(each, enemy.MidEnmy)
                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 += 60
                            each.reset()
            # 绘制敌机(小)
            for each in small_enemies:
                if each.active:
                    each.move()
                    screen.blit(each.image, each.rect)

                    # 绘制血槽
                    hp(each, enemy.SmallEnmy)
                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 += 10
                            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:
                if switch:
                    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:
                        # 释放全屏炸弹并复活
                        for each in enemies:
                            if each.rect.bottom > 0:
                                each.active = False
                        life_num -= 1
                        me.reset()
            # 绘制得分
            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:
                # 读取历史最高得分
                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))
                recorded = True

            # 绘制结束界面
            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.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)

        # 绘制剩余炸弹数量
        bomb_text = score_font.render('× %d' % bomb_num, True, WHITE)
        bomb_text_rect = bomb_text.get_rect()
        screen.blit(bomb_image, (10, height - 10 - bomb_text_rect.height))
        screen.blit(
            bomb_text,
            (20 + bobm_image_rect.width, height - 5 - bomb_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))

        # 控制飞机图片切换速度
        if not (delay % 5):
            switch = not switch

        delay -= 1
        if not delay:
            delay = 100

        # 从缓冲区更新到屏幕
        pygame.display.flip()
        # 设置不会超过每秒60帧
        clock.tick(60)
示例#18
0
def main():
    # 播放音乐
    pygame.mixer.music.play(-1)

    # 实例我方飞机
    me = myplane.MyPlane(bg_size=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(me.rect.midtop))

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

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

    # 统计得分
    score = 0
    score_font = pygame.font.Font("D:/Mycodes/python/PlaneWar/font/font.ttf",
                                  36)

    # 标志是否暂停游戏
    paused = False
    paused_nor_image = pygame.image.load(
        "D:/Mycodes/python/PlaneWar/images/pause_nor.png").convert_alpha()
    paused_pressed_image = pygame.image.load(
        "D:/Mycodes/python/PlaneWar/images/pause_pressed.png").convert_alpha()
    resume_nor_image = pygame.image.load(
        'D:/Mycodes/python/PlaneWar/images/resume_nor.png').convert_alpha()
    resume_pressed_image = pygame.image.load(
        'D:/Mycodes/python/PlaneWar/images/resume_pressed.png').convert_alpha(
        )
    paused_rect = paused_nor_image.get_rect()
    paused_rect.left, paused_rect.top = width - paused_rect.width - 10, 10
    paused_image = paused_nor_image

    # 设置难度
    level = 1

    # 全屏炸弹
    bomb_image = pygame.image.load(
        'D:/Mycodes/python/PlaneWar/images/bomb.png').convert_alpha()
    bomb_rect = bomb_image.get_rect()
    bomb_font = pygame.font.Font("D:/Mycodes/python/PlaneWar/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_BULLTET_TIME = USEREVENT + 1

    # 解除我方重生无敌定时器
    INVINCIBLE_TIME = USEREVENT + 2

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

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

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

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

    # 用于延迟切换
    delay = 100

    # 限制打开一次记录文件
    recorded = False

    clock = pygame.time.Clock()
    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 = paused_pressed_image
                else:
                    if paused:
                        paused_image = resume_nor_image
                    else:
                        paused_image = paused_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_BULLTET_TIME:
                is_double_bullet = False
                pygame.time.set_timer(DOUBLE_BULLTET_TIME, 0)

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

        # 根据用户得分增加难度
        if level == 1 and score > 5000:
            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(target=small_enemies, inc=1)

        elif level == 2 and score > 30000:
            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(target=small_enemies, inc=1)
            inc_speed(target=mid_enemies, inc=1)

        elif level == 3 and score > 60000:
            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(target=small_enemies, inc=1)
            inc_speed(target=mid_enemies, inc=1)

        elif level == 4 and score > 100000:
            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(target=small_enemies, inc=1)
            inc_speed(target=mid_enemies, inc=1)
            inc_speed(target=big_enemies, inc=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(me, bomb_supply):
                    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(me, bullet_supply):
                    get_bullet_sound.play()
                    # 发射超级子弹
                    is_double_bullet = True
                    pygame.time.set_timer(DOUBLE_BULLTET_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 each in enemy_hit:
                            each.hit = True
                            each.energy -= 1
                            if each.energy == 0:
                                each.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_plane:
                            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 == -10:
                        enemy3_fly_sound.play(-1)
                        each.appear = True
                    # 离开画面, 关闭音效
                    if each.rect.bottom < -10 and each.appear:
                        #enemy3_fly_sound.stop()
                        each.appear = False
                else:
                    # 毁灭
                    if e3_destroy_index == 0:
                        enemy3_down_sound.play()
                    if not (delay % 2):
                        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 += 1000
                            each.reset()

            # 绘制敌方中型机
            for each in mid_enemies:
                if each.active:
                    each.move()
                    if each.hit:
                        screen.blit(each.image_hit, each.rect)
                        each.hit = False
                    else:
                        screen.blit(each.image, each.rect)

                    # 绘制血槽
                    pygame.draw.line(screen, BLACK,
                                     (each.rect.left, each.rect.top - 5),
                                     (each.rect.right, each.rect.top - 5), 2)

                    # 当生命大于20%显示绿色, 否则显示红色
                    energy_remain = each.energy / enemy.MidEnemy.energy
                    if energy_remain > 0.2:
                        energy_color = GREEN
                    else:
                        energy_color = RED
                    pygame.draw.line(
                        screen, energy_color,
                        (each.rect.left, each.rect.top - 5),
                        (each.rect.left + each.rect.width * energy_remain,
                         each.rect.top - 5), 2)
                else:
                    # 毁灭
                    if e2_destroy_index == 0:
                        enemy2_down_sound.play()
                    if not (delay % 2):
                        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 e1_destroy_index == 0:
                        enemy1_down_sound.play()
                    if not (delay % 2):
                        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 each in enemies_down:
                    each.active = False

            # 绘制我方飞机
            if me.active:
                if switch_plane:
                    screen.blit(me.image1, me.rect)
                else:
                    screen.blit(me.image2, me.rect)
            else:
                # 毁灭
                if me_destroy_index == 0:
                    me_down_sound.play()
                if not (delay % 2):
                    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("× %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 : %d' % 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(r"D:\Mycodes\python\PlaneWar\record\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("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.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 % 11):
            switch_plane = not switch_plane

        delay -= 1
        if not delay:
            delay = 100

        pygame.display.flip()
        clock.tick(60)
示例#19
0
文件: main.py 项目: KANG-CV/Cycle
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, 5)

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

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

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

    # 游戏结束画面
    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()

    #解除我方状态定时器
    INVINCIBLE_TIME = USEREVENT + 2

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

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

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

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

    #生成超级子弹
    bullet2 = []
    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()

    #用于切换图片
    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 > 500:
            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 > 1000:
            level = 3
            upgrade_sound.play()
            #增加5架小型低机,3架中型低级和1架大型敌机
            add_small_enemies(small_enemies, enemies, 5)
            add_mid_enemies(mid_enemies, enemies, 3)
            add_big_enemies(big_enemies, enemies, 1)
            #提升小型敌机的速度
            inc_speed(small_enemies, 2)
            inc_speed(mid_enemies, 1)
        elif level == 3 and score > 2000:
            level = 4
            upgrade_sound.play()
            #增加6架小型低机,3架中型低级和2架大型敌机
            add_small_enemies(small_enemies, enemies, 6)
            add_mid_enemies(mid_enemies, enemies, 3)
            add_big_enemies(big_enemies, enemies, 2)
            #提升小型敌机的速度
            inc_speed(small_enemies, 1)
            inc_speed(mid_enemies, 1)
            inc_speed(big_enemies, 1)
        elif level == 4 and score > 5000:
            level = 5
            upgrade_sound.play()
            #增加8架小型低机,4架中型低级和3架大型敌机
            add_small_enemies(small_enemies, enemies, 8)
            add_mid_enemies(mid_enemies, enemies, 4)
            add_big_enemies(big_enemies, enemies, 3)
            #提升小型敌机的速度
            inc_speed(small_enemies, 2)
            inc_speed(mid_enemies, 1)
            inc_speed(big_enemies, 1)
        elif level == 5 and score > 10000:
            upgrade_sound.play()
            #增加10架小型低机,6架中型低级和4架大型敌机
            add_small_enemies(small_enemies, enemies, 10)
            add_mid_enemies(mid_enemies, enemies, 6)
            add_big_enemies(big_enemies, enemies, 4)
            #提升小型敌机的速度
            inc_speed(small_enemies, 2)
            inc_speed(small_enemies, 2)
            inc_speed(big_enemies, 1)

        screen.blit(
            background, (0, 0)
        )  #将(blit,位块传输)图片Surface画到窗口Surface上Surface对象的blit方法,可以将一个Surface对象画到令一个Surface对象上

        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, 25 * 1000)
                    bullet_supply.active = False

            #发射子弹
            if not (delay % 10):
                bullet_sound.play()
                if is_double_bullet:
                    bullets = bullet2
                    a = me.rect.centerx - 33
                    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()
                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_down_sound.stop()
                            score += 25
                            each.reset()

            #绘制中型飞机
            for each in mid_enemies:
                if each.active:
                    each.move()
                    if each.hit:
                        #绘制被达到的特效
                        screen.blit(each.image_hit, each.rect)
                        each.hit = False
                    else:
                        screen.blit(each.image, each.rect)

                    #绘制血槽
                    pygame.draw.line(screen,BLACK,\
                                     (each.rect.left,each.rect.top - 5),\
                                     (each.rect.right,each.rect.top - 5),\
                                     2)

                    #当生命大于20%显示绿色,否则显示红色
                    energy_remain = each.energy / enemy.MidEnemy.energy
                    if energy_remain > 0.2:
                        energy_color = GREEN
                    else:
                        energy_color = RED
                    pygame.draw.line(screen,energy_color,\
                                     (each.rect.left,each.rect.top - 5),\
                                     (each.rect.left + each.rect.width * energy_remain,\
                                      each.rect.top - 5),\
                                     2)

                else:
                    #毁灭
                    if not (delay % 3):
                        if e2_destroy_index == 0:
                            enemy2_down_sound.play()
                        screen.blit(each.destroy_images[e2_destroy_index],
                                    each.rect)
                        e2_destroy_index = (e2_destroy_index + 1) % 4
                        if e2_destroy_index == 0:
                            enemy2_down_sound.stop()
                            score += 10
                            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:
                            enemy1_down_sound.stop()
                            score += 1
                            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:
                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],
                                each.rect)
                    me_destroy_index = (me_destroy_index + 1) % 4
                    if me_destroy_index == 0:
                        me_down_sound.stop()
                        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, 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)

            # 检测用户的鼠标操作
            # 如果用户按下鼠标左键
            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为0是,重置delay为100
            delay = 100

        pygame.display.flip()  #更新整个屏幕

        clock.tick(60)  #设置游戏的帧率为60帧
示例#20
0
def main():
    pygame.mixer.music.play(-1)

    #Add my plane
    me = myplane.MyPlane(bg_size)

    enemies = pygame.sprite.Group()

    #Create enemies
    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)

    #Create bullet
    bullet1 = []
    bullet1_index = 0
    BULLET1_NUM = 4
    for i in range(BULLET1_NUM):
        bullet1.append(bullet.Bullet1(me.rect.midtop))

    #Create super bullet
    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()

    #Get shoot by enemy
    e1_destroy_index = 0
    e2_destroy_index = 0
    e3_destroy_index = 0
    me_destroy_index = 0

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

    #Pause game
    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 of difficulty
    level = 1

    #Super powerful bomb
    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

    #Supply
    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)

    #Clock for super bullet
    DOUBLE_BULLET_TIME = USEREVENT + 1

    #Status of super bullet
    is_double_bullet = False

    #Clock for invincible condition of my plane
    INVINCIBLE_TIME = USEREVENT + 2

    #Number of lives
    life_image = pygame.image.load("images/life.png").convert_alpha()
    life_rect = life_image.get_rect()
    life_num = 3

    #Prevent open record file again and again
    recorded = False

    #End of game
    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
    switch_image = True

    #Time delay
    delay = 100
示例#21
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(me.rect.midtop))

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

    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

    # 每三十秒发放一个补给包
    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()
            # 增加三架小型敌机,两架中型敌机和一架大型敌机
            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 + 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_hit, each.rect)
                        each.hit = False
                    else:
                        screen.blit(each.image, each.rect)
                    # 绘制血槽
                    pygame.draw.line(screen, BLACK, \
                                     (each.rect.left, each.rect.top - 5), \
                                     (each.rect.right, each.rect.top - 5), \
                                     2)
                    # 当生命大于20%绿色,否则红色
                    energy_remain = each.energy / enemy.MidEnemy.energy
                    if energy_remain > 0.2:
                        energy_color = GREEN
                    else:
                        energy_color = RED
                    pygame.draw.line(screen, energy_color, \
                                     (each.rect.left, each.rect.top - 5), \
                                     (each.rect.left + each.rect.width * energy_remain, each.rect.top - 5), \
                                     2)
                else:
                    # 毁灭
                    if not (delay % 3):
                        if e2_destroy_index == 0:
                            enemy2_down_sound.play()
                        screen.blit(each.destroy_images[e2_destroy_index], each.rect)
                        e2_destroy_index = (e2_destroy_index + 1) % 4
                        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], each.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('× %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:
            # print('Game Over!')
            # 背景音乐停止
            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, 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)

            # 检测用户的鼠标操作
            # 如果用户按下鼠标左键
            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:
                    # 退出游戏
                    pygame.quit()
                    sys.quit()

        # 绘制暂停按钮
        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)
示例#22
0
def main():
    pygame.mixer.music.play(-1)

    running = True

    # 用于切换图片
    switch_image = True
    # 用于延时
    delay = 0

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

    # 统计分数
    score = 0
    score_font = pygame.font.SysFont("arial", 36)

    # 用户级别
    level = 1

    # 标志是否暂停游戏
    paused = False
    paused_nor_image = pygame.image.load(
        "material/image/game_pause_nor.png").convert_alpha()
    paused_pressed_image = pygame.image.load(
        "material/image/game_pause_pressed.png").convert_alpha()
    resume_nor_image = pygame.image.load(
        "material/image/game_resume_nor.png").convert_alpha()
    resume_pressed_image = pygame.image.load(
        "material/image/game_resume_pressed.png").convert_alpha()
    paused_rect = paused_nor_image.get_rect()
    paused_rect.left, paused_rect.top = width - paused_rect.width - 10, 0
    paused_image = paused_nor_image

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

    # 全屏炸弹
    bomb_image = pygame.image.load("material/image/bomb.png").convert_alpha()
    bomb_rect = bomb_image.get_rect()
    bomb_font = pygame.font.SysFont("arial", 36)
    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, 30000)

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

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

    # 解除我方无敌状态定时器
    INVINCIBL = USEREVENT + 2

    # 生成敌方飞机
    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, 10)
    big_enemies = pygame.sprite.Group()
    add_big_enemies(big_enemies, enemies, 5)
    # 生成普通子弹
    bullet1 = []
    bullet1_index = 0
    bullet1_num = 4
    for i in range(bullet1_num):
        bullet1.append(bullet.Bullet1(me.rect.midtop))

    recorded = False

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

    # 生成超级子弹
    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)))

    bullets = bullet1

    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, 30000)
                        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 = paused_pressed_image
                else:
                    if paused:
                        paused_image = resume_nor_image
                    else:
                        paused_image = paused_nor_image
            elif event.type == KEYDOWN:
                if event.key == K_SPACE:
                    bomb_sound.play()
                    if bomb_num > 0:
                        bomb_num -= 1
                        for each in enemies:
                            if each.rect.bottom > 0 and each.rect.top < height:
                                each.active = False
            elif event.type == SUPPLY_TIME:
                supply_sound.play()
                if choice([True, False]):
                    bomb_supply.reset()
                else:
                    bullet_supply.reset()
                    pygame.time.set_timer(DUOUBLE_BULLET_TIME, 18000)

            elif event.type == DUOUBLE_BULLET_TIME:
                print("DUOUBLE_BULLET_TIME")
                is_double_bullet = False
                pygame.time.set_timer(DUOUBLE_BULLET_TIME, 0)

            elif event.type == INVINCIBL:
                me.invincible = False

        if paused:
            screen.blit(background, (0, 0))
            screen.blit(paused_image, paused_rect)
        else:

            if life_num == 0:
                # 暂停音效跟发放补给定时器
                pygame.time.set_timer(SUPPLY_TIME, 0)
                pygame.mixer.music.pause()
                pygame.mixer.pause()

                # 最高分存档
                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))

                # 绘制结束画面
                screen.blit(background, (0, 0))
                game_over_text1 = score_font.render("Your Score:", True, WHITE)
                game_over_rect1 = game_over_text1.get_rect()
                game_over_rect1.left, game_over_rect1.top = \
                    (width - game_over_rect1.width) // 2 - 30, (height-game_over_rect1.height)//2 - 10
                screen.blit(game_over_text1, game_over_rect1)
                game_over_text2 = score_font.render(str(score), True, WHITE)
                game_over_rect2 = game_over_text2.get_rect()
                game_over_rect2.left, game_over_rect2.top = \
                    game_over_rect1.left + game_over_rect1.width, (height-game_over_rect2.height)//2 - 10
                screen.blit(game_over_text2, game_over_rect2)

                record_score_text = score_font.render(
                    "Best: %d" % record_score, True, WHITE)
                record_score_rect = record_score_text.get_rect()
                record_score_rect.left, record_score_rect.top = \
                    (width - record_score_rect.width) // 2, (height-record_score_rect.height)//2 + record_score_rect.height
                screen.blit(record_score_text, record_score_rect)

                again_image = pygame.image.load(
                    "material/image/btn_finish.png").convert_alpha()
                again_rect = again_image.get_rect()
                again_rect.left, again_rect.top = \
                    (width - again_rect.width) // 2, height-again_rect.height-30
                screen.blit(again_image, again_rect)

                pygame.display.flip()

                # 检测用户的那鼠标操作
                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()
                        break
                else:
                    continue

            # 根据用户的得分增加难度
            if level == 1 and score > 50000:
                level = 2
                upgrade_sound.play()
                # 增加敌机
                print("add_small_enemies1")
                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()
                # 增加敌机
                print("add_small_enemies2")
                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()
                # 增加敌机
                print("add_small_enemies3")
                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()
                # 增加敌机
                print("add_small_enemies4")
                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)

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

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

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

            # 发射子弹
            if not (delay % 10):
                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
                    bullet1[bullet1_index].reset(me.rect.midtop)
                    bullet1_index = (bullet1_index + 1) % bullet1_num

            # 绘制全屏炸弹补给并检测是否获得
            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
                    bullet_supply.active = False

            # 检测子弹是否击中敌机

            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
                    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()
                            each.reset()
                            score += 10000

            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)

                    # 当生命大于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:
                            each.reset()
                            score += 6000

            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:
                            each.reset()
                            score += 1000

            # 检测我方飞机是否被撞
            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.invincible = True
                        pygame.time.set_timer(INVINCIBL, 3000)
                        me.reset()

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

            # 绘制全屏炸弹数量
            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 > 0:
                for i in range(life_num):
                    screen.blit(life_image, \
                                (width - 10 - (i+1) * life_rect.width, \
                                height-10-life_rect.height))

            delay -= 1
            if not delay:
                delay = 100

            # 绘制按钮
            screen.blit(paused_image, paused_rect)
        pygame.display.flip()
        clock.tick(60)
示例#23
0
def main():
    pygame.mixer.music.play(-1)
    # 这里参数-1是指无限循环播放bgm

    # 生成我方飞机,调用myplane模块的MyPlace实例化
    me = myplane.MyPlane(bg_size)
    # 用于切换飞机尾气图片
    switch_image = True
    # 用于延迟
    delay = 100

    # 生成敌方飞机(将所有敌机放入碰撞组)
    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 = 6
    # 设置为四颗子弹(每屏幕)
    for i in range(BULLET1_NUM):
        bullet1.append(bullet.Bullet1(me.rect.midtop))
        # rect的midtop即位于顶部中央
    # 生成超级子弹
    bullet2 = []
    bullet2_index = 0
    BULLET2_NUM = 12
    # 设置为四颗子弹(每屏幕)
    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)))

    # 用于统计得分
    score = 0
    score_font = pygame.font.Font('font/Herculanum.ttf', 36)
    # pyinstaller打包时字体要写绝对路径

    # 暂停游戏标志
    paused = False
    paused_nor_image = pygame.image.load(
        r'./images/pause_nor.png').convert_alpha()
    paused_pressed_image = pygame.image.load(
        r'./images/pause_pressed.png').convert_alpha()
    resume_nor_image = pygame.image.load(
        r'./images/resume_nor.png').convert_alpha()
    resume_pressed_image = pygame.image.load(
        r'./images/resume_pressed.png').convert_alpha()
    paused_rect = paused_nor_image.get_rect()
    paused_rect.left, paused_rect.top = width - paused_rect.width - 10, 10
    paused_image = paused_nor_image
    # 设置暂停默认图片款式

    # 设置难度级别
    level = 1

    # 设置全屏炸弹
    bomb_image = pygame.image.load(r'./images/bomb.png').convert_alpha()
    bomb_rect = bomb_image.get_rect()
    bomb_font = pygame.font.Font('font/Herculanum.ttf', 48)
    bomb_num = 3

    # 每30秒发放补给包
    bullet_supply = supply.Bullet_Supply(bg_size)
    bomb_supply = supply.Bomb_Supply(bg_size)
    # 补给包定时器(自定义事件) 30s
    SUPPLY_TIMER = USEREVENT
    pygame.time.set_timer(SUPPLY_TIMER, 20 * 1000)

    # 超级子弹定时器
    DOUBLE_BULLET_TIMER = USEREVENT + 1
    # 标志是否使用
    is_double_bullet = False

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

    # 生命剩余
    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/Herculanum.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()

    # 中弹图片索引(中弹图片切换特效)
    e1_destroy_index = 0
    e2_destroy_index = 0
    e3_destroy_index = 0
    me_destroy_index = 0

    clock = pygame.time.Clock()
    running = True

    while running:
        # 偶尔发生的用event事件来描述即可
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()

            elif event.type == pygame.MOUSEBUTTONDOWN:
                if event.button == 1 and paused_rect.collidepoint(event.pos):
                    # rect的collidepoint方法检测事件是否发生的矩形区域内
                    paused = not paused
                    if paused:
                        # 暂停时音乐和音效暂停
                        pygame.mixer.music.pause()
                        pygame.mixer.pause()
                    else:
                        #  音乐和音效继续播放
                        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 = paused_pressed_image
                else:
                    if paused:
                        paused_image = resume_nor_image
                    else:
                        paused_image = paused_nor_image
            elif event.type == KEYDOWN and not paused:
                if event.key == K_SPACE:
                    if bomb_num:
                        bomb_num -= 1
                        thunder_sound.play()
                        screen.blit(thunder_image, (0, 0))
                        pygame.display.flip()
                        pygame.time.delay(500)
                        for each in enemies:
                            if each.rect.bottom > 0:
                                each.active = False
            elif event.type == SUPPLY_TIMER and not paused:
                supply_sound.play()
                if choice([True, False]):
                    bomb_supply.reset()
                else:
                    bullet_supply.reset()
            elif event.type == DOUBLE_BULLET_TIMER:
                # 触发超级子弹18秒后启动DOUBLE_BULLET_TIMER事件,定时器就关闭
                is_double_bullet = False
                pygame.time.set_timer(DOUBLE_BULLET_TIMER, 0)
            elif event.type == INVINCIBLE_TIMER:
                me.invincible = False
                pygame.time.set_timer(INVINCIBLE_TIMER, 0)
                # 触发解除无敌事件后,取消计时器

        # 根据用户得分增加难度
        if level == 1 and score > 500:
            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)
            # 提升小飞机速度(1点)
            increase_speed(small_enemies, 1)
        elif level == 2 and score > 2000:
            level = 3
            upgrade_sound.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)
            increase_speed(mid_enemies, 1)
        elif level == 3 and score > 8000:
            level = 4
            upgrade_sound.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)
            increase_speed(mid_enemies, 1)
        elif level == 4 and score > 15000:
            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)
            increase_speed(small_enemies, 1)
            increase_speed(mid_enemies, 1)

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

        if life_num and not paused:
            # 频繁发生的用key模块 检测用户的整个键盘操作,返回布尔类型值
            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(me, bomb_supply):
                    # 这里检测完美碰撞(两个单体),返回True和False
                    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(me, bullet_supply):
                    # 这里检测完美碰撞(两个单体),返回True和False
                    get_bullet_sound.play()
                    # 发射超级子弹,持续18秒
                    is_double_bullet = True
                    pygame.time.set_timer(DOUBLE_BULLET_TIMER, 12 * 1000)
                    bullet_supply.active = False

            # 子弹发射(每10帧绘制一次)
            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)
                    # 这里其实是预算了子弹差不多4颗能到屏幕80%地方(飞机下面状态栏占了20%)
                    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:
                            # 中飞机和大飞机血量为0才阵亡
                            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)
                    # 在飞机上方五个像素位置画一条线(宽2像素)

                    # 当生命大于20%显示绿色,否则显示红色
                    energy_remanin = each.energy / enemy.BigEnemy.energy
                    if energy_remanin > 0.2:
                        energy_color = GREEN
                    else:
                        energy_color = RED
                    pygame.draw.line(
                        screen, energy_color,
                        (int(each.rect.left), int(each.rect.top - 5)),
                        (int(each.rect.left) +
                         int(each.rect.width * energy_remanin),
                         int(each.rect.top - 5)), 2)
                    # 绘制生命剩余

                    # 大飞机即将出现时带音效
                    if each.rect.bottom == -50:
                        # 大飞机speed=1,肯定会到达-50,这时候开始播放(知道挂掉)
                        enemy3_fly_sound.play(-1)
                        # -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)
                        # 下面是个小技巧,余数从0~5,对应毁灭图片列表里6歌元素
                        e3_destroy_index = (e3_destroy_index + 1) % 6
                        # 一开始(0+1)%6==1 ,下面判断确保进行一轮
                        if e3_destroy_index == 0:
                            enemy3_fly_sound.stop()
                            score += 1000
                            each.reset()

            # 绘制中飞机
            for each in mid_enemies:
                if each.active:
                    each.move()
                    if each.hit:
                        screen.blit(each.image_hit, each.rect)
                        each.hit = False
                    else:
                        screen.blit(each.image, each.rect)
                    # 绘制血槽
                    pygame.draw.line(screen, BLACK,
                                     (each.rect.left, each.rect.top - 5),
                                     (each.rect.right, each.rect.top - 5), 2)
                    # 在飞机上方五个像素位置画一条线(宽2像素)

                    # 当生命大于20%显示绿色,否则显示红色
                    energy_remanin = each.energy / enemy.MidEnemy.energy
                    if energy_remanin > 0.2:
                        energy_color = GREEN
                    else:
                        energy_color = RED
                    pygame.draw.line(
                        screen, energy_color,
                        (int(each.rect.left), int(each.rect.top - 5)),
                        (int(each.rect.left +
                             each.rect.width * energy_remanin),
                         int(each.rect.top - 5)), 2)
                    # 绘制生命剩余
                else:
                    if not (delay % 3):
                        # 降速否则毁灭图片看不清
                        if e2_destroy_index == 0:
                            # 毁灭之歌
                            enemy2_down_sound.play()
                            # 防止pygame音效通道被占满(防止重复帧播放音效)
                        # 毁灭时放图片(索引)
                        screen.blit(each.destroy_images[e2_destroy_index],
                                    each.rect)
                        # 下面是个小技巧,余数从0~5,对应毁灭图片列表里6歌元素
                        e2_destroy_index = (e2_destroy_index + 1) % 4
                        # 一开始(0+1)%6==1 ,下面判断确保进行一轮
                        if e2_destroy_index == 0:
                            score += 500
                            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)
                        # 下面是个小技巧,余数从0~5,对应毁灭图片列表里6歌元素
                        e1_destroy_index = (e1_destroy_index + 1) % 4
                        # 一开始(0+1)%6==1 ,下面判断确保进行一轮
                        if e1_destroy_index == 0:
                            score += 100
                            each.reset()

            #检测我方飞机是否被撞(第三个参数是碰撞毁灭False,第四个参数默认是矩形区域检测))
            enemies_down = pygame.sprite.spritecollide(
                me, enemies, False, pygame.sprite.collide_mask)
            # pygame.sprite.collide_mask图片非透明部分接触碰撞
            if enemies_down and not me.invincible:
                me.active = False
                # 返回一个列表,里面包含所有与sprite碰撞的元素,敌机的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)
                    # 下面是个小技巧,余数从0~5,对应毁灭图片列表里6歌元素
                    me_destroy_index = (me_destroy_index + 1) % 4
                    # 一开始(0+1)%6==1 ,下面判断确保进行一轮
                    if me_destroy_index == 0:
                        # me.reset()
                        life_num -= 1
                        me.reset()
                        pygame.time.set_timer(INVINCIBLE_TIMER, 3 * 1000)
                        # 设置reset后3秒,然后启动解除无敌状态

            # 得分显示(render函数将成字符串渲染成surface对象)
            score_text = score_font.render("Score : %s" % str(score), True,
                                           WHITE)
            # 第二个参数为True表示拒绝锯齿
            screen.blit(score_text, (10, 5))

        # 生命为0结束
        elif life_num == 0:
            # bgm停止
            pygame.mixer.music.stop()
            # 停止音效
            pygame.mixer.stop()
            # 停止补给包
            pygame.time.set_timer(SUPPLY_TIMER, 0)

            if not recorded:
                # 读取历史最高分
                with open("record.txt", 'a+') as f:
                    f.seek(0, 0)
                    record_score = int(f.read())

                    # 如果玩家得分高于最高分则存档
                    if score > record_score:
                        f.seek(0, 0)
                        f.truncate()
                        f.write(str(score))
                recorded = True
                print("Game Over!")
            #  绘制游戏结束画面
            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 // 3
            screen.blit(gameover_text1, gameover_text1_rect)

            # 分数显示
            gameover_text2 = gameover_font.render(str(score), True, WHITE)
            gameover_text2_rect = gameover_text2.get_rect()
            gameover_text2_rect.left, gameover_text2_rect.top = (
                width - gameover_text2_rect.width
            ) // 2, gameover_text1_rect.bottom + 10
            screen.blit(gameover_text2, gameover_text2_rect)

            # 重新开始按钮
            again_rect.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)

            # 检测用户的鼠标操作
            # 如果用户按下鼠标左键(0表示第一个元素————鼠标左键)
            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)

        # 绘制清屏炸弹显示
        # 炸弹图片
        screen.blit(bomb_image, (10, height - 10 - bomb_rect.height))
        # 炸弹文本
        bomb_text = bomb_font.render("x %d" % bomb_num, True, WHITE)
        text_rect = bomb_text.get_rect()
        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))

        # 延迟切换(delay只有被5整除的时候才会切换)
        if not (delay % 5):
            switch_image = not switch_image
        delay -= 1
        if not delay:
            delay = 100
        # 相当于60帧的游戏尾气切换只有12帧

        pygame.display.flip()
        clock.tick(60)
示例#24
0
def main():

    pygame.mixer.music.play(-1)

    clock = pygame.time.Clock()

    running = True

    frames = 60
    delay = 100

    # define lives
    life_image = pygame.image.load("images\life.png").convert_alpha()
    life_rect = life_image.get_rect()
    life_num = 1
    life_display_width = life_rect.width + 5
    """define the score"""
    # load font
    score = 0
    score_font = pygame.font.Font("eng_font.ttf", 20)
    final_score_font = pygame.font.Font("eng_font.ttf", 40)
    break_record_font = pygame.font.Font("eng_font.ttf", 40)
    function_font = pygame.font.Font("eng_font.ttf", 30)
    function_pressed_font = pygame.font.Font("eng_font.ttf", 20)

    # create font surfaces
    final_score_text1 = final_score_font.render("Score", True, WHITE)
    #final score text2 is related to the game, defined in the end
    restart_text = function_font.render("RESTART", True, WHITE)
    restart_pressed_text = function_pressed_font.render("RESTART", True, WHITE)
    exit_text = function_font.render("EXIT", True, WHITE)
    exit_pressed_text = function_pressed_font.render("EXIT", True, WHITE)

    # acquire font rect
    restart_text_rect = restart_text.get_rect()
    restart_text_rect.center = (width // 2, 380)
    restart_pressed_text_rect = restart_pressed_text.get_rect()
    restart_pressed_text_rect.center = (width // 2, 380)
    exit_text_rect = exit_text.get_rect()
    exit_text_rect.center = (width // 2, 460)
    exit_pressed_text_rect = exit_pressed_text.get_rect()
    exit_pressed_text_rect.center = (width // 2, 460)

    # define levels upon scores
    level = 1
    level_font = pygame.font.Font("eng_font.ttf", 10)

    # define supply
    bomb_supply = supply.Bomb_Supply(bg_size)
    bullet_supply = supply.Bullet_Supply(bg_size)
    SUPPLY_TIME = USEREVENT
    supply_interval = 3 * 1000
    pygame.time.set_timer(SUPPLY_TIME, supply_interval)
    bomb_num = 0

    # define bomb stock
    bomb_stock1 = pygame.image.load(r"images\bomb.png").convert_alpha()
    bomb_stock2 = pygame.image.load(r"images\bomb.png").convert_alpha()
    bomb_stock3 = pygame.image.load(r"images\bomb.png").convert_alpha()
    bomb_stocks = [bomb_stock1, bomb_stock2, bomb_stock3]
    bomb_stock_rect = bomb_stock1.get_rect()
    bomb_stock_display_width = bomb_stock_rect.width + 5

    # newborn timer
    NEWBORN_TIMER = USEREVENT + 2

    # super bullet timer
    DOUBLE_BULLET_TIME = USEREVENT + 1

    # super bullet signal
    is_double_bullet = False

    # bomb confirm switch
    bomb_confirm = False

    # switch of record when game over
    end_recorded = False

    # define pause and continue button
    paused = False
    pause_nor_image = pygame.image.load("images\pause1.png").convert_alpha()
    pause_pressed_image = pygame.image.load(
        "images\pause2.png").convert_alpha()
    continue_nor_image = pygame.image.load(
        "images\continue1.png").convert_alpha()
    continue_pressed_image = pygame.image.load(
        "images\continue2.png").convert_alpha()
    paused_rect = pause_nor_image.get_rect()
    paused_rect.right, paused_rect.top = width - 10, 10
    pause_image = pause_nor_image

    # define game over buttons
    restart_pressed = False
    exit_pressed = False

    # creating my plane
    me = myplane.MyPlane(bg_size)
    me_down_index = 0

    # creating the enemy planes
    enemies = pygame.sprite.Group()

    small_enemies = pygame.sprite.Group()
    add_small_enemies(small_enemies, enemies, 15)
    e1_destroy_index = 0

    normal_enemies = pygame.sprite.Group()
    add_normal_enemies(normal_enemies, enemies, 5)
    e2_destroy_index = 0
    e2_hit = False

    strong_enemies = pygame.sprite.Group()
    add_strong_enemies(strong_enemies, enemies, 1)
    e3_destroy_index = 0
    e3_hit = False

    # creating bullets
    bullet1 = []
    bullet1_index = 0
    BULLET1_NUM = 4  # customized, to ensure the number of bullets is adequate
    for i in range(BULLET1_NUM):
        bullet1.append(bullet.Bullet1(me.rect.midtop))

    bullet2 = []
    bullet2_index = 0
    BULLET2_NUM = 8  # customized, to ensure the number of bullets is adequate
    for i in range(BULLET1_NUM):
        bullet2.append(bullet.Bullet2((me.rect.centerx + 30, me.rect.centery)))
        bullet2.append(bullet.Bullet2((me.rect.centerx - 33, me.rect.centery)))

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

            if life_num:
                """detection of regular game page and pause page """
                # operation of pause and continue
                if event.type == MOUSEBUTTONDOWN 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, supply_interval)
                        pygame.mixer.music.unpause()
                        pygame.mixer.unpause()

                elif event.type == MOUSEMOTION:
                    if paused_rect.collidepoint(event.pos):
                        if paused:
                            pause_image = continue_pressed_image
                        else:
                            pause_image = pause_pressed_image
                    else:
                        if paused:
                            pause_image = continue_nor_image
                        else:
                            pause_image = pause_nor_image

                elif event.type == MOUSEBUTTONUP:
                    if paused_rect.collidepoint(event.pos):
                        if paused:
                            pause_image = continue_nor_image
                        else:
                            pause_image = pause_nor_image

                # trigger of supply
                elif event.type == SUPPLY_TIME:
                    show_supply_sound.play()
                    if choice((True, False)):
                        bomb_supply.reset()
                    else:
                        bullet_supply.reset()

                # detect the end of bullet supply
                elif event.type == DOUBLE_BULLET_TIME:
                    is_double_bullet = False
                    pygame.time.set_timer(DOUBLE_BULLET_TIME, 0)

                # bomb bomb
                elif event.type == KEYDOWN:
                    if event.key == K_SPACE:
                        if bomb_num > 0:
                            bomb_sound.play()
                            bomb_num -= 1
                            bomb_confirm = True

                # out of newborn
                elif event.type == NEWBORN_TIMER:
                    me.newborn = False
                    pygame.time.set_timer(NEWBORN_TIMER, 0)
            """detection of game over page"""
            if life_num == 0:
                if event.type == MOUSEMOTION:
                    if restart_text_rect.collidepoint(event.pos):
                        restart_pressed = True
                    elif exit_text_rect.collidepoint(event.pos):
                        exit_pressed = True
                    else:
                        restart_pressed = False
                        exit_pressed = False

                elif event.type == MOUSEBUTTONDOWN:
                    if restart_text_rect.collidepoint(event.pos):
                        life_num = 3
                        bomb_num = 0
                        score = 0
                        delay = 100
                        is_double_bullet = False
                        paused = False
                        restart_pressed = False
                        end_recorded = False
                        pygame.mixer.music.play(-1)
                        pygame.time.set_timer(SUPPLY_TIME, supply_interval)

                        level = 1  #need to reset enemies

                        #reset enemies
                        enemies.empty()

                        small_enemies.empty()
                        add_small_enemies(small_enemies, enemies, 15)
                        e1_destroy_index = 0

                        normal_enemies.empty()
                        add_normal_enemies(normal_enemies, enemies, 5)
                        e2_destroy_index = 0
                        e2_hit = False

                        strong_enemies.empty()
                        add_strong_enemies(strong_enemies, enemies, 1)
                        e3_destroy_index = 0
                        e3_hit = False

                    elif exit_text_rect.collidepoint(event.pos):
                        pygame.quit()
                        sys.exit()

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

        # level adjustment
        if level == 1 and score >= 50000:
            level = 2
            upgrade_sound.play()
            # add 3 small enemies, 2 normal enemy and 1 strong enemy
            add_small_enemies(small_enemies, enemies, 3)
            add_normal_enemies(normal_enemies, enemies, 2)
            add_strong_enemies(strong_enemies, enemies, 1)
            # increase the speed of small enemy
            add_speed(small_enemies, 1)

        if level == 2 and score >= 120000:
            level = 3
            upgrade_sound.play()
            # add 5 small enemies, 3 normal enemy and 2 strong enemy
            add_small_enemies(small_enemies, enemies, 5)
            add_normal_enemies(normal_enemies, enemies, 3)
            add_strong_enemies(strong_enemies, enemies, 2)
            # increase the speed of small enemy
            add_speed(small_enemies, 1)
            add_speed(normal_enemies, 1)

        if level == 3 and score >= 200000:
            level = 4
            upgrade_sound.play()
            # add 5 small enemies, 3 normal enemy and 2 strong enemy
            add_small_enemies(small_enemies, enemies, 5)
            add_normal_enemies(normal_enemies, enemies, 3)
            add_strong_enemies(strong_enemies, enemies, 2)
            # increase the speed of small enemy
            add_speed(small_enemies, 1)
            add_speed(normal_enemies, 1)

        elif level == 4 and score >= 300000:
            level = 5
            upgrade_sound.play()
            # add 5 small enemies, 3 normal enemy and 2 strong enemy
            add_small_enemies(small_enemies, enemies, 5)
            add_normal_enemies(normal_enemies, enemies, 3)
            add_strong_enemies(strong_enemies, enemies, 2)
            # increase the speed of small enemy
            add_speed(small_enemies, 1)
            add_speed(normal_enemies, 1)

        if life_num and not paused:
            # detecting user's keyboard
            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()

            # depicting bullets
            if not (delay % 10):
                if is_double_bullet:
                    bullets = bullet2
                    bullets[bullet2_index].reset(
                        (me.rect.centerx + 30, 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) % BULLET1_NUM

            # depicting bullets
            for b in bullets:
                if b.active:
                    b.move()
                    screen.blit(b.image, b.rect)
                    enemies_down = pygame.sprite.spritecollide(
                        b, enemies, False, pygame.sprite.collide_mask)
                    for e in enemies_down:
                        if e in normal_enemies or e in strong_enemies:
                            e.hp -= 1
                            e.hit = True
                            if e.hp == 0:
                                e.active = False
                        else:
                            e.active = False
                        b.active = False

            # depicting enemy planes
            for each in strong_enemies:
                if each.active:
                    if bomb_confirm:
                        if each.rect.bottom > -10:
                            each.active = False
                    else:
                        each.move()
                        # play sound before showing
                        if 0 > each.rect.bottom > -50:
                            enemy3_show_sound.play()

                        # draw hp bar
                        pygame.draw.line(screen, BLACK, \
                                         (each.rect.left, each.rect.top - 5), \
                                         (each.rect.right, each.rect.top - 5), \
                                         2)
                        hp_remain = each.hp / enemy.StrongEnemy.hp
                        hp_color = GREEN if hp_remain > 0.2 else RED
                        pygame.draw.line(screen, hp_color, \
                                         (each.rect.left, each.rect.top - 5), \
                                         (each.rect.width * hp_remain + each.rect.left, \
                                          each.rect.top - 5), \
                                         2)
                        if each.hit:
                            screen.blit(each.hit_image, each.rect)
                            each.hit = False
                        else:
                            screen.blit(each.image, each.rect)
                else:
                    # conduct 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) % each.destroy_steps
                        if e3_destroy_index == 0:
                            score += 15000
                            each.reset()

            for each in normal_enemies:
                if each.active:
                    if bomb_confirm:
                        if each.rect.bottom > -10:
                            each.active = False
                    else:
                        each.move()

                        # draw hp bar
                        pygame.draw.line(screen, BLACK, \
                                         (each.rect.left, each.rect.top - 5), \
                                         (each.rect.right, each.rect.top - 5), \
                                         2)
                        hp_remain = each.hp / enemy.NormalEnemy.hp
                        hp_color = GREEN if hp_remain > 0.2 else RED
                        pygame.draw.line(screen, hp_color, \
                                         (each.rect.left, each.rect.top - 5), \
                                         (each.rect.width * hp_remain + each.rect.left, \
                                          each.rect.top - 5), \
                                         2)
                        if each.hit:
                            screen.blit(each.hit_image, each.rect)
                            each.hit = False
                        else:
                            screen.blit(each.image, each.rect)
                else:
                    # conduct destroy
                    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) % each.destroy_steps
                        if e2_destroy_index == 0:
                            score += 5000
                            each.reset()

            for each in small_enemies:
                if each.active:
                    if bomb_confirm:
                        if each.rect.bottom > -10:
                            each.active = False
                    else:
                        each.move()
                        screen.blit(each.image, each.rect)
                else:
                    # conduct destroy
                    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) % each.destroy_steps
                        if e1_destroy_index == 0:
                            score += 500
                            each.reset()

            # detect collision of our plane
            enemies_down = pygame.sprite.spritecollide(
                me, enemies, False, pygame.sprite.collide_mask)
            if enemies_down and not me.newborn:
                me.active = False
                for e in enemies_down:
                    e.active = False

            # depicting my plane
            if me.active:
                if not me.newborn:
                    me.switchShape()
                    screen.blit(me.images[me.order], me.rect)
                else:
                    # blink when new born
                    newborn_countdown -= 1
                    if not (newborn_countdown % (frames // 7)):
                        screen.blit(me.images[me.order], me.rect)
            else:
                # conduct destroy
                me_down_sound.play()
                if not (delay % 3):
                    screen.blit(me.destroy_images[me_down_index], me.rect)
                    me_down_index = (me_down_index + 1) % me.destroy_steps
                    if me_down_index == 0:
                        if life_num:
                            life_num -= 1
                            me.reset()
                            newborn_countdown = frames * 2
                            pygame.time.set_timer(NEWBORN_TIMER, 2 * 1000)

            # depicting supply
            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()
                    is_double_bullet = True
                    pygame.time.set_timer(DOUBLE_BULLET_TIME, 18 * 1000)
                    bullet_supply.active = False

            # depict bomb stock
            for i in range(bomb_num):
                screen.blit(bomb_stocks[i], \
                            (20 + bomb_stock_display_width * i, \
                             height - bomb_stock_rect.height - 20))

            # depict life stock
            for i in range(life_num):
                screen.blit(life_image, \
                            (width - 20 - life_display_width * (1 + i), \
                             height - life_rect.height - 20))

            if delay:
                delay -= 1
            else:
                delay = 100

        elif life_num == 0:
            if not end_recorded:
                # game over
                end_recorded = True

                # stop music and sound
                pygame.mixer.music.stop()
                pygame.mixer.stop()

                # stop supply system
                pygame.time.set_timer(SUPPLY_TIME, 0)

                # load record
                with open("record.txt", "r") as f:
                    record_score = int(f.read())

                # store score if the best
                if score > record_score:
                    break_record = True
                    record_score = score
                    with open("record.txt", "w") as f:
                        f.write(str(score))

                else:
                    break_record = False
            """depict the screen of end of the game"""
            #record score display
            record_score_text = score_font.render(
                "Best score:{}".format(record_score), True, WHITE)
            screen.blit(record_score_text, (10, 5))

            #break record display
            if break_record:
                break_record_text = break_record_font.render(
                    "BREAK RECORD", True, WHITE)
                screen.blit(break_record_text,
                            (width // 2 - break_record_text.get_width() // 2,
                             100 - 30))

            # score display
            #final score text1 is solid, defined in the beginning
            screen.blit(
                final_score_text1,
                (width // 2 - final_score_text1.get_width() // 2, 190 - 30))
            final_score_text2 = final_score_font.render(
                "{}".format(score), True, WHITE)
            screen.blit(
                final_score_text2,
                (width // 2 - final_score_text2.get_width() // 2, 270 - 30))

            #display of restart and exit
            if restart_pressed:
                screen.blit(
                    restart_pressed_text,
                    (width // 2 - restart_pressed_text_rect.width // 2, 380))
            else:
                screen.blit(restart_text,
                            (width // 2 - restart_text_rect.width // 2, 380))
            if exit_pressed:
                screen.blit(
                    exit_pressed_text,
                    (width // 2 - exit_pressed_text_rect.width // 2, 460))
            else:
                screen.blit(exit_text,
                            (width // 2 - exit_text_rect.width // 2, 460))

        if life_num:
            """only print if pause or in game"""

            # print the score
            score_text = score_font.render("Score : {}".format(score), True,
                                           WHITE)
            screen.blit(score_text, (10, 5))

            # print the level
            level_text = level_font.render("Level : {}".format(level), True,
                                           WHITE)
            screen.blit(level_text, (50, 30))

            screen.blit(pause_image, paused_rect)

        pygame.display.flip()

        clock.tick(frames)

        if bomb_confirm:
            # bomb used
            bomb_confirm = False