const SUBJECTS=[ {id:"lengua",name:"Lengua",games:[ {id:"lectura",glyph:"Aa",name:"Comprensión lectora",area:"Lee y responde",t:0}, {id:"sustantivos",glyph:"N",name:"Clases de sustantivos",area:"Común, propio, colectivo",t:1}, {id:"prefijos",glyph:"des-",name:"Prefijos",area:"in-, im-, des-, i-",t:2}, {id:"verbo",glyph:"V",name:"El verbo",area:"Tiempo y persona",t:3}]}, {id:"mates",name:"Matemáticas",games:[ {id:"romanos",glyph:"XIV",name:"Números romanos",area:"Leer y escribir",t:1}, {id:"redondeo",glyph:"≈",name:"Redondeo",area:"Números de hasta 6 cifras",t:1}, {id:"problemas",glyph:"?",name:"Problemas",area:"Dos operaciones",t:1}, {id:"fracciones",glyph:"½",name:"Fracciones",area:"Leer y comparar",t:2}, {id:"decimales",glyph:"0,5",name:"Décimas y centésimas",area:"Números decimales",t:2}, {id:"medida",glyph:"km",name:"Unidades de medida",area:"Longitud, masa y capacidad",t:3}]}, {id:"naturales",name:"Ciencias de la Naturaleza",games:[ {id:"plantas",glyph:"🌱",name:"Partes de la planta",area:"¿Qué parte lo hace?",t:2}, {id:"materia",glyph:"💧",name:"Cambios de estado",area:"Fusión, evaporación…",t:3}]}, {id:"sociales",name:"Ciencias Sociales",games:[ {id:"capitales",glyph:"★",name:"Comunidades y capitales",area:"España",t:1}, {id:"rios",glyph:"〰",name:"Ríos y vertientes",area:"Cantábrica, atlántica, mediterránea",t:2}]}, {id:"english",name:"English",games:[ {id:"grammar",glyph:"En",name:"English practice",area:"Vocabulary and grammar",t:0}]} ]; const HELP={lectura:"Lee el texto y responde.",sustantivos:"¿Qué clase de sustantivo es?",prefijos:"Toca la palabra con el prefijo correcto.",verbo:"Fíjate en la forma verbal.", romanos:"Recuerda: I=1, V=5, X=10, L=50, C=100, D=500, M=1000.",redondeo:"Mira la cifra de la derecha: si es 5 o más, se sube.",problemas:"Lee el problema y toca la solución.", fracciones:"Observa y toca la respuesta.",decimales:"Recuerda: décimas, centésimas…",medida:"Convierte la medida.", plantas:"¿Qué parte de la planta lo hace?",materia:"¿Qué cambio de estado ocurre?",capitales:"Toca la capital de la comunidad autónoma.",rios:"¿A qué vertiente desemboca este río?",grammar:"Choose the correct answer."}; /* ---------- Contenidos ---------- */ const LECTURAS=[ {t:"La cometa de Nora",x:"Nora llevaba toda la semana construyendo una cometa con cañas y papel de seda. El sábado subió con su abuelo a la colina, pero no soplaba nada de viento. Esperaron sentados más de una hora comiendo bocadillos. De pronto, una ráfaga levantó las hojas del suelo; Nora corrió colina abajo y la cometa subió tan alto que parecía tocar las nubes.", q:[["¿Por qué tuvieron que esperar?","Porque no hacía viento","Porque estaba lloviendo","Porque la cometa estaba rota"],["¿Con qué materiales hizo Nora la cometa?","Cañas y papel de seda","Plástico y cuerda","Cartón y tela"]]}, {t:"El faro",x:"Durante siglos, los faros han ayudado a los barcos a no chocar contra la costa por la noche. Cada faro tiene su propio ritmo de destellos, para que los marineros sepan exactamente dónde están. Antes, un farero vivía en la torre y cuidaba de que la luz no se apagara nunca. Hoy casi todos funcionan de manera automática.", q:[["¿Para qué sirve que cada faro tenga su propio ritmo de luz?","Para que los marineros sepan dónde están","Para que sea más bonito","Para ahorrar electricidad"],["¿Qué ha cambiado hoy en los faros?","Funcionan de forma automática","Ya no tienen luz","Solo se encienden de día"]]}, {t:"Un invitado inesperado",x:"Al abrir la ventana de clase, un gorrión entró volando y se posó encima de la pizarra. Todos empezaron a gritar, y el pájaro, asustado, chocó contra el cristal. Entonces la maestra pidió silencio, apagó las luces y abrió la ventana de par en par. Al cabo de un minuto, el gorrión encontró la salida y se fue.", q:[["¿Por qué chocó el gorrión contra el cristal?","Porque estaba asustado","Porque no veía bien","Porque quería salir al patio"],["¿Qué hizo la maestra para ayudarlo?","Pidió silencio y abrió la ventana","Lo cogió con las manos","Llamó a un veterinario"]]}, {t:"Las abejas",x:"Las abejas viven en colmenas donde cada una tiene su trabajo. La reina pone los huevos, las obreras recogen néctar y polen, y los zánganos se encargan de la reproducción. Al ir de flor en flor, las abejas transportan el polen, y así ayudan a que las plantas den frutos. Sin ellas, muchos de los alimentos que comemos desaparecerían.", q:[["¿Qué hacen las obreras?","Recogen néctar y polen","Ponen los huevos","Se encargan de la reproducción"],["¿Por qué son importantes las abejas para nosotros?","Ayudan a que las plantas den frutos","Fabrican azúcar","Limpian las flores"]]} ]; const SUST=[["Madrid","propio"],["Lucía","propio"],["Ebro","propio"],["Pirineos","propio"],["Toby","propio"],["Atlántico","propio"], ["mesa","común individual"],["perro","común individual"],["árbol","común individual"],["abeja","común individual"],["oveja","común individual"],["músico","común individual"],["barco","común individual"], ["rebaño","común colectivo"],["enjambre","común colectivo"],["arboleda","común colectivo"],["orquesta","común colectivo"],["jauría","común colectivo"],["flota","común colectivo"],["alumnado","común colectivo"],["ejército","común colectivo"]]; const PREF=[["hacer","deshacer",["inhacer","imhacer"]],["feliz","infeliz",["desfeliz","imfeliz"]],["posible","imposible",["inposible","desposible"]],["ordenado","desordenado",["inordenado","imordenado"]], ["legal","ilegal",["inlegal","deslegal"]],["útil","inútil",["desútil","imútil"]],["cómodo","incómodo",["descómodo","imcómodo"]],["obedecer","desobedecer",["inobedecer","imobedecer"]], ["paciente","impaciente",["inpaciente","despaciente"]],["responsable","irresponsable",["inresponsable","desresponsable"]],["tapar","destapar",["intapar","imtapar"]],["conocido","desconocido",["inconocido","imconocido"]], ["visible","invisible",["desvisible","imvisible"]],["perfecto","imperfecto",["inperfecto","desperfecto"]]]; const PERSONAS=["1.ª persona del singular","2.ª persona del singular","3.ª persona del singular","1.ª persona del plural","2.ª persona del plural","3.ª persona del plural"]; const VERBOS=[["jugaremos","futuro",3],["cantaste","pasado",1],["comen","presente",5],["escribo","presente",0],["vivíais","pasado",4],["saltará","futuro",2], ["bailamos ayer","pasado",3],["leerás","futuro",1],["corréis","presente",4],["pintaron","pasado",5],["dibuja","presente",2],["subiré","futuro",0],["nadabas","pasado",1],["veremos","futuro",3]]; const CCAA=[["Andalucía","Sevilla","Málaga"],["Aragón","Zaragoza","Huesca"],["Principado de Asturias","Oviedo","Gijón"],["Illes Balears","Palma","Ibiza"],["Cantabria","Santander","Torrelavega"], ["Castilla-La Mancha","Toledo","Albacete"],["Cataluña","Barcelona","Girona"],["Comunitat Valenciana","Valencia","Alicante"],["Extremadura","Mérida","Badajoz"],["Galicia","Santiago de Compostela","A Coruña"], ["Comunidad de Madrid","Madrid","Alcalá de Henares"],["Región de Murcia","Murcia","Cartagena"],["Comunidad Foral de Navarra","Pamplona","Tudela"],["País Vasco","Vitoria-Gasteiz","Bilbao"],["La Rioja","Logroño","Calahorra"]]; const RIOS=[["Miño","atlántica"],["Duero","atlántica"],["Tajo","atlántica"],["Guadiana","atlántica"],["Guadalquivir","atlántica"],["Ebro","mediterránea"],["Júcar","mediterránea"],["Segura","mediterránea"],["Turia","mediterránea"],["Llobregat","mediterránea"], ["Nalón","cantábrica"],["Sella","cantábrica"],["Nervión","cantábrica"],["Bidasoa","cantábrica"],["Navia","cantábrica"]]; const PLANTA=[["Absorbe el agua y las sales minerales del suelo.","la raíz"],["Sujeta la planta al suelo.","la raíz"],["Sostiene la planta y transporta la savia.","el tallo"],["Fabrica el alimento de la planta con la luz del sol.","la hoja"], ["Por ella la planta respira y transpira.","la hoja"],["Es el órgano de reproducción de muchas plantas.","la flor"],["Protege las semillas.","el fruto"],["De ella nace una nueva planta.","la semilla"]]; const PARTES=["la raíz","el tallo","la hoja","la flor","el fruto","la semilla"]; const ESTADOS=[["El hielo se convierte en agua líquida.","fusión"],["La cera de una vela se derrite.","fusión"],["Un charco se seca al sol.","evaporación"],["La ropa tendida se seca.","evaporación"], ["El agua se convierte en hielo en el congelador.","solidificación"],["El chocolate fundido se endurece al enfriarse.","solidificación"],["Se empaña el espejo del baño.","condensación"],["Aparecen gotitas en un vaso de agua fría.","condensación"]]; const GRAMMAR=[["There ___ two cats in the garden.","are",["is","am"]],["She ___ got long hair.","has",["have","is"]],["I ___ swim very well.","can",["cans","am"]],["They ___ playing in the park now.","are",["is","be"]], ["What's the time? It's ___ o'clock.","three",["third","thirty"]],["My brother ___ football on Saturdays.","plays",["play","playing"]],["___ is your favourite colour?","What",["Who","Where"]], ["The book is ___ the table.","on",["at","of"]],["I don't like ___ .","carrots",["carrot's","a carrots"]],["We ___ to school by bike.","go",["goes","going"]],["A lion is ___ than a cat.","bigger",["big","biggest"]], ["___ you like pizza? — Yes, I do.","Do",["Does","Are"]],["The opposite of 'hot' is ___.","cold",["warm","sunny"]],["Monday, Tuesday, ___ …","Wednesday",["Thursday","Sunday"]]]; const $=s=>document.querySelector(s); const board=$("#board"); const rand=(a,b)=>a+Math.floor(Math.random()*(b-a+1)); const pick=a=>a[rand(0,a.length-1)]; const shuffle=a=>{a=[...a];for(let i=a.length-1;i>0;i--){const j=Math.floor(Math.random()*(i+1));[a[i],a[j]]=[a[j],a[i]]}return a}; const esc=s=>String(s).replace(/[&<>"]/g,c=>({"&":"&","<":"<",">":">",'"':"""}[c])); const fmt=n=>{const r=Math.round(n*1000)/1000;let [i,d]=String(r).split(".");if(i.length>4)i=i.replace(/\B(?=(\d{3})+(?!\d))/g,".");return d?i+","+d:i}; const ALL=SUBJECTS.flatMap(s=>s.games.map(g=>({...g,subject:s}))); const TRIM=["Todo el curso","1.er trimestre","2.º trimestre","3.er trimestre"]; let current="lectura", soundOn=true, actx=null, trim=0; function tone(ok){ if(!soundOn) return; try{ actx=actx||new (window.AudioContext||window.webkitAudioContext)(); (ok?[660,880]:[220]).forEach((f,i)=>{const o=actx.createOscillator(),g=actx.createGain();o.type="sine";o.frequency.value=f; const t=actx.currentTime+i*.11;g.gain.setValueAtTime(.0001,t);g.gain.exponentialRampToValueAtTime(.16,t+.02);g.gain.exponentialRampToValueAtTime(.0001,t+.25); o.connect(g).connect(actx.destination);o.start(t);o.stop(t+.27)}); }catch(e){} } function shake(el){el.classList.remove("shake");void el.offsetWidth;el.classList.add("shake")} function renderNav(){ $("#trims").innerHTML=TRIM.map((t,k)=>``).join(""); document.querySelectorAll("#trims button").forEach(b=>b.onclick=()=>{trim=+b.dataset.t;renderNav()}); $("#games").innerHTML=SUBJECTS.map(s=>{const gs=s.games.filter(g=>!trim||g.t===0||g.t===trim).sort((a,b)=>a.t-b.t); return `

${s.name}

${gs.length?gs.map(g=>``).join(""):`

Nada este trimestre

`}
`}).join(""); document.querySelectorAll(".game").forEach(b=>b.onclick=()=>{current=b.dataset.id;renderNav();play(ALL.find(x=>x.id===current))}); } /* ---------- Generadores ---------- */ function numOpts(r,extra=[],unit=""){ const s=new Set([fmt(r)+unit]); extra.forEach(x=>{if(s.size<3&&x>=0)s.add(fmt(x)+unit)}); shuffle(Math.abs(r)>=20?[10,-10,1,-1,2]:[1,-1,2,-2]).forEach(d=>{if(s.size<3&&r+d>=0)s.add(fmt(r+d)+unit)}); return shuffle([...s]); } const isFrac=v=>/^\d+\/\d+$/.test(v); const fracHtml=v=>{const [a,b]=v.split("/");return `${a}${b}`}; function toRoman(n){const m=[[1000,"M"],[900,"CM"],[500,"D"],[400,"CD"],[100,"C"],[90,"XC"],[50,"L"],[40,"XL"],[10,"X"],[9,"IX"],[5,"V"],[4,"IV"],[1,"I"]];let s="";for(const [v,r] of m)while(n>=v){s+=r;n-=v}return s} function makeQ(id,used,ctx){ if(id==="lectura"){ const {l,qi}=ctx; const [ask,ok,...bad]=l.q[qi]; return {scene:`

${esc(l.t)}${esc(l.x)}

${esc(ask)}

`,answer:ok,opts:shuffle([ok,...bad]),txt:true}; } if(id==="sustantivos"){ const [w,c]=pick(SUST.filter(x=>!used.has(x[0]))); used.add(w); const why={"propio":"Nombra a un ser o lugar concreto y se escribe con mayúscula.","común individual":"Nombra a un solo ser en singular.","común colectivo":"En singular, nombra a un conjunto de seres."}[c]; return {scene:`

${esc(w)}

`,answer:c,opts:["propio","común individual","común colectivo"],txt:true,why}; } if(id==="prefijos"){ const [w,ok,bad]=pick(PREF.filter(x=>!used.has(x[0]))); used.add(w); return {scene:`

¿Cuál es lo contrario de ${esc(w)}?

`,answer:ok,opts:shuffle([ok,...bad]),txt:true, why:/^im/.test(ok)?"Antes de p y b se escribe im-.":/^ir/.test(ok)?"Antes de r se escribe ir-.":/^i/.test(ok)&&!/^in/.test(ok)?"Antes de l se escribe i-.":""}; } if(id==="verbo"){ const [v,t,p]=pick(VERBOS.filter(x=>!used.has(x[0]))); used.add(v); if(Math.random()<.5) return {scene:`

«${esc(v)}»

¿En qué tiempo está?

`,answer:t,opts:["pasado","presente","futuro"],txt:true}; return {scene:`

«${esc(v)}»

¿En qué persona está?

`,answer:PERSONAS[p],opts:shuffle([PERSONAS[p],...shuffle(PERSONAS.filter((_,k)=>k!==p)).slice(0,2)]),txt:true}; } if(id==="romanos"){ const n=pick([rand(4,40),rand(41,99),rand(100,400),pick([4,9,14,19,24,29,40,44,49,90,99])]); const r=toRoman(n); if(Math.random()<.5){ return {scene:`

${r}

¿Qué número es?

`,answer:String(n),opts:numOpts(n,[n+5,n+10]),why:`${r} = ${n}.`}; } const s=new Set([r]); [toRoman(n+1),toRoman(Math.max(1,n-1)),r.replace("IV","IIII").replace("IX","VIIII"),toRoman(n+10)].forEach(x=>{if(s.size<3&&x!==r)s.add(x)}); return {scene:`

${n}

¿Cómo se escribe en números romanos?

`,answer:r,opts:shuffle([...s]),why:`${n} = ${r}.`}; } if(id==="redondeo"){ const n=rand(10000,999999), k=pick([0,1,2]), unit=[10,100,1000][k], name=["las decenas","las centenas","los millares"][k]; let r=Math.round(n/unit)*unit; const down=Math.floor(n/unit)*unit, up=down+unit; if(n%unit===0) return makeQ(id,used,ctx); return {scene:`

${fmt(n)}

Redondea a ${name}

`,answer:fmt(r),opts:shuffle([fmt(down),fmt(up),fmt(r===up?down-unit:up+unit)]), why:`Lo más cercano a ${fmt(n)} es ${fmt(r)}.`}; } if(id==="problemas"){ const k=rand(0,3); if(k===0){const a=rand(12,25),b=rand(15,30),c=rand(40,150),r=a*b-c; return {scene:`

Un teatro tiene ${a} filas de ${b} butacas. Hoy hay ${c} butacas vacías. ¿Cuántas personas hay en el teatro?

`,answer:fmt(r),opts:numOpts(r,[a*b,a*b+c]),why:`${a} × ${b} = ${a*b}; ${a*b} − ${c} = ${r}.`};} if(k===1){const p=rand(3,9),n=rand(4,8),m=n*p<50?50:100,r=m-n*p; return {scene:`

Compramos ${n} entradas de cine a ${p} € cada una y pagamos con ${m} €. ¿Cuánto nos devuelven?

`,answer:fmt(r),opts:numOpts(r,[n*p,m-p]),why:`${n} × ${p} = ${n*p} €; ${m} − ${n*p} = ${r} €.`};} if(k===2){const b=rand(4,9),c=rand(6,15),x=rand(1,b-1),T=b*c+x; return {scene:`

Tenemos ${T} lápices y los guardamos en cajas de ${b}. ¿Cuántas cajas llenamos?

`,answer:fmt(c),opts:numOpts(c,[c+1,x]),why:`${T} : ${b} = ${c} y sobran ${x}.`};} const a=rand(1200,4800),b=rand(300,900),r=a+b*2; return {scene:`

Una granja tenía ${fmt(a)} gallinas. Cada mes durante 2 meses compró ${b} más. ¿Cuántas gallinas tiene ahora?

`,answer:fmt(r),opts:numOpts(r,[a+b,a+b*3]),why:`${b} × 2 = ${b*2}; ${fmt(a)} + ${b*2} = ${fmt(r)}.`}; } if(id==="fracciones"){ if(Math.random()<.5){ const n=pick([4,5,6,8,10]), k=rand(1,n-1); const cells=shuffle(Array.from({length:n},(_,i)=>i``).join(""); const s=new Set([`${k}/${n}`,`${n-k}/${n}`,`${k}/${n-k}`,`${k+1}/${n}`]); const opts=[...s].filter(x=>x.split("/")[0]!=="0"&&x.split("/")[1]!=="0").slice(0,3); return {scene:`

¿Qué fracción está coloreada?

`, answer:`${k}/${n}`,opts:shuffle(opts),render:true,why:`Denominador: partes totales (${n}). Numerador: partes coloreadas (${k}).`}; } const d=rand(4,12); let a=rand(1,d-1),b=rand(1,d-1); while(b===a)b=rand(1,d-1); return {scene:`

¿Qué fracción es mayor?

`,answer:`${Math.max(a,b)}/${d}`,opts:shuffle([`${a}/${d}`,`${b}/${d}`]),render:true, why:"Con el mismo denominador, es mayor la que tiene mayor numerador."}; } if(id==="decimales"){ const k=rand(0,2); if(k===0){const u=rand(0,9),c=rand(1,9);const r=fmt(u+c/100); return {scene:`

${u} unidades y ${c} centésimas

`,answer:r,opts:shuffle([r,fmt(u+c/10),fmt(u+c/1000)]),why:"Las centésimas van en el segundo lugar después de la coma."};} if(k===1){const d=rand(1,9),u=rand(1,9),n=u+d/10; return {scene:`

${fmt(n)}

¿Cuántas décimas son en total?

`,answer:String(u*10+d),opts:numOpts(u*10+d,[d,u*100+d*10]),why:`${u} unidades = ${u*10} décimas; + ${d} = ${u*10+d}.`};} const a=rand(1,9),x=rand(1,9),y=rand(10,99);const A=a+x/10,B=a+y/100;const big=A>B?A:B; if(Math.abs(A-B)<1e-9) return makeQ(id,used,ctx); return {scene:`

¿Qué número es mayor?

`,answer:fmt(big),opts:shuffle([fmt(A),fmt(B)]),why:"Compara primero las unidades, después las décimas y luego las centésimas."}; } if(id==="medida"){ const k=rand(0,5); const T=[ ()=>{const a=rand(2,9);return [`${a} km`,"m",a*1000]}, ()=>{const a=rand(2,9)*100+pick([0,50]);return [`${a} cm`,"m",a/100]}, ()=>{const a=rand(2,9);return [`${a} kg`,"g",a*1000]}, ()=>{const a=pick([1500,2500,500,3000,750,250]);return [`${a} mL`,"L",a/1000]}, ()=>{const a=rand(2,9);return [`${a} m`,"cm",a*100]}, ()=>{const a=pick([2000,4000,1500,500,3500]);return [`${a} g`,"kg",a/1000]}][k](); const [from,u,r]=T; return {scene:`

${from} = ? ${u}

`,answer:fmt(r)+" "+u,opts:shuffle([...new Set([fmt(r)+" "+u,fmt(r*10)+" "+u,fmt(r/10)+" "+u])]),txt:true}; } if(id==="plantas"){ const [f,p]=pick(PLANTA.filter(x=>!used.has(x[0]))); used.add(f); return {scene:`

${esc(f)}

`,answer:p,opts:shuffle([p,...shuffle(PARTES.filter(x=>x!==p)).slice(0,2)]),txt:true}; } if(id==="materia"){ const [f,e]=pick(ESTADOS.filter(x=>!used.has(x[0]))); used.add(f); const why={fusión:"De sólido a líquido.",evaporación:"De líquido a gas.",solidificación:"De líquido a sólido.",condensación:"De gas a líquido."}[e]; return {scene:`

${esc(f)}

`,answer:e,opts:["fusión","solidificación","evaporación","condensación"],txt:true,why}; } if(id==="capitales"){ const [c,cap,trap]=pick(CCAA.filter(x=>!used.has(x[0]))); used.add(c); const other=pick(CCAA.filter(x=>x[0]!==c))[1]; return {scene:`

${esc(c)}

¿Cuál es su capital?

`,answer:cap,opts:shuffle([cap,trap,other]),txt:true}; } if(id==="rios"){ const [r,v]=pick(RIOS.filter(x=>!used.has(x[0]))); used.add(r); return {scene:`

Río ${esc(r)}

`,answer:v,opts:["cantábrica","atlántica","mediterránea"],txt:true, why:{cantábrica:"Desemboca en el mar Cantábrico.",atlántica:"Desemboca en el océano Atlántico.",mediterránea:"Desemboca en el mar Mediterráneo."}[v]}; } const [s,ok,bad]=pick(GRAMMAR.filter(x=>!used.has(x[0]))); used.add(s); return {scene:`

${esc(s).replace("___",' ? ')}

`,answer:ok,opts:shuffle([ok,...bad]),txt:true, after:()=>`

${esc(s).replace("___",`${esc(ok)}`)}

`}; } /* ---------- Motor ---------- */ function play(g){ const lect=g.id==="lectura", R=lect?6:8; const queue=lect?shuffle(LECTURAS).slice(0,3).flatMap(l=>[{l,qi:0},{l,qi:1}]):[]; let i=0, score=0; const used=new Set(); const head=(extra="")=>`
${g.subject.name}

${g.name}

${HELP[g.id]}

${extra}
`; const next=()=>{ if(i===R) return win(); const q=makeQ(g.id,used,queue[i]); board.innerHTML=head(`
${i+1} / ${R}
`)+ `
${q.scene}
${q.opts.map(o=>``).join("")}

`; let tried=false; board.querySelectorAll(".opt").forEach(b=>b.onclick=()=>{ if(b.disabled) return; if(b.dataset.v===q.answer){ b.classList.add("ok"); tone(true); if(!tried) score++; board.querySelectorAll(".opt").forEach(x=>x.disabled=true); if(q.after){const s=board.querySelector("#qq .sentence"); if(s) s.outerHTML=q.after();} $("#hint").textContent=(tried?"¡Ahora sí! ":"¡Correcto! ")+(q.why||""); i++; setTimeout(next,q.why?2300:1200); }else{ tried=true; b.classList.add("bad"); b.disabled=true; tone(false); shake(b); $("#hint").textContent="Mmm… piénsalo otra vez."; } }); }; const win=()=>{ const msg=score===R?"¡Pleno! Dominio total.":score>=R*0.75?"Muy buen resultado.":score>=R/2?"Bien, pero merece otra ronda.":"Repasemos y volvemos a intentarlo."; board.innerHTML=head()+`
${score} / ${R}

${msg}

`; $("#again").onclick=()=>play(g); }; next(); } $("#sound").onclick=e=>{soundOn=!soundOn;e.currentTarget.textContent="Sonido: "+(soundOn?"sí":"no");e.currentTarget.setAttribute("aria-pressed",soundOn)}; $("#full").onclick=()=>{try{const p=document.fullscreenElement?document.exitFullscreen():board.requestFullscreen();p&&p.catch&&p.catch(()=>{})}catch(e){}}; renderNav(); play(ALL[0]);