const SUBJECTS=[ {id:"lengua",name:"Lengua",games:[ {id:"lectura",glyph:"Aa",name:"Comprensión lectora",area:"Leer e inferir",t:0}, {id:"tiempos",glyph:"V",name:"Tiempos verbales",area:"Modo indicativo",t:1}, {id:"sujeto",glyph:"S/P",name:"Sujeto y predicado",area:"¿Quién hace la acción?",t:2}, {id:"diacritica",glyph:"él",name:"Tilde diacrítica",area:"él/el, tú/tu, sé/se…",t:1}]}, {id:"mates",name:"Matemáticas",games:[ {id:"potencias",glyph:"x²",name:"Potencias y raíces",area:"Cuadrados, cubos, √",t:1}, {id:"divisibilidad",glyph:"÷",name:"Divisibilidad",area:"Múltiplos y primos",t:1}, {id:"fracciones",glyph:"½",name:"Fracciones",area:"Simplificar y operar",t:2}, {id:"porcentajes",glyph:"%",name:"Porcentajes",area:"Descuentos y cálculo",t:3}, {id:"areas",glyph:"cm²",name:"Área y perímetro",area:"Rectángulos y triángulos",t:3}, {id:"media",glyph:"x̄",name:"La media",area:"Estadística",t:3}]}, {id:"naturales",name:"Ciencias de la Naturaleza",games:[ {id:"aparatos",glyph:"♥",name:"Aparatos del cuerpo",area:"¿A qué aparato pertenece?",t:1}, {id:"energias",glyph:"⚡",name:"Fuentes de energía",area:"Renovables o no",t:3}]}, {id:"sociales",name:"Ciencias Sociales",games:[ {id:"historia",glyph:"⌛",name:"Las edades de la historia",area:"¿En qué edad ocurrió?",t:2}]}, {id:"english",name:"English",games:[ {id:"grammar",glyph:"Key",name:"Grammar practice",area:"A2 Key (KET) style",t:0}]} ]; const HELP={lectura:"Lee el texto y responde.",tiempos:"¿En qué tiempo está el verbo?",sujeto:"Busca el sujeto: concuerda en número y persona con el verbo.",diacritica:"Elige la palabra que completa la frase.", potencias:"Calcula y toca el resultado.",divisibilidad:"Toca el número que cumple la condición.",fracciones:"Calcula y toca el resultado.",porcentajes:"Calcula y toca el resultado.", areas:"Fíjate en las medidas de la figura.",media:"Suma todos los datos y divide entre cuántos hay.",aparatos:"¿A qué aparato pertenece este órgano?",energias:"¿Es una fuente renovable o no renovable?", historia:"¿En qué edad de la historia lo situarías?",grammar:"Choose the correct word."}; /* ---------- Contenidos ---------- */ const LECTURAS=[ {t:"El huerto del colegio",x:"Cuando el ayuntamiento cedió al colegio un terreno abandonado, nadie creía que allí pudiera crecer nada. Los alumnos de 6.º retiraron piedras durante semanas, construyeron un sistema de riego por goteo con botellas recicladas y plantaron tomates, lechugas y calabacines. En junio, el comedor sirvió por primera vez una ensalada hecha con sus propias verduras. La directora comentó que aquel plato tenía un ingrediente que no aparecía en ninguna receta: el esfuerzo.", q:[["¿Qué quiso decir la directora?","Que las verduras costaron mucho trabajo","Que faltaba un ingrediente en la receta","Que la ensalada no estaba buena"],["¿Por qué usaron botellas recicladas?","Para hacer un sistema de riego","Para guardar las semillas","Para decorar el huerto"]]}, {t:"Una carta desde Laponia",x:"Querida Irene: Aquí, en invierno, el sol apenas sale unas horas y la temperatura baja de veinte grados bajo cero. Aun así, la gente no se queda en casa: los niños van al colegio en trineo y por la tarde patinan sobre el lago helado. Lo que más me ha sorprendido es el silencio de la nieve. Ayer vimos una aurora boreal y, aunque hacía un frío terrible, nadie quería volver dentro. Te echo de menos. Un abrazo, Marcos.", q:[["¿Qué tipo de texto es?","Una carta","Una noticia","Un poema"],["¿Por qué nadie quería volver dentro?","Porque la aurora boreal era espectacular","Porque dentro hacía más frío","Porque tenían que patinar"]]}, {t:"El reto de Samuel",x:"Samuel se había apuntado al concurso de ortografía casi por obligación. Durante la primera ronda le temblaban las manos, pero acertó todas las palabras. En la semifinal se equivocó con «exhibición» y pensó que estaba eliminado; sin embargo, el jurado explicó que se contaban los fallos de toda la competición y él solo llevaba uno. En la final escribió «adolescente» sin dudar. No ganó, pero quedó segundo, y aquella tarde se dio cuenta de que los nervios no le habían impedido hacerlo bien.", q:[["¿Cómo se sentía Samuel al principio?","Nervioso","Muy confiado","Aburrido"],["¿Por qué siguió en el concurso tras fallar?","Porque contaban los fallos de todo el concurso","Porque el jurado no lo vio","Porque repitió la palabra"]]}, {t:"Los plásticos del mar",x:"Cada año llegan al mar millones de toneladas de plástico. Una parte flota y forma grandes manchas en los océanos, pero la mayoría se rompe en trozos diminutos llamados microplásticos. Los peces los confunden con alimento y así entran en la cadena alimentaria, hasta llegar a nuestros platos. Reducir el uso de bolsas y botellas de un solo uso y reciclar correctamente son dos gestos sencillos que ayudan a frenar el problema.", q:[["¿Qué son los microplásticos?","Trozos muy pequeños de plástico","Peces muy pequeños","Manchas de petróleo"],["¿Cuál es la intención principal del texto?","Informar y concienciar","Contar una historia inventada","Vender un producto"]]} ]; const TIEMPOS=["presente","pretérito imperfecto","pretérito perfecto simple","pretérito perfecto compuesto","pretérito pluscuamperfecto","futuro simple","futuro compuesto","condicional simple","condicional compuesto"]; const VERBOS=[["canto","presente"],["corres","presente"],["cantaba","pretérito imperfecto"],["comíamos","pretérito imperfecto"],["canté","pretérito perfecto simple"],["vivieron","pretérito perfecto simple"], ["he cantado","pretérito perfecto compuesto"],["hemos leído","pretérito perfecto compuesto"],["había cantado","pretérito pluscuamperfecto"],["habíais escrito","pretérito pluscuamperfecto"], ["cantaré","futuro simple"],["escribirán","futuro simple"],["habremos comido","futuro compuesto"],["beberías","condicional simple"],["saldríamos","condicional simple"],["habría ido","condicional compuesto"]]; const SUJETOS=[["Mis primos de Valencia llegan mañana.","Mis primos de Valencia",["mañana","llegan mañana"]],["Ayer por la tarde jugó Lucía al baloncesto.","Lucía",["Ayer por la tarde","al baloncesto"]], ["El perro de los vecinos ladra toda la noche.","El perro de los vecinos",["toda la noche","los vecinos"]],["Me encantan las películas de miedo.","las películas de miedo",["Me","de miedo"]], ["Por el río bajaban dos barcas.","dos barcas",["el río","Por el río"]],["La profesora de música nos enseñó una canción.","La profesora de música",["una canción","nos"]], ["Llegaron tarde los invitados.","los invitados",["tarde","Llegaron"]],["A Pedro le duele la cabeza.","la cabeza",["A Pedro","le"]], ["En el museo se exponen cuadros antiguos.","cuadros antiguos",["En el museo","se"]],["Nosotros iremos a la playa en julio.","Nosotros",["a la playa","en julio"]],["Me preocupan tus notas.","tus notas",["Me","preocupan"]]]; const DIACRITICA=[["___ me lo dijo ayer.","Él","El"],["___ perro de Ana es enorme.","El","Él"],["¿___ quieres de merienda?","Qué","Que"],["Creo ___ va a llover.","que","qué"],["Este regalo es para ___.","mí","mi"],["___ hermana estudia música.","Mi","Mí"], ["¿___ vienes a casa?","Cuándo","Cuando"],["Te llamo ___ llegue.","cuando","cuándo"],["No ___ la respuesta.","sé","se"],["Lucía ___ peina cada mañana.","se","sé"],["¿Quieres ___ zumo?","más","mas"], ["___ tienes razón.","Tú","Tu"],["¿Dónde está ___ mochila?","tu","tú"],["___ me lo pides, te ayudo.","Si","Sí"],["Le pregunté y me dijo que ___.","sí","si"],["Me gusta el ___ con limón.","té","te"],["Mañana ___ llamo.","te","té"]]; const APARATOS=["digestivo","respiratorio","circulatorio","excretor","nervioso","locomotor"]; const ORGANOS=[["el corazón","circulatorio"],["las arterias","circulatorio"],["las venas","circulatorio"],["los pulmones","respiratorio"],["la tráquea","respiratorio"],["los bronquios","respiratorio"], ["el estómago","digestivo"],["el hígado","digestivo"],["el intestino delgado","digestivo"],["el esófago","digestivo"],["los riñones","excretor"],["la vejiga","excretor"],["la uretra","excretor"], ["el cerebro","nervioso"],["la médula espinal","nervioso"],["los nervios","nervioso"],["el fémur","locomotor"],["el bíceps","locomotor"]]; const ENERGIAS=[["Solar",1,"Procede del Sol, que no se agota."],["Eólica",1,"Aprovecha la fuerza del viento."],["Hidráulica",1,"Aprovecha el agua de los ríos y embalses."],["Geotérmica",1,"Usa el calor del interior de la Tierra."],["Mareomotriz",1,"Aprovecha las mareas."],["Biomasa",1,"Usa restos vegetales que se renuevan."], ["Petróleo",0,"Tardó millones de años en formarse y se agota."],["Carbón",0,"Es un combustible fósil que se agota."],["Gas natural",0,"Es un combustible fósil que se agota."],["Nuclear",0,"Usa uranio, un mineral que se agota."]]; const EDADES=["Prehistoria","Edad Antigua","Edad Media","Edad Moderna","Edad Contemporánea"]; const HECHOS=[["Las pinturas de la cueva de Altamira","Prehistoria"],["La construcción de dólmenes","Prehistoria"],["Los romanos construyen el acueducto de Segovia","Edad Antigua"],["La fundación de Emerita Augusta (Mérida)","Edad Antigua"], ["Al-Ándalus y la construcción de la Alhambra","Edad Media"],["El auge del Camino de Santiago y los monasterios románicos","Edad Media"],["La llegada de Colón a América (1492)","Edad Moderna"],["El reinado de Felipe II","Edad Moderna"], ["Carlos III ilumina las calles de Madrid","Edad Moderna"],["La Constitución de Cádiz (1812)","Edad Contemporánea"],["La llegada del ferrocarril a España","Edad Contemporánea"],["La Constitución española de 1978","Edad Contemporánea"]]; const GRAMMAR=[["She ___ to school by bus every day.","goes",["go","going"]],["We ___ to the cinema last Saturday.","went",["go","gone"]],["There ___ some apples in the fridge.","are",["is","be"]], ["I'm ___ than my brother.","taller",["tallest","more tall"]],["Have you ever ___ to London?","been",["went","go"]],["They ___ playing football now.","are",["is","do"]], ["Look at those clouds! It's ___ to rain.","going",["go","will"]],["How ___ water do you drink?","much",["many","lot"]],["My birthday is ___ May.","in",["on","at"]], ["This is the ___ film I've ever seen.","best",["better","good"]],["I ___ breakfast at eight o'clock yesterday.","had",["have","haved"]],["She ___ English and French.","speaks",["speak","speaking"]], ["The party is ___ Saturday.","on",["in","at"]],["___ you like some cake?","Would",["Do","Are"]],["He didn't ___ his homework.","do",["did","does"]],["You ___ wear a helmet on a bike.","should",["shoulds","to"]]]; 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=>String(Math.round(n*100)/100).replace(".",","); const gcd=(a,b)=>b?gcd(b,a%b):a; 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}`}; const F=(a,b)=>`${a}${b}`; function shapeSvg(kind,b,h){ if(kind==="tri"){return ` ${b} cm${h} cm`} const w=kind==="sq"?170:280, hh=kind==="sq"?170:150, x=(380-w)/2; return ` ${b} cm${h} cm`; } 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==="tiempos"){ const [v,t]=pick(VERBOS.filter(x=>!used.has(x[0]))); used.add(v); return {scene:`

