1
resposta

[Projeto] Projeto Amigo Secreto - pratica individual de lógica algorítmica

Fiz o projeto de amigo secreto direto da aula de apresentação, dessa vez não adicionei nenhuma função além por não ter tido nenhuma grande ideia, aceito sugestões. De qualquer maneira, a mensagem que quero passar é de, caso recebam uma demanda de maneira visual, como os professores geram na aula de apresentação, observem os detalhes. Fiz o código e descobri várias coisas testando, como a maneira de fazer as "setinhas" entre cada nome, que eu testei e deu certo como imaginei, ou à maneira da ultima linha de sorteio ter o padrão de se repetir, sendo o ultimo nome com o primeiro, percebi isso observando a execução na aula de apresentação, e liguei os pontos após ter tido erros ao tentar fazer da maneira usual. Errar e testar fazem parte do processo, e pesquisar também, acessei a documentação para verificar funções como o embaralhamento de Arrays e a tag br para exibir linhas com quebra no html. Deixo meu código abaixo para visualização mais rápida que pelo GitHub:

//Array para armazenas os nomes adicionados 
let arrayNomes =[];

function adicionar() { //Botão adicionar
    //Recebe e confere os valores dos Campos e armazena na Array 
    let nome = document.getElementById('nome-amigo').value;
    if (nome!==''){
       if (!arrayNomes.includes(` ${nome}`)){
        arrayNomes.push(` ${nome}`);
        let amigosIncluidos=document.getElementById('lista-amigos');
        amigosIncluidos.innerHTML=`${arrayNomes}`; 
        
        } else {
            alert(`${nome} já foi adicionado à lista.`);
        }
    } else {
        alert ('Voce deve adicionar algum nome');
    }
    //Após preencher um nome, deixa o espaço livre para inserir o próximo
    limparCampos('nome-amigo'); 
}

function reiniciar() { //Botão reiniciar, limpa os dados armazenados e a tela
    arrayNomes=[];
    let amigosIncluidos=document.getElementById('lista-amigos');
    amigosIncluidos.innerHTML=`${arrayNomes}`;
    let sorteioFinal = document.getElementById('lista-sorteio');
    sorteioFinal.innerHTML = '';
}

function sortear() { //Botão sortear
    //Verifica se há 2 ou mais nomes, em quantidade par 
    if (arrayNomes.length%2||arrayNomes.length<=2) {
        alert ('Voce não pode sortear com essa quantidade de nomes.');
    } else {
        //Embaralha os nomes armazenados na Array
        for (let i = 0; i < arrayNomes.length; i++) {
        const j = Math.floor(Math.random() * (i + 1));
        [arrayNomes[i], arrayNomes[j]] = [arrayNomes[j], arrayNomes[i]];
        }

        //Limpa a tela para caso a pessoa faça varios sorteios
        let sorteioFinal = document.getElementById('lista-sorteio');
        sorteioFinal.innerHTML = '';

        //Loop para pegar a Array embaralhada e colocar na tela cada resultado individual
        let contador = 0
        while (contador < arrayNomes.length-1) {
            let sorteioFinal=document.getElementById('lista-sorteio');
            sorteioFinal.innerHTML+=`<br>${arrayNomes[contador]} --> ${arrayNomes[contador+1]}</br>`; 
            contador++;
        }
        
        //Medida para mostrar corretamente a ultima linha de sorteio sem repetição
        sorteioFinal=document.getElementById('lista-sorteio');
        sorteioFinal.innerHTML+= `<br>${arrayNomes[arrayNomes.length-1]} --> ${arrayNomes[0]}</br>`;
    }
}

function limparCampos(id) {
    document.getElementById(`${id}`).value='';
}
1 resposta

Oi, Otavio! Como vai?

Sensacional a sua abordagem!

Você tocou em pontos fundamentais da jornada de aprendizado em programação: observação, teste e pesquisa. Tentar replicar um comportamento visual apenas observando ("engenharia reversa") é um exercício poderosíssimo para desenvolver lógica.

Seu código está muito bem estruturado e a lógica de embaralhamento manual (o algoritmo Fisher-Yates) ficou excelente. O fechamento do ciclo (último tirando o primeiro) também está corretíssimo para garantir que ninguém fique sem presente.

Continue com essa mentalidade investigativa, ela vai te levar longe!

Bons estudos!

Sucesso

Imagem da comunidade