1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
|
<script>
document.forms[0].reset();
const cases = document.querySelectorAll('#cases input');
const json = `[
{"elts": ["peintre", "jeune"]},
{"elts": ["tableau", "peintre", "vieux", "main"]},
{"elts": ["tableau", "femme"]},
{"elts": ["tableau", "homme", {"elts": ["barbe", "barbu"], "needed": 1}]},
{"elts": ["tableau", "joueur", {"elts": ["luth", "mandoline", "guitare"], "needed": 1}]},
{"elts": ["buste", "enfant", "sculpture", "antique"]},
{"elts": [{"elts":["statue", "sculpture"], "needed": 1}, "homme", "esclave"]},
{"elts": ["palette", {"elts": ["peinture", "peintures"], "needed": 1}, "couleurs", "effacées"]},
{"elts": ["trois", "bulles", {"elts": ["volent", "flottent"], "needed": 1}, "savon"]},
{"elts": ["sablier"], "needed": 1},
{"elts": ["parchemin"], "needed": 1},
{"elts": ["vase"], "needed": 1},
{"elts": ["crane", "crâne"], "needed": 1},
{"elts": [{"elts":["canne", "baton", baguette"], "needed": 1}, "personnage", "tenue", "peintre"]},
{"elts": [{"elts": [{"elts": ["coupe", {"elts": ["papier", "lettre"], "needed": 1}]}, "coupe-papier", "couteau"], "needed": 1}, "table"]},
{"elts": ["flute", "flûte"], "needed": 1},
{"elts": ["perle", {"elts": ["colliers", "collier"], "needed": 1}]},
{"elts": ["petit", "coffret", "couvercle", "ouvert"]},
{"elts": ["deux", "livres", "livre", "table", "2"]},
{"elts": ["trois", "3", "roses", "vase", "table"]},
{"elts": ["table"], "needed": 1},
{"elts": ["rideau", "rideaux"], "needed": 1},
{"elts": [verre", "moitié", "rempli", "vin", "blanc", "flute", "champagne"]},
{"elts": ["monnaie", {"elts": ["pièce", "pièces"], "needed": 1}]},
{"elts": [{"elts": ["brûle parfum", "brûle-parfum"], "needed": 1}]},
{"elts": ["vase", "renversé", "tombé"]},
{"elts": ["bougie", "éteinte", {"elts": ["bougeoir"], "needed": 1}]},
{"elts": ["nappe", "table"]},
{"elts": ["papier", "texte", "écrit", "plié", "bord", "écriture"]},
{"elts": ["papier", "tombe", "table", "vole", "petit", "blanc"]}
]`;
const lists = JSON.parse(json);
const defaultPoints = 1; // par défaut un mot donne un point
const defaultNeeded = 2; // par défaut il faut au moins 2 points pour valider une liste
function check(wordSet, list) {
const points = list.points || defaultPoints; // nombre de points pour 1 item correspondant
const needed = list.needed || defaultNeeded; // nombre de points nécessaires pour valider la liste courante
let totalScore = 0;
for (const item of list.elts) {
if ( typeof item === 'string' ) { // l'item est une chaîne
if ( wordSet.has(item) ) // si l'item est dans la case, on augmente le score
totalScore += points;
} else { // l'item est un objet (une liste), on appelle récursivement la fonction
if ( check(wordSet, item) ) // si elle renvoie "true", on augmente le score
totalScore += points;
}
}
return totalScore >= needed; // renvoie "true" lorsque le score nécessaire est atteint.
}
document.getElementById('check').addEventListener('click', e => {
for (const list of lists) { // on défreeze toutes les listes
list.frozen = false;
}
for (const c of cases) {
let wordSet = new Set(c.value.toLowerCase().match(/[\wàâäéèêîïôöùûüÿçæ]+(?:-[\wàâäéèêîïôöùûüÿçæ]+)*/g));
if ( ! wordSet.size ) // la case est vide, on passe à la suivante
continue;
let found = false;
for (const list of lists) {
if ( list.frozen )
continue;
if ( check(wordSet, list) ) {
c.style.backgroundColor = '#4CE0D2';
found = true;
list.frozen = true; // cette liste a été validée, on la freeze.
break; // dés qu'une liste correspond on interrompt la boucle
}
}
if ( ! found )
c.style.backgroundColor = '#FF6666';
}
}, false);
</script> |
Partager