Erro básico de ordenação em HMTML

Olá pessoal
Estou me aventurando no mundo do html para um projeto pessoal de um site que faça sorteio de times de vôlei.

O site já está funcionando da seguinte forma: você entra com uma lista de jogadores e a quantidade de times, que geralmente são 3. A partir da lista, o site sorteia 3 líderes aleatórios que serão responsáveis por cada time, e a cada rodada um líder faz a escolha de um jogador.
Então primeiro o Líder 1 escolhe um jogador, depois o Líder 2, por fim o líder 3 e depois o Líder 1… assim por diante.

Porém, gostaria de alterar para em vez da ordem de escolha ser 1 2 3, 1 2 3… ser 1 2 3, 3 2 1.
Ou seja, o último líder que escolheu um jogador na primeira rodada, é o primeiro a escolher na segunda, e assim por diante
Estou a 3 dias tentando fazer isso e não consigo kkk, alguém poderia me ajudar?
O meu pequeno código do site está em anexo
index.html (6,9,KB)

Pra fazer isso adicionei o conceito de “rodada”. Basicamente, na primeira rodada vc começa no primeiro líder e vai avançando. Na segunda rodada, começa do último e vai voltando. Na terceira rodada faz igual à primeira, e assim por diante.

Só que precisei mudar a lógica geral. Também aproveitei pra mudar outras coisas. Por exemplo, não precisa ficar recriando o select de jogadores toda hora, basta remover a opção que foi escolhida. O mesmo vale para os div’s que vc recria toda hora, bastaria usar a mesma estrutura e só ir atualizando os valores.

Então no HTML adicionei as div’s dos resultados e sorteio, e deixei elas ocultas no início, e com vários elementos vazios, que serão preenchidos depois:

<h1>Sorteio Volei</h1>
<form id="sorteioForm">
  <label for="numTeams">Quantidade de Times:</label>
  <select id="numTeams" required>
    <option value="1">1 Time</option>
    <option value="2">2 Times</option>
    <option value="3">3 Times</option>
  </select>
  <label for="players">Lista de Jogadores:</label>
  <textarea id="players" rows="4" required></textarea>
  <input type="submit" value="Sortear Times">
</form>

<div id="resultado" class="result" style="display: none">
    <h2>Resultado</h2>
    <div id="leaders"></div>
    <div id="leaderSelect">
        <h2>Vez do Líder: <span id="currentLeader"></span></h2>
        <p>Escolha um jogador para o seu time:</p>
        <select id="playersSelect"></select>
        <button id="confirmButton">Confirmar</button>
    </div>
</div>

E no JavaScript, alterei para usar esta estrutura, em vez de recriar toda hora:

var numTeams, players, teams, rodada, leaderIndex;
// os elementos podem ser buscados apenas uma vez no início, já que agora não são recriados toda hora
var resultadoDiv = document.getElementById("resultado");
var lideresDiv = document.getElementById('leaders');
var currentLeader = document.getElementById('currentLeader');
var playersSelect = document.getElementById('playersSelect');
var confirmButton = document.getElementById('confirmButton');
var leaderSelectDiv = document.getElementById("leaderSelect");

document.getElementById("sorteioForm").addEventListener("submit", function (event) {
    event.preventDefault();
    sortearTimes();
});

function sortearTimes() {
    numTeams = parseInt(document.getElementById("numTeams").value);
    players = document.getElementById("players").value.trim().split("\n").map(function (player) {
        return player.trim();
    });
    if (players.length < numTeams) {
        alert("Não há jogadores suficientes para formar os times.");
        return;
    }

    shuffle(players);
    teams = [];
    // dá pra separar os times e remover do array players em um único loop
    for (var i = 0; i < numTeams; i++) {
        var randomIndex = Math.floor(Math.random() * players.length);
        teams.push({ leader: players[randomIndex], players: [] });
        players.splice(randomIndex, 1);
    }

    // divs de resultados e seleção ficam visíveis
    resultadoDiv.style.display = 'block';
    leaderSelectDiv.style.display = 'block';
    // preenche os líderes
    lideresDiv.innerHTML = '';
    for (var i = 0; i < numTeams; i++) {
        var team = teams[i];
        var teamDiv = document.createElement("div");
        teamDiv.id = `teamDiv${i}`;
        teamDiv.classList.add("team");
        teamDiv.innerHTML = `<span class="team-name">Time ${i + 1}</span>
              <span class="leader">Líder: ${team.leader}</span>
              <ul class="players"></ul>`;
        lideresDiv.appendChild(teamDiv);
    }
    // preenche o select com os outros jogadores (mas primeiro limpa)
    playersSelect.innerHTML = '';
    for (var player of players) {
        playersSelect.add(new Option(player, player));
    }
    // primeira rodada, começa no índice zero
    rodada = leaderIndex = 0;
    // atualiza o nome do líder atual
    currentLeader.innerText = teams[0].leader;
}

// ao clicar no botão Confirmar
confirmButton.addEventListener('click', function () {
    var selectedPlayer = playersSelect.value;
    teams[leaderIndex].players.push(selectedPlayer);
    players.splice(players.indexOf(selectedPlayer), 1);
    // remove o jogador do select
    playersSelect.remove(playersSelect.selectedIndex);
    if (players.length == 0) { // já escolheu todos, mostra os times
        leaderSelectDiv.style.display = 'none'; // não mostra mais o div para escolher jogadores
        for (var i = 0; i < numTeams; i++) {
            var team = teams[i];
            var div = lideresDiv.querySelector(`#teamDiv${i}`);
            var ul = div.querySelector('ul');
            for (var player of teams[i].players) {
                var playerItem = document.createElement("li");
                playerItem.textContent = player;
                ul.appendChild(playerItem);
            }
        }
    } else {
        // rodada par, vai pro próximo, rodada ímpar, vai pro anterior
        if (rodada % 2 === 0) {
            if (leaderIndex < numTeams - 1) { // ainda não terminou a rodada
                leaderIndex++;
            } else { // acabou a rodada, vai pra próxima
                rodada++;
            }
        } else {
            if (leaderIndex > 0) { // ainda não terminou a rodada
                leaderIndex--;
            } else { // acabou a rodada, vai pra próxima
                rodada++;
            }
        }
        // atualiza o nome do líder atual
        currentLeader.innerText = teams[leaderIndex].leader;
    }
});

function shuffle(array) {
    for (var i = array.length - 1; i > 0; i--) {
        var j = Math.floor(Math.random() * (i + 1));
        var temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }
}
1 curtida

Cara, não sei como agradecer, funcionou perfeitamente!
Obrigadão, os comentários ajudaram a entender, muito bom

Aos poucos vou ir tentando melhorar o visual, deixar mais responsivo etc… Mas agora ficou 100% funcional, obrigadão Hugo

1 curtida