«${esc(v)}»

Modo indicativo. ¿En qué tiempo está?

`,answer:t,opts:shuffle([t,...shuffle(TIEMPOS.filter(x=>x!==t)).slice(0,2)]),txt:true}; } if(id==="sujeto"){ const [s,suj,bad]=pick(SUJETOS.filter(x=>!used.has(x[0]))); used.add(s); return {scene:`

${esc(s)}

¿Cuál es el sujeto?

`,answer:suj,opts:shuffle([suj,...bad]),txt:true, why:"Truco: cambia el verbo a singular o plural; la parte que también cambia es el sujeto."}; } if(id==="diacritica"){ const [s,ok,bad]=pick(DIACRITICA.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)}`)}

`}; } if(id==="potencias"){ const k=rand(0,2); if(k===0){const a=rand(2,12);return {scene:`

${a}2 = ?

`,answer:fmt(a*a),opts:numOpts(a*a,[a*2,a*a+a]),why:`${a} × ${a} = ${a*a}.`};} if(k===1){const a=rand(2,6),b=a===2?rand(3,5):3,r=a**b;return {scene:`

${a}${b} = ?

`,answer:fmt(r),opts:numOpts(r,[a*b,a**(b-1)]),why:`${Array(b).fill(a).join(" × ")} = ${r}.`};} const a=rand(2,12);return {scene:`

