1
resposta

Resolução de Atividades - 05 Faça como eu fiz: lógica para embaralhar a lista de amigos

Oie, boa tarde! Há algum tempo atrás, eu criei um código, só que estava dando muitos problemas, então decidi recriar do zero com outra lógica. O osrteio ficou bastante diferente do algoritmo do professor -- eu não utilizei o Fisher-Yates. A única parte é que ele não imprime os sorteados separados por linhas, mas fora isso, está quase completo:

let amigosIncluidos = []; 
let campoAmigosIncluidos = document.getElementById ("lista-amigos");
let amigosSorteados = [];
let campoSorteados = document.getElementById ("lista-sorteio");
let campoNomeDigitado = document.getElementById ("nome-amigo");

function adicionar() {

    let nomeDigitado = document.getElementById ("nome-amigo").value;
    
    amigosIncluidos.push (` ${nomeDigitado}`);
    campoAmigosIncluidos.textContent = amigosIncluidos; 

    campoNomeDigitado.value = "";
}

function sortear() {

    amigosSorteados = [];

    let numeroParticipantes = amigosIncluidos.length;

    for (n = 0; n <= numeroParticipantes - 1; n++) {

        let numeroSorteado = obterNumeroAleatorio (0, numeroParticipantes - 1);


        if (amigosSorteados.includes (amigosIncluidos[numeroSorteado])) {

            while (amigosSorteados.includes (amigosIncluidos[numeroSorteado])) {

                numeroSorteado = obterNumeroAleatorio (0, numeroParticipantes - 1);
            }
        }

        if (amigosIncluidos[n] == amigosIncluidos[numeroSorteado]) {

            while (amigosIncluidos[n] == amigosIncluidos[numeroSorteado]) {

                numeroSorteado = obterNumeroAleatorio (0, numeroParticipantes - 1);
            }
        }

        amigosSorteados[n] = amigosIncluidos[numeroSorteado];    
    }

    // Dessa parte para frente, o problema é que ele não separa por linhas as pessoas sorteadas. Não está errado, mas também não está 100% certo.

    let listaFinal = [];

    for (n = 0; n <= numeroParticipantes - 1; n++) {

        listaFinal[n] = `${amigosIncluidos[n]} -> ${amigosSorteados[n]}`;
    }

    campoSorteados.textContent = listaFinal;
}


function reiniciar() {

    campoAmigosIncluidos.textContent = "";
    amigosIncluidos = [];
    amigosSorteados = [];
    campoSorteados.textContent = "";
    listaFinal = [];
}


function obterNumeroAleatorio (min, max) {

    return Math.floor(Math.random() * (max - min + 1)) + min;
}
1 resposta

Oi, Victor! Tudo bem?

Que bacana que você está se desafiando a criar sua própria lógica para o sorteio! Atualmente, estamos usando textContent para exibir os resultados, e isso não permite quebras de linha. Para resolver isso, podemos usar innerHTML e adicionar uma quebra de linha (<br>) entre cada sorteado, como no exemplo abaixo:

function sortear() {

    amigosSorteados = [];

    let numeroParticipantes = amigosIncluidos.length;

    for (n = 0; n <= numeroParticipantes - 1; n++) {

        let numeroSorteado = obterNumeroAleatorio(0, numeroParticipantes - 1);

        while (amigosSorteados.includes(amigosIncluidos[numeroSorteado]) || amigosIncluidos[n] == amigosIncluidos[numeroSorteado]) {
            numeroSorteado = obterNumeroAleatorio(0, numeroParticipantes - 1);
        }

        amigosSorteados[n] = amigosIncluidos[numeroSorteado];    
    }

    let listaFinal = [];

    for (n = 0; n <= numeroParticipantes - 1; n++) {
        listaFinal[n] = `${amigosIncluidos[n]} -> ${amigosSorteados[n]}`;
    }

    campoSorteados.innerHTML = listaFinal.join('<br>');
}

Com essa modificação, cada par de amigos sorteados será exibido em uma linha separada no seu elemento HTML. Espero que isso ajude a resolver o problema que você estava enfrentando!

Um forte abraço e bons estudos!