Solucionado (ver solução)
Solucionado
(ver solução)
7
respostas

Projeto Amigo Secreto - Não consigo escrever um código para evitar duplicidade de nome no Sorteio.

Eu terminei de escrever o código do projeto Amigo secreto. Está tudo certo. Porem os nomes sorteados, algumas vezes se repetem, e mesmo quando toda a lista termina, ele continua "sorteando". Tentei colocar "Array".filter(amigo => !"Array".includes(amigo)); também tentei usar o mesmo conceito do exercício dos números aleatórios if (quantidadeDeElementosNaLista == numeroLimite) { listaDeNumerosSorteados = []; } if (listaDeNumerosSorteados.includes(numeroEscolhido)) e também não deu certo.

Alguém pode me ajudar? Eu agradeço. Pois, eu estou quebrando a cabeça...o tempo passando. Segue abaixo o código que eu escrevi:

//O principal objetivo deste desafio é fortalecer suas habilidades em lógica de programação. Aqui você deverá desenvolver a lógica para resolver o problema. let listaDeAmigos = []; // Criar um local de armazenagem, uma Array para armazenar os nomes dos amigos. function adicionarAmigo() { // Cria uma função para adicionar um amigo à lista. const inputAmigo = document.getElementById("amigo"); const nomeAmigo = capitalizeFirstLetter(inputAmigo.value.trim());

// Verificar se o campo nome está vazio, e envia mensagem. const regex = /^[A-Za-zÀ]/; // Exige que o nome começe com uma letra, e mesmmo que digitar a 1° letra minúscula e vai se tornar maiúscula. if (!regex.test(nomeAmigo)) { // Avalaia se o nome começa com uma letra. inputAmigo.value = ""; // Limpa o campo para o usuário inserir outro nome. alert("Por favor, insira um nome válido."); // Após clicar no "ok" na mensagem, ela se apaga e volta ao campo onde se inclui o nome, com o campo vazio. return; // Sai da função. }

// Verifica se o campo onde se inclui um nome está vazio, caso esteja e o usuário clicou para inserir, enia menságem. if (nomeAmigo === "") { alert("Por favor, insira um nome válido.");// Após clicar no "ok" na mensagem, ela se apaga e volta para o campo onde se inclui o nome. return; // Sai da função. }

if (listaDeAmigos.includes(nomeAmigo)) { // Verifica se o nome é repetido, se já consta na lista de nomes inclusos. alert(O nome '${nomeAmigo}' já está na lista!); // Após clicar no "ok" na mensagem, ela se apaga e volta ao campo onde se inclui o nome, com o campo vazio. inputAmigo.value = ""; // Limpa o campo para o usuário inserir outro nome. return; // Sai da função para não adicionar o nome repetido. }

listaDeAmigos.push(nomeAmigo); atualizarListaDeAmigos(); inputAmigo.value = ""; }

function atualizarListaDeAmigos() { // Função para atualizar a lista de amigos que é exibida na página. const listaAmigosElement = document.getElementById("listaAmigos"); listaAmigosElement.innerHTML = "";

listaDeAmigos.forEach((amigo, index) => { const li = document.createElement("li"); li.textContent = amigo; listaAmigosElement.appendChild(li); }); }

// Função para (pegar) capitalizar a primeira letra de uma string function capitalizeFirstLetter(string) { return string.charAt(0).toUpperCase() + string.slice(1); }

// Função para sortear um amigo secreto function sortearAmigo() { let mensagemElement = document.getElementById("mensagem");

const indiceSorteado = Math.floor(Math.random() * listaDeAmigos.length); const amigoSorteado = listaDeAmigos[indiceSorteado];

// Comando para Ocultar a lista de amigos const listaAmigosElement = document.getElementById("listaAmigos"); listaAmigosElement.style.display = "none";

// Comando para exibir o resultado do sorteio const resultadoElement = document.getElementById("resultado"); resultadoElement.innerHTML = <li>O amigo secreto sorteado é: ${amigoSorteado}</li>; }

// Adicionar evento de input para (pegar) capitalizar a primeira letra enquanto o usuário digita. document.getElementById("amigo").addEventListener("input", function (event) { const input = event.target; input.value = capitalizeFirstLetter(input.value); });

// Adicionar evento de keydown para adicionar amigo ao pressionar Enter document.getElementById("amigo").addEventListener("keydown", function (event) { if (event.key === "Enter") { adicionarAmigo(); } });

7 respostas

