import random
import time
import numpy as np
try:
    import sounddevice as sd
except ImportError:
    print("Biblioteca 'sounddevice' não encontrada.")
    print("Por favor, instale-a com o comando: pip install sounddevice numpy")
    exit()

# --- Configuração do Jogo ---
PONTOS = 0
TOTAL_DE_RODADAS = 10
TAXA_DE_AMOSTRAGEM = 44100
DURACAO_SEGUNDOS = 1.5
NUM_LA_OBRIGATORIO = 4
NOTA_ALVO = 'Lá'

# Dicionário de referência de frequências
FREQUENCIAS_BASE_OITAVA_4 = {
    'Dó': 261.63, 'Ré': 293.66, 'Mi': 329.63, 'Fá': 349.23,
    'Sol': 392.00, 'Lá': 440.00, 'Si': 493.88
}
OITAVAS_DISPONIVEIS = [3, 4, 5]

# Lógica para gerar a sequência de notas antes do jogo
outras_notas = [nota for nota in FREQUENCIAS_BASE_OITAVA_4.keys() if nota != NOTA_ALVO]
sequencia_de_rodadas = [NOTA_ALVO] * NUM_LA_OBRIGATORIO
num_outras_notas = TOTAL_DE_RODADAS - NUM_LA_OBRIGATORIO
sequencia_de_rodadas.extend(random.choices(outras_notas, k=num_outras_notas))
random.shuffle(sequencia_de_rodadas)

# Função para tocar o som
def tocar(frequencia):
    print("Ouvindo...")
    tempo = np.linspace(0, DURACAO_SEGUNDOS, int(TAXA_DE_AMOSTRAGEM * DURACAO_SEGUNDOS), False)
    tom = np.sin(frequencia * tempo * 2 * np.pi)
    tom /= np.max(np.abs(tom))
    sd.play(tom, TAXA_DE_AMOSTRAGEM)
    sd.wait()
    time.sleep(1.0)

# --- Início do Jogo ---
print("--- Jogo do Ouvido (Risco vs. Recompensa) ---")
print("REGRAS: Ganhe +1 ponto ao acertar o LÁ. Perca -1 ponto se deixar um LÁ passar.")
print("Acertar que uma nota NÃO é Lá não dá nem tira pontos.")
print("-" * 60)
input("Tudo pronto? Pressione ENTER para começar...")

# --- Loop Principal do Jogo ---
for rodada_atual, nota_sorteada_nome in enumerate(sequencia_de_rodadas, 1):
    print(f"\n--- Rodada {rodada_atual}/{TOTAL_DE_RODADAS} ---")

    oitava_sorteada = random.choice(OITAVAS_DISPONIVEIS)
    freq_base = FREQUENCIAS_BASE_OITAVA_4[nota_sorteada_nome]
    frequencia_final = freq_base * (2 ** (oitava_sorteada - 4))
    
    tocar(frequencia_final)

    resposta_usuario = ""
    while resposta_usuario not in ['sim', 'não', 's', 'n']:
        resposta_usuario = input("A nota tocada foi um LÁ? (sim/não): ").lower().strip()
        if resposta_usuario in ['s', 'sim']: resposta_usuario = 'sim'
        elif resposta_usuario in ['n', 'não']: resposta_usuario = 'não'
        else: print("Resposta inválida.")

    # --- LÓGICA DE PONTUAÇÃO DE RISCO MODIFICADA ---
    
    # Primeiro, verificamos se a nota era o alvo (Lá)
    if nota_sorteada_nome == NOTA_ALVO:
        if resposta_usuario == 'sim':
            print("EXCELENTE! Você identificou o Lá! +1 Ponto. :)")
            PONTOS += 1
        else: # O usuário disse 'não' para um Lá
            print("ERRO GRAVE! Era um Lá e você deixou passar. -1 Ponto. :(")
            PONTOS -= 1
            
    # Se a nota NÃO era o alvo
    else:
        if resposta_usuario == 'não':
            print("Correto. Realmente não era um Lá. (Sem alteração na pontuação)")
        else: # O usuário disse 'sim' para uma nota que não era Lá
            print("Incorreto. Você achou que era um Lá, mas não era. (Sem alteração na pontuação)")
    
    # Sempre revela a nota correta no final da rodada.
    print(f"-> A nota tocada foi: {nota_sorteada_nome}{oitava_sorteada}")
    
    print(f"Sua Pontuação atual: {PONTOS}")
    if rodada_atual < TOTAL_DE_RODADAS:
        input("Pressione ENTER para a próxima rodada...")

# --- Fim de Jogo ---
print("\n" + "=" * 60)
print("FIM DE JOGO!")
print(f"Sua pontuação final de 'Caçador de Lás' é: {PONTOS} pontos.")
if PONTOS == NUM_LA_OBRIGATORIO:
    print("PERFEITO! Você não deixou nenhum Lá escapar e não se enganou!")
elif PONTOS > 0:
    print("Ótimo trabalho! Você tem uma boa sensibilidade para a nota alvo.")
else:
    print("Cuidado com os erros! Lembre-se que deixar um Lá passar custa caro. Continue treinando!")