示例#1
0
 def create_level(self, level):
     height = len(level)
     width = max(len(string) for string in level)
     self.level_width, self.level_height = width * BLOCK_SIZE, height * BLOCK_SIZE
     self.root = pygame.Surface((width * BLOCK_SIZE, height * BLOCK_SIZE))
     all(width == len(row) for row in level)
     objects = pygame.sprite.Group()
     x = y = 0
     for row in level:
         for col in row:
             if col == '-':
                 objects.add(Ground(x, y))
             elif col == '#':
                 objects.add(Stone(x, y))
             elif col == 't':
                 objects.add(Trap(x, y))
             elif col == 'p':
                 self.player = Player(x, y)
             elif col == 'e':
                 objects.add(Enemy(x, y))
             elif col == 'T':
                 objects.add(Target(x, y))
             elif col == 'u':
                 objects.add(Upper(x, y))
             x += BLOCK_SIZE
         y += BLOCK_SIZE
         x = 0
     self.camera = Camera(self.player,
                          (width * BLOCK_SIZE, height * BLOCK_SIZE),
                          self.resolution)
     return objects
示例#2
0
    def __init__(self):
        super().__init__()

        # Load the screen for the current stage
        state = Config.state()
        entities = (Player(Colors.VIR),
                    Enemy(state['color'], state['shoot_delay']))
        self.screen_intro = ScreenIntro(entities, state['balls'])
        if Config.level == 4:
            self.screen_play = ScreenHardcore(entities, state['balls'],
                                              state['max_balls'],
                                              state['max_score'])
        else:
            self.screen_play = ScreenNormal(entities, state['balls'],
                                            state['max_balls'],
                                            state['max_score'])

        # Set the current screen
        self.current_screen = self.screen_intro

        # Pause sound
        self.snd_click = SoundManager.load_sound('snd_click.wav')

        # Play the background music
        SoundManager.load_music('bgm_stage1.ogg')
示例#3
0
    def __init__(self, update=True):
        super().__init__()

        # Repeat cutscene
        if not update:
            Cutscene.current_cutscene -= 1
            ScreenDialog.current_dialog -= 1
            SoundManager.load_music('bgm_dialog.ogg')

        # Change level
        if Cutscene.current_cutscene in (4, 6, 8, 11, 14, 17):
            Config.level += 1

        # Background
        state = Config.state()
        self.background = ScreenBackground(
            (Player(Colors.VIR), Enemy(state['color'], state['shoot_delay'])))

        # Transition
        self.transition = False
        self.transition_delay = 50
        self.snd_transition = SoundManager.load_sound('snd_transition1.wav')

        # Set the current screen
        if Cutscene.current_cutscene in (1, 4, 8, 11, 14, 17):
            self.current_screen = ScreenNarrator()
        elif Cutscene.current_cutscene in (3, 6, 7, 10, 13, 16, 19):
            self.current_screen = ScreenDialog()
            SoundManager.load_music('bgm_dialog.ogg')
        else:
            self.current_screen = ScreenDialog()
示例#4
0
 def spawn_wave(self):
     for i in range(self.wave_length):
         x = random.randrange(100, self.window_width - 100)
         y = random.randrange(-1500, -100)
         color = random.choice(['red', 'green', 'blue'])
         enemy = Enemy(x, y, self.enemy_velocity, self.laser_velocity,
                       color)
         self.enemies.append(enemy)
示例#5
0
 def __init__(self):
     self.score = 0
     self.graphic = []
     self.objects = []
     self.shifty = 0
     self.player = Player(20, 75, game=self)
     for i in range(0, 20):
         for j in range(1, 3):
             self.objects.append(Enemy(i * 10, j * 10, game=self))
     for i in range(0, 40):
         self.graphic.append([])
         for j in range(0, 80):
             if ((j) % 2 == 0 and i == self.shifty):
                 self.graphic[i].append("A")
             else:
                 self.graphic[i].append(" ")
示例#6
0
文件: menu.py 项目: TheLokin/Kabalayn
    def __init__(self, victory=False):
        super().__init__()

        # Background
        state = Config.state()
        self.background = ScreenBackground(
            (Player(Colors.VIR), Enemy(state['color'], state['shoot_delay'])))

        # Screens
        self.screen_menu = ScreenMenu(self)
        self.screen_options = ScreenOptions(self)

        # Set the current screen
        self.current_screen = self.screen_menu

        # Play the background music
        if victory:
            SoundManager.load_music('bgm_victory.ogg')
        else:
            SoundManager.load_music('bgm_menu.ogg')