√${a*a} = ?

`,answer:fmt(a),opts:numOpts(a,[a*a/2>a?Math.round(a*a/2):a+3]),why:`${a} × ${a} = ${a*a}.`}; } if(id==="divisibilidad"){ if(Math.random()<.5){ const p=pick([2,3,5,7,11,13,17,19,23,29,31,37,41,43,47]), c=shuffle([9,15,21,25,27,33,35,39,45,49,51,57,63,77,91]).slice(0,2); return {scene:`

¿Cuál es un número primo?

`,answer:String(p),opts:shuffle([p,...c].map(String)),why:`${p} solo es divisible entre 1 y entre sí mismo.`}; } const k=pick([3,4,6,9]), m=k*rand(4,15), s=new Set([m]); while(s.size<3){const x=m+rand(-9,9);if(x>0&&x%k)s.add(x)} return {scene:`

¿Cuál es múltiplo de ${k}?

`,answer:String(m),opts:shuffle([...s].map(String)),why:`${m} = ${k} × ${m/k}.`}; } if(id==="fracciones"){ const k=rand(0,2); if(k===0){let q=rand(3,9),p=rand(1,q-1);while(gcd(p,q)!==1)p=rand(1,q-1);const m=rand(2,6),A=p*m,B=q*m; const s=new Set([`${p}/${q}`,`${q}/${p}`]); s.add(m%2===0&&m>2?`${A/2}/${B/2}`:`${p+1}/${q}`); return {scene:`

