Publiée le - Créé avec l'aide de l'IA
🏆 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

sportsregions
