1
resposta

projeto: amigo secreto

/*
Resumo dos comentários:
- O código gerencia uma lista de participantes para um sorteio de amigo secreto.
- Permite adicionar nomes, reiniciar a lista, e realizar o sorteio garantindo que ninguém tire a si mesmo.
- Utiliza o algoritmo Fisher-Yates para embaralhar a lista.
- Manipula o DOM para mostrar os participantes e o resultado do sorteio.
*/

// Array global que armazena a lista de amigos.
let lista = [];

// Adiciona um "ouvinte" para a tecla Enter no campo de nome.
document.getElementById('nome-amigo').addEventListener('keydown', function(event) {
    // Verifica se a tecla pressionada foi 'Enter'.
    if (event.key === 'Enter') {
        // Impede o comportamento padrão do formulário (recarregar a página).
        event.preventDefault();
        // Chama a função para adicionar o amigo.
        adicionar();
    }
});

// Função para adicionar um amigo.
function adicionar() {
    // Pega o elemento do campo de texto e o nome digitado.
    let nomeInput = document.getElementById('nome-amigo');
    let nome = nomeInput.value;

    // Se o nome estiver vazio, mostra um alerta e para a função.
    if (nome === '') {
        alert('Digite um nome válido!');
        nomeInput.focus(); // Devolve o foco ao campo.
        return; // Para a execução da função.
    }

    // Se o nome já existir na lista, mostra um alerta e para a função.
    if (lista.some(amigo => amigo.toLowerCase() === nome.toLowerCase())) {
        alert('Este nome já está inserido na lista!');
        nomeInput.value = ''; // Limpa o campo para nova tentativa.
        nomeInput.focus();
        return; //para a função
    }

    // Adiciona o nome ao final do array.
    lista.push(nome);

    // Pega o elemento para exibir a lista de amigos.
    let listaAmigosElement = document.getElementById('lista-amigos');
    listaAmigosElement.textContent = lista.join(', '); // .join() cuida das vírgulas automaticamente.

    // Limpa o campo de texto e devolve o foco para ele.
    nomeInput.value = '';
    nomeInput.focus();
}

// Função para reiniciar o sorteio.
function reiniciar() {
    // Esvazia o array de amigos.
    lista = [];
    // Limpa a lista de amigos na tela.
    document.getElementById('lista-amigos').innerHTML = '';
    // Limpa o resultado do sorteio na tela.
    document.getElementById('lista-sorteio').innerHTML = '';
    // Limpa o campo de texto.
    document.getElementById('nome-amigo').value = '';
}

// Função para realizar o sorteio.
function sortear() {
    // Verifica se há participantes suficientes para o sorteio.
    if (lista.length < 3) {
        alert('É necessário ter pelo menos 3 amigos para o sorteio!');
        return;
    }

    // Embaralha a lista de amigos para garantir a aleatoriedade.
    embaralhar(lista);

    // Pega o elemento onde o resultado do sorteio será exibido.
    let listaSorteioElement = document.getElementById('lista-sorteio');
    // Limpa o resultado de sorteios anteriores.
    listaSorteioElement.innerHTML = '';

    // Para cada amigo na lista, sorteia um par.
    for (let i = 0; i < lista.length; i++) {
        // O amigo sorteado é o próximo da lista.
        // Se for o último, ele sorteia o primeiro, fechando o ciclo.
        let amigoSecretoIndex = (i + 1) % lista.length;
        let amigoSecreto = lista[amigoSecretoIndex];

        // Exibe o par na tela.
        listaSorteioElement.innerHTML += `${lista[i]} ==> ${amigoSecreto}<br>`;
    }
}

// Função para embaralhar os elementos de um array (algoritmo de Fisher-Yates).
function embaralhar(array) {
    // Percorre o array de trás para frente.
    for (let i = array.length - 1; i > 0; i--) {
        // Escolhe um índice aleatório entre 0 e a posição atual.
        let j = Math.floor(Math.random() * (i + 1));
        // Troca o elemento atual com o elemento do índice aleatório.
        [array[i], array[j]] = [array[j], array[i]];
    }
    return array;
}

// Função para converter todos os nomes da lista para letras minúsculas.
// OBS: Esta função não está sendo usada no código.
function listaParaLowercase() {
    lista = lista.map(nome => nome.toLowerCase());
}
1 resposta

Bom dia, Luís! Tudo bem?

Parabéns pela resolução da atividade!

Observei que você explorou o uso de event listeners com addEventListener para tornar a interface mais interativa, utilizou muito bem o algoritmo de embaralhamento Fisher-Yates para garantir aleatoriedade no sorteio e ainda compreendeu a importância do controle de fluxo e validação de dados para evitar duplicações e garantir uma experiência segura ao usuário.

Permaneça postando as suas soluções, com certeza isso ajudará outros estudantes e tem grande relevância para o fórum.

Fico à disposição! E se precisar, conte sempre com o apoio do fórum.

Abraço e bons estudos!

AluraConte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!