Escribe la fracción irreducible

${F(A,B)}

`,answer:`${p}/${q}`,opts:shuffle([...s]),render:true,why:`Divide numerador y denominador entre ${m}.`};} if(k===1){const d=pick([3,4,5,8,10]),n=rand(1,d-1),Q=d*rand(3,12),r=Q/d*n; return {scene:`

${F(n,d)} de ${Q} = ?

`,answer:fmt(r),opts:numOpts(r,[Q/d,Q-r]),why:`${Q} : ${d} = ${Q/d}; ${Q/d} × ${n} = ${r}.`};} const d=rand(5,12),a=rand(1,d-2),op=Math.random()<.5;let b=rand(1,d-1-a);if(!op&&b===a)b=a===1?2:a-1; const x=op?a+b:Math.max(a,b)-Math.min(a,b),A=op?a:Math.max(a,b),B=op?b:Math.min(a,b); const s=new Set([`${x}/${d}`,`${x}/${op?2*d:d+1}`,`${x+1}/${d}`]); return {scene:`

${F(A,d)} ${op?"+":"−"} ${F(B,d)} = ?

`,answer:`${x}/${d}`,opts:shuffle([...s]),render:true,why:"Con igual denominador, se opera solo el numerador."}; } if(id==="porcentajes"){ if(Math.random()<.5){const p=pick([10,20,25,50,75,15,30]),n=pick([20,40,60,80,100,120,200,300,400]),r=n*p/100; return {scene:`

