"Arc Club Alésien : Viser, Partager, Réussir."


test


Publiée le - Créé avec l'aide de l'IA

Arena Club : Tournoi Interactif de Tir à l'Arc

🏆 Arena Club : Tournoi Interactif

Configurez votre pas de tir, saisissez les scores et suivez le classement en temps réel.

🎯 Distance Salle - 18 mètres Salle - 25 mètres Extérieur - 50 mètres Fédéral - 70 mètres Distance libre
🔁 Volées 3 Volées 5 Volées 10 Volées
🏹 Flèches / Volée 3 Flèches (Max 30 pts / volée) 6 Flèches (Max 60 pts / volée)
Archer (3/10) Scores par Volée Total Action
➕ Ajouter Archer 🔄 Reset Scores 📋 Résumé

📊 Classement Général en Direct

ℹ️ Message
`; } inputGroup += ``; tdInputs.innerHTML = inputGroup; tr.appendChild(tdInputs); // Colonne Total Score let tdTotal = document.createElement("td"); tdTotal.className = "p-2 text-right font-extrabold text-arenaGreen text-sm sm:text-base"; tdTotal.id = `total-${i}`; tdTotal.innerText = "0"; tr.appendChild(tdTotal); // Colonne Suppression let tdDelete = document.createElement("td"); tdDelete.className = "p-2 text-center"; tdDelete.innerHTML = ` 🗑️ `; tr.appendChild(tdDelete); tbody.appendChild(tr); } calculerClassement(); }; // Validation dynamique des limites de points par volée window.validerEtCalculer = function(archerIdx, voleeIdx) { const nbFleches = parseInt(document.getElementById("cfg-fleches").value); const maxPointsParVolee = nbFleches * 10; const el = document.getElementById(`score-${archerIdx}-${voleeIdx}`); if (el && el.value !== "") { let val = parseInt(el.value); if (isNaN(val) || val < 0) { el.value = 0; } else if (val > maxPointsParVolee) { el.value = maxPointsParVolee; showToast(`Score max pour ${nbFleches} flèches : ${maxPointsParVolee} pts !`, "🎯"); } } calculerClassement(); }; // Ajout d'un nouvel archer window.ajouterArcher = function() { if (nbArchers >= maxArchers) { showToast("Maximum 10 archers autorisés sur le pas de tir !", "🚫"); return; } nbArchers++; genererGrille(); }; // Suppression d'un archer spécifique window.supprimerArcher = function(index) { if (nbArchers <= minArchers) { showToast("Il faut conserver au moins 1 archer sur le pas de tir.", "⚠️"); return; } // Supprimer physiquement en réorganisant les données nbArchers--; let tbody = document.getElementById("grille-archers"); let rows = tbody.children; if (rows[index]) { rows[index].remove(); } // Réindexer les IDs des inputs restants pour éviter les décalages genererGrille(); }; // Réinitialisation des scores sans altérer la liste des archers ni la config window.resetScores = function() { const nbVolees = parseInt(document.getElementById("cfg-volees").value); for (let i = 0; i < nbArchers; i++) { for (let j = 0; j < nbVolees; j++) { let el = document.getElementById(`score-${i}-${j}`); if (el) el.value = ""; } } calculerClassement(); showToast("Les scores ont été réinitialisés.", "🔄"); }; // Calcul principal du classement général en temps réel window.calculerClassement = function() { const nbVolees = parseInt(document.getElementById("cfg-volees").value); const nbFleches = parseInt(document.getElementById("cfg-fleches").value); const maxPointsParVolee = nbFleches * 10; const scoreMaxTotal = nbVolees * maxPointsParVolee; let participants = []; for (let i = 0; i < nbArchers; i++) { let nomInput = document.getElementById(`name-${i}`); let nom = (nomInput && nomInput.value.trim() !== "") ? nomInput.value.trim() : `Archer ${i+1}`; let total = 0; let voleesRemplies = 0; for (let j = 0; j < nbVolees; j++) { let el = document.getElementById(`score-${i}-${j}`); if (el && el.value !== "") { let val = parseInt(el.value) || 0; total += val; voleesRemplies++; } } // Mise à jour du total individuel dans le tableau let totalEl = document.getElementById(`total-${i}`); if (totalEl) totalEl.innerText = total; let flechesTirees = voleesRemplies * nbFleches; let moyenne = flechesTirees > 0 ? (total / flechesTirees).toFixed(1) : "0.0"; participants.push({ nom: nom, total: total, moyenne: moyenne, voleesRemplies: voleesRemplies }); } // Tri décroissant basé sur le score total participants.sort((a, b) => b.total - a.total); // Render Leaderboard const leaderboardContainer = document.getElementById("leaderboard"); if (!leaderboardContainer) return; leaderboardContainer.innerHTML = ""; const medailles = ["🥇", "🥈", "🥉"]; const stylesPodium = ["podium-gold border", "podium-silver border", "podium-bronze border"]; participants.forEach((p, idx) => { let rangDisplay = medailles[idx] || `${idx + 1}e`; let podiumClass = stylesPodium[idx] || "bg-white/5 border border-white/5"; let pourcentage = Math.round((p.total / scoreMaxTotal) * 100); let row = document.createElement("div"); row.className = `p-3 rounded-xl flex flex-col sm:flex-row sm:items-center justify-between gap-2 transition-all duration-200 ${podiumClass}`; row.innerHTML = `
${rangDisplay}
${escapeHtml(p.nom)}
Moyenne: ${p.moyenne} pts/flèche • Volées complétées: ${p.voleesRemplies}/${nbVolees}
${p.total} / ${scoreMaxTotal} pts
`; leaderboardContainer.appendChild(row); }); }; // Échapper les chaînes de texte pour éviter tout problème XSS function escapeHtml(str) { return str.replace(/&/g, "&").replace(/, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'"); } // Fonction d'exportation / Synthèse du tournoi window.exporterResultats = function() { const distance = document.getElementById("cfg-distance").value; const nbVolees = document.getElementById("cfg-volees").value; const nbFleches = document.getElementById("cfg-fleches").value; let texteExport = `🎯 TOURNOI ARENA CLUB - RÉSUMÉ\n`; texteExport += `Configuration: ${distance} | ${nbVolees} volées de ${nbFleches} flèches\n`; texteExport += `------------------------------------\n`; let participants = []; for (let i = 0; i < nbArchers; i++) { let nom = document.getElementById(`name-${i}`) ? document.getElementById(`name-${i}`).value : `Archer ${i+1}`; let total = parseInt(document.getElementById(`total-${i}`).innerText) || 0; participants.push({ nom, total }); } participants.sort((a, b) => b.total - a.total); participants.forEach((p, index) => { texteExport += `${index + 1}. ${p.nom} - ${p.total} pts\n`; }); // Copie dans le presse-papier const textarea = document.createElement('textarea'); textarea.value = texteExport; document.body.appendChild(textarea); textarea.select(); try { document.execCommand('copy'); showToast("Résumé copié dans le presse-papier !", "📋"); } catch (err) { showToast("Erreur lors de la copie du résumé.", "❌"); } document.body.removeChild(textarea); }; // Initialisation au chargement window.onload = function() { genererGrille(); }; })();

Partager sur

Envie de participer ?