コード例 #1
0
def main():
    run = True
    FPS = 60
    level = 0
    boss_spawned = False
    lives = 5
    main_font = pygame.font.SysFont("comicsans", 50)
    stats_font = pygame.font.SysFont("comicsans", 30)
    lost_font = pygame.font.SysFont("comicsans", 60)

    player_items = []
    dropped_items = []

    enemies = []
    dificulty = 4
    wave_length = dificulty
    enemy_vel = 1
    level_to_boss = 4

    killed_bosses = 0

    player_vel = 5
    laser_vel = 5

    player = Player(300, 630)
    player_damage = player.damage

    clock = pygame.time.Clock()

    lost = False
    lost_count = 0

    won = False

    def redraw_window():
        nonlocal player_vel
        nonlocal player_damage

        WIN.blit(BG, (0, 0))

        # draw text
        lives_label = main_font.render(f"Lives: {lives}", 1, (255, 255, 255))
        level_label = main_font.render(f"Level: {level}", 1, (255, 255, 255))
        speed_label = stats_font.render(f"Speed: {player_vel-4}", 1,
                                        (255, 255, 255))
        damage_label = stats_font.render(f"Damage: {player_damage}", 1,
                                         (255, 255, 255))

        WIN.blit(lives_label, (10, 10))  # Displaying lives
        WIN.blit(
            level_label,
            (WIDTH - level_label.get_width() - 10, 10))  # Displaying level
        WIN.blit(damage_label,
                 (WIDTH - level_label.get_width() + 10, HEIGHT -
                  speed_label.get_height()))  # Displaying player damage
        WIN.blit(speed_label,
                 (WIDTH - speed_label.get_width() - 10, HEIGHT -
                  speed_label.get_height() * 2))  # Displaying player speed

        for item in player_items:
            item.draw(WIN)

        for item in dropped_items:
            item.draw(WIN)

            if collide(item, player):
                dropped_items.remove(item)
                item.y = HEIGHT - item.img.get_height() / 2 - len(
                    player_items) * 40 - 5
                item.x = 3

                if item.bonus != 'damage':
                    item.width, item.height = 70, 70
                else:
                    item.width, item.height = 90, 90

                if item.bonus == 'speed':
                    player_vel += 1
                elif item.bonus == 'damage':
                    player_damage += 5

                player_items.append(item)

        for enemy in enemies:  # Drawing all enemies
            if enemy.health > 0 and enemy.type != 'boss':
                enemy.draw(WIN)
                enemy.healthbar(WIN)
            elif enemy.type == 'boss':
                enemy.draw(WIN)
            else:
                enemies.remove(enemy)

        player.draw(WIN)  # Drawig player
        player.damage = player_damage

        if lost:  # If layer lost
            lost_label = lost_font.render("You Lost!", 1, (255, 255, 255))
            WIN.blit(lost_label, (WIDTH / 2 - lost_label.get_width() / 2, 350))

        if won:  # If plyer won
            won_label = lost_font.render("You Won!", 1, (255, 255, 255))
            WIN.blit(won_label, (WIDTH / 2 - won_label.get_width() / 2, 350))
            player.final_scene()

        pygame.display.update()

    while run:
        clock.tick(FPS)
        redraw_window()

        if lives <= 0 or player.health <= 0:  # That means that player lost
            lost = True
            lost_count += 1

        if killed_bosses == 3:  # That means that player won
            won = True
            lost_count += 1

        if lost:
            if lost_count > FPS * 3:
                run = False
            else:
                continue

        if won:
            if player.final_off_screen:
                run = False

        if len(
                enemies
        ) == 0 and level < level_to_boss and not boss_spawned and not won:  # If player killed all enemies
            level += 1
            wave_length += int(wave_length / 2)
            for i in range(wave_length):  # Adding new enemies
                enemy = Enemy(random.randrange(50, WIDTH - 100),
                              random.randrange(-1300, -100),
                              random.choice(["red", "blue", "green"]),
                              10 + level * 4)
                enemies.append(enemy)
        elif level == level_to_boss and not boss_spawned:  # If it is the boss level
            enemies = []  # Removing all enemies
            enemies.append(
                Boss(WIDTH / 2 - 130, -350, killed_bosses,
                     500 * (killed_bosses + 1)))  # Spawning boss
            boss_spawned = True

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

        keys = pygame.key.get_pressed()
        if keys[pygame.K_a] and player.x - player_vel > 0 and not won:  # left
            player.x -= player_vel
        if keys[pygame.K_d] and player.x + player_vel + player.get_width(
        ) < WIDTH and not won:  # right
            player.x += player_vel
        if keys[pygame.K_w] and player.y - player_vel > 0 and not won:  # up
            player.y -= player_vel
        if keys[pygame.K_s] and player.y + player_vel + player.get_height(
        ) + 15 < HEIGHT and not won:  # down
            player.y += player_vel
        if keys[pygame.K_SPACE] and not won:  # shoot
            player.shoot()

        for enemy in enemies[:]:
            enemy.move(enemy_vel)

            enemy.move_lasers(laser_vel, player)

            if random.randrange(0, 4 * 60) == 1 and enemy.health > 0:
                enemy.shoot()

            if collide(enemy, player):  # If enemy colliding with player
                if enemy.type == 'boss':
                    player.health -= 0.3
                else:
                    player.health -= 10
                    enemies.remove(enemy)
            elif enemy.y + enemy.get_height() > HEIGHT and enemy.type != 'boss':
                lives -= 1
                enemies.remove(enemy)
            elif enemy.type == 'boss' and enemy.killed:
                enemies = []
                if killed_bosses < 2:
                    new_item = Item(enemy.x, enemy.y, killed_bosses)
                    dropped_items.append(new_item)
                    boss_spawned = False
                    level_to_boss += dificulty
                killed_bosses += 1

        player.move_lasers(-laser_vel, enemies)