${p} % de ${n} = ?

`,answer:fmt(r),opts:numOpts(r,[n-r,p]),why:`${n} × ${p} : 100 = ${fmt(r)}.`};} const P=rand(2,12)*10,d=pick([10,20,25,50]),r=P-P*d/100; return {scene:`

Unas zapatillas cuestan ${P} € y tienen un ${d} % de descuento. ¿Cuánto pagas?

`,answer:fmt(r)+" €",opts:numOpts(r,[P*d/100,P-d]," €"),why:`Descuento: ${fmt(P*d/100)} €. ${P} − ${fmt(P*d/100)} = ${fmt(r)} €.`}; } if(id==="areas"){ const k=rand(0,3); if(k===0){const b=rand(5,14),h=rand(3,9);return {scene:shapeSvg("rect",b,h)+`

¿Cuál es el área del rectángulo?

`,answer:`${b*h} cm²`,opts:shuffle([`${b*h} cm²`,`${2*(b+h)} cm²`,`${b+h} cm²`].filter((x,i,a)=>a.indexOf(x)===i)),txt:true,why:`Área = base × altura = ${b} × ${h}.`};} if(k===1){const b=rand(5,14),h=rand(3,9);return {scene:shapeSvg("rect",b,h)+`

¿Cuál es el perímetro del rectángulo?

`,answer:`${2*(b+h)} cm`,opts:shuffle([`${2*(b+h)} cm`,`${b*h} cm`,`${b+h} cm`].filter((x,i,a)=>a.indexOf(x)===i)),txt:true,why:`Perímetro = ${b} + ${h} + ${b} + ${h}.`};} if(k===2){const l=rand(3,12);return {scene:shapeSvg("sq",l,l)+`

¿Cuál es el área del cuadrado?

`,answer:`${l*l} cm²`,opts:shuffle([`${l*l} cm²`,`${4*l} cm²`,`${2*l} cm²`].filter((x,i,a)=>a.indexOf(x)===i)),txt:true,why:`Área = lado × lado = ${l} × ${l}.`};} const b=rand(3,9)*2,h=rand(4,10);return {scene:shapeSvg("tri",b,h)+`

¿Cuál es el área del triángulo?

`,answer:`${b*h/2} cm²`,opts:shuffle([`${b*h/2} cm²`,`${b*h} cm²`,`${b+h} cm²`]),txt:true,why:`Área = (base × altura) : 2 = ${b*h} : 2.`}; } if(id==="media"){ const n=pick([4,5]),m=rand(4,8); let v=Array.from({length:n-1},()=>rand(3,10)), last=m*n-v.reduce((a,b)=>a+b,0); while(last<0||last>10){v=Array.from({length:n-1},()=>rand(3,10));last=m*n-v.reduce((a,b)=>a+b,0)} v.push(last); v=shuffle(v); const sum=m*n; return {scene:`

Notas de un examen

${v.map(x=>`${x}`).join("")}

¿Cuál es la media?

`,answer:fmt(m),opts:numOpts(m,[sum,m+1]),why:`(${v.join(" + ")}) : ${n} = ${sum} : ${n} = ${m}.`}; } if(id==="aparatos"){ const [o,a]=pick(ORGANOS.filter(x=>!used.has(x[0]))); used.add(o); return {scene:`

${esc(o[0].toUpperCase()+o.slice(1))}

¿A qué aparato pertenece?

`,answer:"aparato "+a,opts:shuffle([a,...shuffle(APARATOS.filter(x=>x!==a)).slice(0,2)]).map(x=>"aparato "+x),txt:true}; } if(id==="energias"){ const [e,r,why]=pick(ENERGIAS.filter(x=>!used.has(x[0]))); used.add(e); return {scene:`

Energía: ${esc(e.toLowerCase())}

`,answer:r?"renovable":"no renovable",opts:["renovable","no renovable"],txt:true,why}; } if(id==="historia"){ const [h,e]=pick(HECHOS.filter(x=>!used.has(x[0]))); used.add(h); return {scene:`

${esc(h)}

`,answer:e,opts:EDADES,txt:true}; } 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]);