示例#7
0
        heart.draw_rect(screen)
        heart.go()

    # генерация объектов
    count += 1
    if count % max(
            5, 30 - count // 240
    ) == 0:  # со временем враги будут появляться быстрее, но не быстрее, 5
        # генерация врага со случайными характеристиками
        enemy_type = types[randint(0, 2)]
        enemy_type[0], enemy_type[1], enemy_type[4], enemy_type[5] = randint(0, WIDTH - 100),\
                                                                     randint(0, HEIGHT // 2),\
                                                                     randint(-5, 5),\
                                                                     randint(0, 5)
        enemy = Enemy(enemy_type[0], enemy_type[1], enemy_type[2],
                      enemy_type[3], enemy_type[4], enemy_type[5],
                      enemy_type[6], enemy_type[7], enemy_type[8])
        # добавление врага в список объектов
        queue.append(enemy)

    # обработка коллизии
    # не важно как, оно работает
    for enem in queue:
        # проверка жив ли враг и находится ли он на экране
        if (not enem.is_alive() or enem.get_x() < -enem.get_size_x()
                or enem.get_x() > WIDTH or enem.get_y() > HEIGHT
                or enem.get_y() < -enem.get_size_y()):
            # удаление из списка если нет
            queue.remove(enem)

        # действия врага
示例#8
0
        current_time = pygame.time.get_ticks()
        delta_time = current_time - start_time
        if delta_time >= plane_frequency:
            if level == 1:
                type = 1
            elif level == 2:
                type = 2
            elif level == 3:
                type = 3
            elif level == 4:
                type = random.randint(4, 5)
            elif level == 5:
                type = random.randint(1, 5)

            x = random.randint(10, WIDTH - 100)
            e = Enemy(x, -150, type)
            enemy_group.add(e)
            start_time = current_time

        if plane_destroy_count:
            if plane_destroy_count % 5 == 0 and level < 5:
                level += 1
                plane_destroy_count = 0

        p.fuel -= 0.05
        bg.update(1)
        win.blit(clouds_img, (0, 70))

        p.update(moving_left, moving_right, explosion_group)
        p.draw(win)
示例#9
0
                rb_crash = False

                p.rect.y = yoffset + HEIGHT // 2

    if not restart_menu and not main_menu:
        bg.update()
        draw.top_black_bar()
        draw.replay_black_bar()
        draw.border()

        if counter.count > 0:
            counter.update()
            if counter.count == 0:
                bg.move = True

                e = Enemy(win)
                enemy_group = pygame.sprite.Group()
                enemy_group.add(e)

                rb = Roadblock(win)
                roadblock_group = pygame.sprite.Group()
                roadblock_group.add(rb)

                coin = Coin(win)
                coin_group = pygame.sprite.Group()
                coin_group.add(coin)
        else:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    running = False
示例#10
0
from manager import Manager
import time

#set up manager
mgr = Manager()

#set up rooms
kitchen = Room("Kitchen", "A dank and dirty room buzzing with flies.")
dining_room = Room("Dining Room", "a room for eating")
ballroom = Room("Ballroom", "a room for dancing")

kitchen.link_room(dining_room, "south")

dining_room.link_room(kitchen, "north")
dining_room.link_room(ballroom, "west")

ballroom.link_room(dining_room, "east")

kitchen.set_subroom("Stove",
                    "There is an old saucepan on the hob, it's greasy")

mgr.set_current_room(kitchen)

#create characters
dave = Enemy("Dave", "A smelly zombie")
dave.set_conversation("Rahh, I what to eat you!")
dave.set_weakness("cheese")

potion = Health_potion("potion", kitchen.subrooms.get("Stove"), "description")

mgr.mainloop()
示例#11
0
 async def gameloop(self):
     if random.randint(0, 4) == 0:
         self.objects.append(Enemy(30, 20, game=self))
     row = 0
     toprint = ""
     for i in range(0, 40):
         for j in range(0, 80):
             if ((j) % 2 == 0 and i == self.shifty):
                 self.graphic[i][j] = "A"
             elif self.graphic[i][j] == "{" or self.graphic[i][j] == "}":
                 self.graphic[i][j] = "o"
             else:
                 self.graphic[i][j] = "'"
     #after initialization
     #for all the self.objects, render their position
     for idx, obj in enumerate(self.objects):
         render = obj.render()
         if (obj.type == "bullet" and type(obj.parent) == Player):
             for tracy, row in enumerate(render):
                 for tracx, c in enumerate(row):
                     if (self.graphic[(obj.y + tracy) %
                                      40][(obj.x - 1 + tracx) % 80] != "'"):
                         for i in range(0, 2):
                             for j in range(0, 2):
                                 self.graphic[(obj.y+i)%40][(obj.x+j)%80] =\
                                     random.choice(['{','}'])
                     if(self.graphic[(obj.y+tracy)%40][(obj.x-1+tracx)%80]=="{" or\
                        self.graphic[(obj.y+tracy)%40][(obj.x-1+tracx)%80]=="}"):
                         self.objects[idx].state = "destroyed"
                     else:
                         self.graphic[(obj.y - 1 + tracy) %
                                      40][(obj.x - 1 + tracx) % 80] = c
         elif (obj.type == "enemy"):
             if random.randint(0, 20) == 0:
                 obj.shoot(direction=1, velocity=2)
             for tracy, row in enumerate(render):
                 for tracx, c in enumerate(row):
                     if (self.graphic[(obj.y - 1 + tracy) %
                                      40][(obj.x - 3 + tracx) % 80] == "o"):
                         destroyed = obj.damage()
                         if (destroyed):
                             self.score += 100
                     else:
                         self.graphic[(obj.y - 1 + tracy) %
                                      40][(obj.x - 3 + tracx) % 80] = c
         else:
             for tracy, row in enumerate(render):
                 for tracx, c in enumerate(row):
                     if(self.graphic[(obj.y+tracy)%40][(obj.x-1+tracx)%80]=="{" or\
                        self.graphic[(obj.y+tracy)%40][(obj.x-1+tracx)%80]=="}"):
                         self.objects[idx].state = "destroyed"
                     else:
                         self.graphic[(obj.y - 1 + tracy) %
                                      40][(obj.x - 1 + tracx) % 80] = c
         if (obj.state == "destroyed"):
             self.objects.remove(obj)
     render = self.player.render()
     for tracy, row in enumerate(render):
         for tracx, c in enumerate(row):
             if (self.graphic[(self.player.y - 1 + tracy) %
                              40][(self.player.x - 2 + tracx) % 80]
                     in ["{", "}", "[", "]"]):
                 self.player.state = "destroyed"
             else:
                 self.graphic[(self.player.y - 1 + tracy) %
                              40][(self.player.x - 2 + tracx) % 80] = c
     toprint += "score: " + str(self.score)
     toprint += "\n"
     toprint += "\n"
     if self.player.state != "destroyed":
         for y in range(0, 40):
             toprint += "\n"
             for x in range(0, 80):
                 toprint += self.graphic[y][x]
         call(['clear'])
         print(toprint)
         print("player:", self.player.x, self.player.y, self.player.state)
         time.sleep(0.1)
     else:
         while (True):
             for y in range(0, 40):
                 toprint += "\n"
                 for x in range(0, 80):
                     toprint += self.graphic[y][x]
             call(['clear'])
             print(toprint)
             print("player:", self.player.x, self.player.y,
                   self.player.state)
             print("GAME OVER!!!")
             time.sleep(0.1)
def game_screen(window, save_data):
    game_clock = pygame.time.Clock()

    assets = load_assets()  # Carrega todos os assets

    # Criamos um dicionário com todos os sprite groups
    sprite_groups = {}
    # Grupo com todos os sprites
    sprites = pygame.sprite.Group()
    sprite_groups['sprites'] = sprites
    # Grupo com as balas atiradas pelo jogador
    player_bullets = pygame.sprite.Group()
    sprite_groups['player_bullets'] = player_bullets
    # Grupo com todos os inimigos
    enemies = pygame.sprite.Group()
    sprite_groups['enemies'] = enemies
    # Grupo com as nuvens
    clouds = pygame.sprite.Group()
    sprite_groups['clouds'] = clouds

    # Criamos o jogador
    player = Player(sprite_groups, assets, save_data)
    sprites.add(player)
    player_speed = 8
    firing = False

    # Criamos os inimigos e definimos suas variáveis
    enemy_count = 0
    base_timer = 6500
    enemy_timer = base_timer
    last_spawn = pygame.time.get_ticks()
    for i in range(3):
        e = Enemy(assets, ENEMY_CONFIG)
        enemies.add(e)
        sprites.add(e)
        enemy_count += 1

    # Variáveis do jogo
    score = 0  # Distância percorrida
    lscore = 0  # Igual ao score, mas volta a 0 quando ganha uma vida extra
    coinframe = 0  # Frame de animação do contador de moedas
    coins = save_data['coins']
    heartframe = 0  # Frame de animação do contador de vidas
    lives = 3
    keys_pressed = {}  # Quais teclas já foram pressionadas
    extralifei = 0
    difficulty = 6
    cloudtimer = 0  # Timer de geração de nuvens
    cloudtimetocreate = 200

    # Prepara a tela
    window.fill((125, 190, 215))
    sprites.draw(window)
    pygame.display.update()

    # Inicia a musica
    pygame.mixer.music.play(loops=-1)
    pygame.mixer.music.set_volume(0.25)

    state = 'GAME'
    Running = True
    while Running:
        while state == 'GAME':
            game_clock.tick(FPS)  # Define limite de frames por segundo
            now = pygame.time.get_ticks()  # Ticks percorridos até o loop atual

            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    # Sai do loop do jogo e retorna para o launcher
                    state = 'QUIT'
                    Running = False
                if event.type == pygame.KEYDOWN:
                    keys_pressed[
                        event.
                        key] = True  # Adiciona a tecla pressionada ao dicionário
                    if event.key == pygame.K_UP:
                        player.speedy += -player_speed
                    if event.key == pygame.K_DOWN:
                        player.speedy += player_speed
                    if event.key == pygame.K_RIGHT:
                        player.speedx += player_speed
                    if event.key == pygame.K_LEFT:
                        player.speedx += -player_speed
                    if event.key == pygame.K_SPACE:
                        firing = True
                if event.type == pygame.KEYUP:
                    if event.key in keys_pressed and keys_pressed[event.key]:
                        # Se a tecla existir no dicionário subtraimos a velocidade ganha ao pressionar a tecla
                        # Se a tecla não estiver no dicionário, não modificamos a velocidade para evitar bugs
                        if event.key == pygame.K_UP:
                            player.speedy += player_speed
                        if event.key == pygame.K_RIGHT:
                            player.speedx += -player_speed
                        if event.key == pygame.K_LEFT:
                            player.speedx += player_speed
                        if event.key == pygame.K_DOWN:
                            player.speedy += -player_speed
                        if event.key == pygame.K_SPACE:
                            firing = False
            if firing == True:
                player.shoot()

            # Cria nuvens aleatóriamente
            cloudtimer += 1
            if cloudtimer >= cloudtimetocreate:
                speed = random.randint(4, 5)
                centery = random.randint(30, SCR_HEIGHT - 30)
                new_cloud = Cloud(assets, centery, speed)
                clouds.add(new_cloud)
                cloudtimer = 0
                cloudtimetocreate = random.randint(50, 300)

            # Colisao entre tiros e inimigos
            bullet_hits = pygame.sprite.groupcollide(
                enemies, player_bullets, False, True,
                pygame.sprite.collide_mask)
            for i in bullet_hits:
                i.destroy()
                enemy_count -= 1
                coins += 1

            # Colisao entre Player e inimigos
            if player.blink == False:
                player_hits = pygame.sprite.spritecollide(
                    player, enemies, True, pygame.sprite.collide_mask)
                if len(player_hits) > 0:
                    lives -= 1
                    # Quando tomar dano, o jogador pisca por alguns segundos
                    player.blink = True
                    player.blink_timer = 0
            elif player.blink == True:
                player.blink_timer += 1

            enemy_timer = base_timer - score * difficulty  # Reduz o timer dos inimigos com o tempo, com a dificulade controlando a diferença
            if enemy_timer < 100:
                # Se o timer ficaria menor que 100 ticks, retorna a 100 para evitar timers negativos
                enemy_timer = 100

            # Cria novos inimigos, desde que não passe do limite
            if enemy_count <= 40:
                if (now - last_spawn) > enemy_timer:
                    for i in range(3):
                        # Cria novos inimigos
                        e = Enemy(assets, ENEMY_CONFIG)
                        enemies.add(e)
                        sprites.add(e)
                        enemy_count += 1
                    last_spawn = now

            # Update das nuvens, sprites e background
            clouds.update()
            sprites.update()
            window.fill((125, 190, 215))

            # Aumenta score e lscore a cada tick
            score += 0.2
            lscore += 0.2

            # Display o score
            score_num = assets[FONT].render(f"{score:.0f}", True,
                                            (255, 255, 255))
            score_rect = score_num.get_rect()
            score_rect.topright = (SCR_WIDTH - 20, 40)
            window.blit(score_num, score_rect)

            # Animação da moeda
            coinframe += 1
            canimframe = coinframe // 10
            ccoin = assets['coin_anim'][canimframe]
            coin_rect = ccoin.get_rect()
            coin_rect.topleft = (10, 10)
            window.blit(assets['coin_anim'][canimframe], (10, 10))
            if coinframe >= 58:
                coinframe = 0

            # Display animação e valor das moedas
            coin_title = assets[FONT].render('X {}'.format(str(coins)), True,
                                             (255, 255, 255))
            title_rect = coin_title.get_rect()
            title_rect.topleft = (55, 18)
            window.blit(coin_title, title_rect)

            # Vida extra a cada 500 pontos
            if lscore > 500:
                lives += 1
                lscore = 0
                extralifei = 1

            # Aviso de vida extra por 2 segundos
            if extralifei > 0:
                extralifei += 1
                extralife_title = assets['FONT3'].render(
                    'vida extra!', True, (255, 50, 50))
                title_rect = extralife_title.get_rect()
                title_rect.center = (SCR_WIDTH / 2, 60)
                window.blit(extralife_title, title_rect)
                if extralifei > 120:
                    extralifei = 0

            # Animação vidas
            heartframe += 1
            hanimframe = heartframe // 10
            cheart = assets['heart_anim'][hanimframe]
            heart_rect = cheart.get_rect()
            heart_rect.midtop = (180, 18)
            window.blit(assets['heart_anim'][hanimframe], heart_rect)
            if heartframe >= 39:
                heartframe = 0
            # Display animação e número de vidas
            score_title = assets[FONT].render("SCORE", True, (255, 255, 255))
            title_rect = score_title.get_rect()
            title_rect.topright = (SCR_WIDTH - 20, 20)
            window.blit(score_title, title_rect)

            text_surface = assets[FONT].render('X {}'.format(lives), True,
                                               (255, 255, 255))
            text_rect = text_surface.get_rect()
            text_rect.topleft = (215, 18)
            window.blit(text_surface, text_rect)

            # Checa se morreu (acabaram as vidas), encerra o jogo, inicia Loja
            if lives <= 0:
                state = "DEAD"

                # Muito importante redefinir essas variáveis aos valores iniciais
                # Se não forem reiniciadas, causa diversos bugs
                keys_pressed = {}
                firing = False
                player.speedx = 0
                player.speedy = 0
                lives = 0
                enemy_count = 0
                for i in enemies:
                    i.destroy()

                pygame.mixer.music.fadeout(2900)  # Transiciona a música
                # Cria tela de morte
                if score > save_data['high_score']:
                    save_data['high_score'] = score
                text_surface = assets['FONT4'].render('Perdeu', True,
                                                      (255, 30, 30))
                text_rect = text_surface.get_rect()
                text_rect.center = (SCR_WIDTH / 2, SCR_HEIGHT / 2)
                window.blit(text_surface, text_rect)
                pygame.display.update()

                # Espera 2 segundos, troca de música
                time.sleep(2)
                pygame.mixer.music.load(path.join(SND, 'Menumusic.mp3'))
                pygame.mixer.music.set_volume(0.25)
                pygame.mixer.music.play(loops=-1)

            # Desenha nuvens e sprites, atualiza o display
            clouds.draw(window)
            sprites.draw(window)
            pygame.display.update()

        while state == "DEAD":
            # Roda a tela de loja/menu

            game_clock.tick(FPS)  # Limite de FPS

            window.blit(assets['BGLoja'], (0, 0))  # Desenha o background
            # Animação e número de moedas
            coinframe += 1
            canimframe = coinframe // 10
            ccoin = assets['coin_anim'][canimframe]
            ccoin_rect = ccoin.get_rect()
            ccoin_rect.midleft = (50, 275)
            window.blit(assets['coin_anim'][canimframe], ccoin_rect)
            if coinframe >= 58:
                coinframe = 0
            coin_title = assets['FONT2'].render('X {}'.format(str(coins)),
                                                True, (255, 255, 255))
            title_rect = coin_title.get_rect()
            title_rect.midleft = (100, 280)
            window.blit(coin_title, title_rect)

            # Display score dessa vida
            text_surface = assets['FONT2'].render(
                'score: {:.0f}'.format(score), True, (255, 255, 255))
            text_rect = text_surface.get_rect()
            text_rect.midleft = (900, 190)
            window.blit(text_surface, text_rect)
            # Display highscore
            text_surface = assets['FONT2'].render(
                'high score: {:.0f}'.format(save_data['high_score']), True,
                (255, 255, 255))
            text_rect = text_surface.get_rect()
            text_rect.midleft = (900, 220)
            window.blit(text_surface, text_rect)

            # Escreve "Aperte R para jogar"
            text_surface = assets['FONT3'].render('Aperte R para jogar', True,
                                                  (255, 255, 255))
            text_rect = text_surface.get_rect()
            text_rect.bottomright = (SCR_WIDTH - 25, SCR_HEIGHT - 15)
            window.blit(text_surface, text_rect)

            # Display upgrade de vidas
            text_surface = assets['FONT2'].render('1 - VIDA EXTRA [10 moedas]',
                                                  True, (255, 255, 255))
            text_rect = text_surface.get_rect()
            text_rect.topleft = (60, 340)
            window.blit(text_surface, text_rect)
            text_surface = assets[FONT].render(
                'adiciona uma vida (vidas: {})'.format(lives + 3), True,
                (255, 255, 255))
            text_rect = text_surface.get_rect()
            text_rect.topleft = (70, 370)
            window.blit(text_surface, text_rect)

            # Display upgrade de dificuldade
            text_surface = assets['FONT2'].render('2 - FREIO ABS [15 moedas]',
                                                  True, (255, 255, 255))
            text_rect = text_surface.get_rect()
            text_rect.topleft = (60, 420)
            window.blit(text_surface, text_rect)
            text_surface = assets[FONT].render(
                'diminui a aceleracao dos inimigos (max quatro compras)', True,
                (255, 255, 255))
            text_rect = text_surface.get_rect()
            text_rect.topleft = (70, 450)
            window.blit(text_surface, text_rect)

            # Display upgrade de tiro
            text_surface = assets['FONT2'].render(
                '3 - TREINAMENTO DE UZI [6 moedas]', True, (255, 255, 255))
            text_rect = text_surface.get_rect()
            text_rect.topleft = (60, 500)
            window.blit(text_surface, text_rect)
            text_surface = assets[FONT].render(
                'levemente diminui o tempo para atirar (max sete compras)',
                True, (255, 255, 255))
            text_rect = text_surface.get_rect()
            text_rect.topleft = (70, 530)
            window.blit(text_surface, text_rect)

            # Update na tela
            pygame.display.update()

            # Trata eventos
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    state = 'QUIT'
                    Running = False
                if event.type == pygame.KEYDOWN:
                    # R volta ao jogo
                    if event.key == pygame.K_r:
                        state = "GAME"
                        pygame.mixer.music.load(path.join(
                            SND, 'Gamemusic.mp3'))
                        pygame.mixer.music.set_volume(0.25)
                        pygame.mixer.music.play(loops=-1)
                        keys_pressed = {}
                        player.rect.left = 90
                        player.rect.centery = SCR_HEIGHT / 2
                        player.speedx = 0
                        player.speedy = 0
                        lives += 3
                        score = 0
                        lscore = 0
                    # Tecla 1 compra upgrade de vidas
                    if event.key == pygame.K_1:
                        if coins >= 10:
                            lives += 1
                            coins -= 10
                    # Tecla 2 compra upgrade de dificuldade
                    if event.key == pygame.K_2:
                        if coins >= 15 and save_data['difficulty'] > 2:
                            save_data['difficulty'] -= 1
                            coins -= 15
                    # Tecla 3 compra upgrade de tiros
                    if event.key == pygame.K_3:
                        if coins >= 6 and save_data['shoot_speed'] < 7:
                            player.shoot_ticks -= 100
                            save_data['shoot_speed'] += 1
                            coins -= 6

    save_data[
        'coins'] = coins  # Atualiza as moedas totais que o jogador possui
    return save_data  # Retorna os novos valores para o save