Boa tarde Pessoal. Eu estou precisando de ajuda. Eu escrevi o código para o Amigo Secreto. Ele funciona tudo certo. Porem, ele repete os nomes quando sorteia, e mesmo quando todos os nomes da lista já foram sorteados ele não para. Tem como eu colocar algumas funções, nesse código que já escrevi, para ele não repetir o nome já sorteado, ou ir tirando da lista o nome sorteado, e quando todos os nomes da lista forem sorteados, ele exibir uma mensagem "Todos os nomes já foram sorteados! inicie uma nova lista."? Alguém pode me ajudar? Alguém sabe como fazer isso? Eu quebrei a cabeça com varios códigos e não deu certo, eu não sei onde eu estou errando. E o meu tempo está acabando. Quem puder me ajudar, eu agradeço muito.

Eu coloquei, abaixo, os códigos em blocos sequenciais, para talvez ficar mais fácil de visualizar e entender. Grato.

let listaDeAmigos = []; // Criar um local de armazenagem, uma Array para armazenar os nomes dos amigos.
function adicionarAmigo() { // Cria uma função para adicionar um amigo à lista.
  const inputAmigo = document.getElementById("amigo");
  const nomeAmigo = capitalizeFirstLetter(inputAmigo.value.trim());
// Verificar se o  campo nome está vazio, e envia mensagem.
  const regex = /^[A-Za-zÀ-ÖØ-öø-ÿ]+$/; // Exige que o nome começe com uma letra, e mesmmo que digitar a 1° letra minúscula e vai se tornar maiúscula.
  if (!regex.test(nomeAmigo)) { // Avalaia se o nome começa com uma letra.
    inputAmigo.value = ""; // Limpa o campo para o usuário inserir outro nome.
    alert("Por favor, insira um nome válido. Somente letras"); // Após clicar no "ok" na mensagem, ela se apaga e volta ao campo onde se inclui o nome, com o campo vazio.
    return;  // Sai da função.
  }
// Verifica se o campo onde se inclui um nome está vazio, caso esteja e o usuário clicou para inserir, enia menságem.
  if (nomeAmigo === "") {
    alert("Por favor, insira um nome válido.");// Após clicar no "ok" na mensagem, ela se apaga e volta para o campo onde se inclui o nome.
    return;  // Sai da função.
 }
if (listaDeAmigos.includes(nomeAmigo)) { // Verifica se o nome é repetido, se já consta na lista de nomes inclusos.
  alert(`O nome '${nomeAmigo}' já está na lista!`); // Após clicar no "ok" na mensagem, ela se apaga e volta ao campo onde se inclui o nome, com o campo vazio.
  inputAmigo.value = ""; // Limpa o campo para o usuário inserir outro nome.
  return; // Sai da função para não adicionar o nome repetido.
`listaDeAmigos.push(nomeAmigo);
  atualizarListaDeAmigos();
  inputAmigo.value = "";
function atualizarListaDeAmigos() { // Função para atualizar a lista de amigos que é exibida na página.
  const listaAmigosElement = document.getElementById("listaAmigos");
  listaAmigosElement.innerHTML = "";
 listaDeAmigos.forEach((amigo, index) => {
    const li = document.createElement("li");
    li.textContent = amigo;
    listaAmigosElement.appendChild(li);
  });
// Função para (pegar) capitalizar a primeira letra de uma string
function capitalizeFirstLetter(string) {
  return string.charAt(0).toUpperCase() + string.slice(1);
}
// Função para sortear um amigo secreto
function sortearAmigo() {
  let mensagemElement = document.getElementById("mensagem");
  const indiceSorteado = Math.floor(Math.random() * listaDeAmigos.length);
  const amigoSorteado = listaDeAmigos[indiceSorteado];
// Comando para Ocultar a lista de amigos
  const listaAmigosElement = document.getElementById("listaAmigos");
  listaAmigosElement.style.display = "none";
// Comando para exibir o resultado do sorteio
  const resultadoElement = document.getElementById("resultado");
  resultadoElement.innerHTML = `<li>O amigo secreto sorteado é: ${amigoSorteado}</li>`;
// Adicionar evento de input para (pegar) capitalizar a primeira letra enquanto o usuário digita.
document.getElementById("amigo").addEventListener("input", function (event) {
  const input = event.target;
  input.value = capitalizeFirstLetter(input.value);
});
// Adicionar evento de keydown para adicionar amigo ao pressionar Enter
document.getElementById("amigo").addEventListener("keydown", function (event) {
  if (event.key === "Enter") {
    adicionarAmigo();

Oi, Eduardo! Tudo bem?

O problema está no fato de que o sorteio não está removendo o amigo sorteado da lista, o que permite que ele seja sorteado novamente. Para resolver isso, você pode criar uma nova lista que armazena os amigos que ainda não foram sorteados. Quando todos forem sorteados, você pode exibir a mensagem informando que o sorteio terminou.

Ajuste seu código assim:

let listaDeAmigos = [];
let amigosRestantes = []; // Lista para armazenar amigos que ainda não foram sorteados

function adicionarAmigo() {
  const inputAmigo = document.getElementById("amigo");
  const nomeAmigo = capitalizeFirstLetter(inputAmigo.value.trim());

  const regex = /^[A-Za-zÀ-ÖØ-öø-ÿ]+$/;
  if (!regex.test(nomeAmigo) || nomeAmigo === "") {
    inputAmigo.value = "";
    alert("Por favor, insira um nome válido.");
    return;
  }

  if (listaDeAmigos.includes(nomeAmigo)) {
    alert(\`O nome '\${nomeAmigo}' já está na lista!\`);
    inputAmigo.value = "";
    return;
  }

  listaDeAmigos.push(nomeAmigo);
  atualizarListaDeAmigos();
  inputAmigo.value = "";
}

function atualizarListaDeAmigos() {
  const listaAmigosElement = document.getElementById("listaAmigos");
  listaAmigosElement.innerHTML = "";

  listaDeAmigos.forEach((amigo) => {
    const li = document.createElement("li");
    li.textContent = amigo;
    listaAmigosElement.appendChild(li);
  });
}

function capitalizeFirstLetter(string) {
  return string.charAt(0).toUpperCase() + string.slice(1);
}

function sortearAmigo() {
  // Se a lista de amigos restantes estiver vazia, reinicia o sorteio
  if (amigosRestantes.length === 0) {
    if (listaDeAmigos.length === 0) {
      alert("Adicione amigos antes de sortear.");
      return;
    }
    amigosRestantes = [...listaDeAmigos];
  }

  const indiceSorteado = Math.floor(Math.random() * amigosRestantes.length);
  const amigoSorteado = amigosRestantes.splice(indiceSorteado, 1)[0]; // Remove o amigo sorteado da lista

  const resultadoElement = document.getElementById("resultado");
  resultadoElement.innerHTML += \`<li>O amigo secreto sorteado é: \${amigoSorteado}</li>\`;

  if (amigosRestantes.length === 0) {
    alert("Todos os nomes já foram sorteados! Inicie uma nova lista.");
  }
}

// Eventos para capitalizar e adicionar amigos com Enter
document.getElementById("amigo").addEventListener("input", function (event) {
  const input = event.target;
  input.value = capitalizeFirstLetter(input.value);
});

document.getElementById("amigo").addEventListener("keydown", function (event) {
  if (event.key === "Enter") {
    adicionarAmigo();
  }
});

Com isso, a cada sorteio o nome será removido da lista de amigos restantes, evitando duplicidade. Quando todos forem sorteados, a mensagem será exibida.

Fico à disposição. Abraços e bons estudos!

Oi Armano! Eu estou bem, obrigado, e espero que Vc também esteja. Muito obrigado pela resposta. Eu rodei o seu código e apresentou alguns problemas: 1- O sorteio começa e a lista de nomes ainda aparece na tela. 2- Quando aparece a mensagem "Todos os nomes já foram sorteados! Inicie uma nova lista." ainda falta o último nome para aparecer no sorteio. 3 - Quando clico no "Ok" da mensagem, ela se apaga, então aparece o ultimo nome sorteado. Mas a lista não se apaga. 4 - Se eu continuar a clicar no botão "Sortear amigo" o sorteio continua, repetindo os nomes, até surgir a mensagem novamente, porem se eu clicar no "OK", o ciclo fica se repetindo. tentei colocar "-1", não deu certo, ele fica sorteando sem parar

if (amigosRestantes.length === -1) {
    alert("Todos os nomes já foram sorteados! Inicie uma nova lista.");
  }

tentei colocar "1", não deu certo ele deixa de sortear um nome.

if (amigosRestantes.length === 1) {
    alert("Todos os nomes já foram sorteados! Inicie uma nova lista.");
  }

eu escrevi um código, basedo no seu, que ele não repete o nome, mas não aparece a mensagem "Todos os nomes já foram sorteados! Inicie uma nova lista.", Aparece no lugar do nome sorteado "O amigo secreto sorteado é: undefined".

if(listaDeAmigos.length === -1) {
    alert("Todos os nomes já foram sorteados! Inicie uma nova lista.");
    listaAmigosElement.style.display = "none";
     return; 
}

Eu também criei um botão de reiniciar, no html, mas não consegui aciona-lo, quando acabasse todos os nomes do sorteio. Eu tentei associa-lo ao botão do "OK" da mensagem "Todos os nomes já foram sorteados! Inicie uma nova lista.", que aparece no seu código, mas não consegui.

 <button class="button-draw" onclick="limparArray()" aria-label="Sortear amigo secreto">
                        <img src="assets/play_circle_outline.png" alt="Ícone para reiniciar o sorteio" width="35" height="35">
                        Reiniciar Sorteio
                </button>

Eu não quero abusar, mas eu estou no limite do tempo para entregar o trabalho, e estou quebrando a cabeça sem sucesso. Por favor, se Vc puder me Ajudar, eu te agardeço muito. Por hora muito obrigado, Armano, pela sua atenção e dedicação.

Fala, Eduardo!

Para evitar a duplicidade de nomes no sorteio e garantir que o processo pare quando todos forem sorteados, você pode criar uma nova lista para armazenar os amigos que ainda não foram sorteados.

A cada sorteio, o nome é removido dessa lista. Quando a lista estiver vazia, uma mensagem será exibida indicando que todos já foram sorteados.

Ajuste seu código assim:

// Lista para armazenar os amigos
let listaDeAmigos = [];
// Lista para controlar os amigos ainda não sorteados
let amigosNaoSorteados = [];

function adicionarAmigo() {
  const inputAmigo = document.getElementById("amigo");
  const nomeAmigo = capitalizeFirstLetter(inputAmigo.value.trim());

  const regex = /^[A-Za-zÀ-ÖØ-öø-ÿ]+$/;
  if (!regex.test(nomeAmigo) || nomeAmigo === "") {
    alert("Por favor, insira um nome válido.");
    inputAmigo.value = "";
    return;
  }

  if (listaDeAmigos.includes(nomeAmigo)) {
    alert("O nome '" + nomeAmigo + "' já está na lista!");
    inputAmigo.value = "";
    return;
  }

  listaDeAmigos.push(nomeAmigo);
  atualizarListaDeAmigos();
  inputAmigo.value = "";
}

function atualizarListaDeAmigos() {
  const listaAmigosElement = document.getElementById("listaAmigos");
  listaAmigosElement.innerHTML = "";

  listaDeAmigos.forEach(amigo => {
    const li = document.createElement("li");
    li.textContent = amigo;
    listaAmigosElement.appendChild(li);
  });
}

function sortearAmigo() {
  // Inicializa a lista de não sorteados se estiver vazia
  if (amigosNaoSorteados.length === 0) {
    amigosNaoSorteados = [...listaDeAmigos];
  }

  if (amigosNaoSorteados.length === 0) {
    alert("Todos os nomes já foram sorteados! Inicie uma nova lista.");
    return;
  }

  const indiceSorteado = Math.floor(Math.random() * amigosNaoSorteados.length);
  const amigoSorteado = amigosNaoSorteados.splice(indiceSorteado, 1)[0];

  const resultadoElement = document.getElementById("resultado");
  resultadoElement.innerHTML = "&lt;li&gt;O amigo secreto sorteado é: " + amigoSorteado + "&lt;/li&gt;";
}

// Capitaliza a primeira letra da string
function capitalizeFirstLetter(string) {
  return string.charAt(0).toUpperCase() + string.slice(1);
}

// Eventos para capitalizar e adicionar amigos
document.getElementById("amigo").addEventListener("input", function (event) {
  event.target.value = capitalizeFirstLetter(event.target.value);
});

document.getElementById("amigo").addEventListener("keydown", function (event) {
  if (event.key === "Enter") {
    adicionarAmigo();
  }
});

Com essas mudanças, o sorteio não repetirá nomes, e ao final de todos os sorteios, você verá a mensagem para iniciar uma nova lista.

Fico à disposição.

Olá Armaro!

Os nomes continuam repetindo no sorteio, não param, não aparece nenhuma mensagem de todos sorteados, não aparece nenhum botão para reiniciar. E na tela o nome sorteado aparece assim:

  • O amigo secreto sorteado é: Po
  • , com
  • no início e
  • no final do texto. Ainda não consegui um resultado correto. Que não repita os nomes sorteados. Que apareça uma mensagem "Todos os nomes foram sorteados! Inicie uma nova lista.", e quando eu clicar no Ok, apareça um botão de reiniciar. Eu já criei o botão no HTML. Eu já não sei mais o que fazer. O prazo final para entregar é amanha, estou desesperado... por favor me ajude!!!!! Grato. Muito Obrigado.

O texto que aparece na tela, quando sorteio é:

<li>O amigo secreto sorteado é: Po</li>
solução!

Olá Armano! Eu reescrevi o código e fiz rodar "razoável". Eu sei que pode ser melhor. Mas vou melhorando, e atualizando o arquivo. Segue o link onde está o meu exercício : https://github.com/Eduardo-Marchi2025/jogo-do-numero-secreto Muito obrigado. Fique com Deus.