const SUBJECTS=[ {id:"lengua",name:"Lengua y Literatura",games:[ {id:"recursos",glyph:"≈",name:"Recursos literarios",area:"Metáfora, comparación…",t:1}, {id:"bvgj",glyph:"b/v",name:"Ortografía b/v, g/j",area:"¿Cómo se escribe?",t:1}, {id:"categorias",glyph:"Sust.",name:"Categorías gramaticales",area:"Las clases de palabras",t:0}, {id:"diptongos",glyph:"ío",name:"Diptongo o hiato",area:"Acentuación",t:3}]}, {id:"mates",name:"Matemáticas",games:[ {id:"divisibilidad",glyph:"mcd",name:"m.c.d. y m.c.m.",area:"Divisibilidad",t:1}, {id:"enteros",glyph:"±",name:"Números enteros",area:"Operaciones con signos",t:1}, {id:"fracciones",glyph:"½",name:"Operaciones con fracciones",area:"Suma, resta, producto, cociente",t:1}, {id:"ecuaciones",glyph:"x",name:"Ecuaciones de primer grado",area:"Álgebra",t:2}, {id:"proporcion",glyph:"%",name:"Proporcionalidad",area:"Regla de tres y porcentajes",t:2}, {id:"pitagoras",glyph:"a²",name:"Teorema de Pitágoras",area:"Triángulos rectángulos",t:3}, {id:"estadistica",glyph:"x̄",name:"Media, mediana y moda",area:"Estadística",t:3}]}, {id:"naturales",name:"Biología y Geología",games:[ {id:"celula",glyph:"◉",name:"La célula",area:"Orgánulos y funciones",t:1}, {id:"invertebrados",glyph:"🐙",name:"Invertebrados",area:"Grupos de animales",t:2}]}, {id:"sociales",name:"Geografía e Historia",games:[ {id:"continentes",glyph:"🌍",name:"Relieve y continentes",area:"Geografía física",t:1}, {id:"grecia",glyph:"🏛",name:"¿Grecia o Roma?",area:"La Edad Antigua",t:3}]}, {id:"english",name:"English",games:[ {id:"grammar",glyph:"A2",name:"Grammar practice",area:"A2 level",t:0}]} ]; const HELP={recursos:"¿Qué recurso literario aparece?",bvgj:"Toca la palabra bien escrita.",categorias:"¿Qué categoría gramatical es la palabra marcada?",diptongos:"¿Las vocales marcadas forman diptongo o hiato?", divisibilidad:"Calcula y toca el resultado.",enteros:"Cuidado con los signos.",fracciones:"Opera y simplifica el resultado.",ecuaciones:"Despeja la x.",proporcion:"Plantea la regla de tres o el porcentaje.", pitagoras:"a² + b² = c²",estadistica:"Ordena los datos antes de calcular.",celula:"¿Qué orgánulo es?",invertebrados:"¿A qué grupo pertenece?",continentes:"¿En qué continente está?",grecia:"¿A qué civilización pertenece?",grammar:"Choose the correct option."}; const RECURSOS=["metáfora","comparación","personificación","hipérbole","anáfora"]; const FRASES_REC=[["Tus ojos son dos luceros.","metáfora"],["Sus dientes eran perlas.","metáfora"],["El río de tu pelo caía sobre los hombros.","metáfora"], ["Es blanco como la nieve.","comparación"],["Corría como un rayo.","comparación"],["Su voz era dulce como la miel.","comparación"], ["El viento susurraba entre los árboles.","personificación"],["La luna nos miraba desde el cielo.","personificación"],["Las estrellas bailaban en la noche.","personificación"], ["Te lo he dicho un millón de veces.","hipérbole"],["Me muero de hambre.","hipérbole"],["Tengo una montaña de deberes.","hipérbole"], ["Quiero escribir, quiero gritar, quiero cantar.","anáfora"],["Cada día te espero, cada día te busco, cada día te llamo.","anáfora"],["Todo pasa, todo cambia, todo vuelve.","anáfora"]]; const RECWHY={metáfora:"Se identifica un elemento real con uno imaginario, sin «como».",comparación:"Se relacionan dos elementos con un nexo («como»).",personificación:"Se atribuyen cualidades humanas a algo que no lo es.",hipérbole:"Se exagera la realidad.",anáfora:"Se repite una palabra al principio de varias frases o versos."}; const BVGJ=[["recibir","recivir"],["vivir","bibir"],["biblioteca","viblioteca"],["nuevo","nuebo"],["obstáculo","ovstáculo"],["bebía","bevía"],["favorito","faborito"],["servir","serbir"],["hervir","herbir"],["escribir","escrivir"], ["coger","cojer"],["viaje","viage"],["mensaje","mensage"],["agencia","ajencia"],["exigir","exijir"],["garaje","garage"],["ejemplo","egemplo"],["gente","jente"],["lejía","legía"],["dijeron","digeron"]]; const CATS=["sustantivo","determinante","pronombre","adjetivo","verbo","adverbio","preposición","conjunción","interjección"]; const GRAM=[["El *bosque* estaba en silencio.","sustantivo"],["Compré *esas* zapatillas ayer.","determinante"],["*Nosotros* llegamos los primeros.","pronombre"],["Tiene un perro muy *cariñoso*.","adjetivo"], ["Los alumnos *investigaron* el tema.","verbo"],["Hablaba *lentamente*.","adverbio"],["Dejé la mochila *bajo* la mesa.","preposición"],["Quería salir, *pero* llovía.","conjunción"],["¡*Ay*, qué susto!","interjección"], ["*Alguien* ha dejado la puerta abierta.","pronombre"],["*Varios* amigos vinieron a verme.","determinante"],["La *libertad* es un derecho.","sustantivo"],["*Nunca* he estado en Roma.","adverbio"],["Estudia *y* aprobarás.","conjunción"],["El agua estaba *helada*.","adjetivo"],["Viajamos *desde* Sevilla.","preposición"]]; const DIPT=[["camión","ca-mión","diptongo"],["río","rí-o","hiato"],["país","pa-ís","hiato"],["cielo","cie-lo","diptongo"],["caer","ca-er","hiato"],["aula","au-la","diptongo"],["poeta","po-e-ta","hiato"],["rueda","rue-da","diptongo"], ["león","le-ón","hiato"],["ciudad","ciu-dad","diptongo"],["maíz","ma-íz","hiato"],["oído","o-í-do","hiato"],["jaula","jau-la","diptongo"],["peine","pei-ne","diptongo"],["búho","bú-ho","hiato"],["huevo","hue-vo","diptongo"]]; const ORG=["núcleo","mitocondria","cloroplasto","membrana plasmática","pared celular","ribosoma","vacuola"]; const CELULA=[["Contiene el material genético (ADN).","núcleo"],["Obtiene energía de los nutrientes mediante la respiración celular.","mitocondria"],["Realiza la fotosíntesis. Solo está en células vegetales.","cloroplasto"], ["Controla la entrada y salida de sustancias.","membrana plasmática"],["Da rigidez y forma a la célula vegetal.","pared celular"],["Fabrica las proteínas.","ribosoma"],["Almacena agua y otras sustancias.","vacuola"]]; const GRUPOS=["artrópodos","moluscos","anélidos","equinodermos","cnidarios","poríferos"]; const INV=[["Araña","🕷️","artrópodos"],["Mosca","🪰","artrópodos"],["Cangrejo","🦀","artrópodos"],["Mariposa","🦋","artrópodos"],["Caracol","🐌","moluscos"],["Pulpo","🐙","moluscos"],["Mejillón","🦪","moluscos"], ["Lombriz de tierra","🪱","anélidos"],["Sanguijuela","🪱","anélidos"],["Estrella de mar","⭐","equinodermos"],["Erizo de mar","🌊","equinodermos"],["Medusa","🪼","cnidarios"],["Coral","🪸","cnidarios"],["Esponja de mar","🧽","poríferos"]]; const CONTS=["Europa","Asia","África","América","Oceanía","Antártida"]; const LUGARES=[["El monte Everest","Asia"],["El río Nilo","África"],["El río Amazonas","América"],["El río Danubio","Europa"],["El Kilimanjaro","África"],["La cordillera de los Andes","América"],["Los Alpes","Europa"], ["El Himalaya","Asia"],["El desierto del Sáhara","África"],["El río Misisipi","América"],["El río Volga","Europa"],["El desierto de Gobi","Asia"],["Uluru (Ayers Rock)","Oceanía"],["El polo sur","Antártida"]]; const ANTIGUA=[["El Partenón","Antigua Grecia"],["El Coliseo","Antigua Roma"],["Los primeros Juegos Olímpicos","Antigua Grecia"],["Julio César","Antigua Roma"],["El acueducto de Segovia","Antigua Roma"],["La democracia ateniense","Antigua Grecia"], ["El Senado y las legiones","Antigua Roma"],["Homero y la Odisea","Antigua Grecia"],["El latín","Antigua Roma"],["Sócrates y Platón","Antigua Grecia"],["Pompeya","Antigua Roma"],["Esparta","Antigua Grecia"],["La provincia de Hispania","Antigua Roma"],["El oráculo de Delfos","Antigua Grecia"]]; const GRAMMAR=[["I have ___ finished my homework.","just",["yet","ago"]],["She was reading when the phone ___.","rang",["was ringing","rings"]],["There ___ a lot of people at the concert yesterday.","were",["was","are"]], ["You ___ wear a seatbelt. It's the law.","must",["can","might"]],["This is ___ book I've ever read.","the most interesting",["more interesting","the more interesting"]],["Have you ever ___ sushi?","eaten",["ate","eat"]], ["I've lived here ___ 2020.","since",["for","from"]],["We were walking home ___ it started to rain.","when",["while","during"]],["You look tired. You ___ go to bed.","should",["must to","would"]], ["My brother isn't as tall ___ me.","as",["than","like"]],["How ___ have you been learning English?","long",["much","many"]],["I didn't ___ to the party last night.","go",["went","gone"]]]; 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="recursos", 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 comunes ---------- */ 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 fmtI=n=>n<0?"−"+fmt(-n):fmt(n); function intOpts(r,extra=[]){ const s=new Set([fmtI(r)]); extra.forEach(x=>{if(s.size<3)s.add(fmtI(x))}); shuffle([1,-1,2,-2,10]).forEach(d=>{if(s.size<3)s.add(fmtI(r+d))}); return shuffle([...s]); } const isFrac=v=>/^−?\d+\/\d+$/.test(v); const fracHtml=v=>{const neg=v.startsWith("−");const [a,b]=v.replace("−","").split("/");return `${neg?"−":""}${a}${b}`}; const F=(a,b)=>`${a}${b}`; const gcd=(a,b)=>b?gcd(b,a%b):Math.abs(a); function fr(n,d){if(d<0){n=-n;d=-d}const g=gcd(Math.abs(n),d)||1;n/=g;d/=g;return d===1?fmtI(n):(n<0?"−":"")+Math.abs(n)+"/"+d} const SUP={"0":"⁰","1":"¹","2":"²","3":"³","4":"⁴","5":"⁵","6":"⁶","7":"⁷","8":"⁸","9":"⁹"}; const sup=n=>String(n).split("").map(c=>SUP[c]).join(""); 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} const par=n=>n<0?`(${fmtI(n)})`:fmtI(n); function listQ(list,used,key=0){const it=pick(list.filter(x=>!used.has(x[key])));used.add(it[key]);return it} function sentenceHtml(s){return esc(s).replace(/\*(.+?)\*/,"$1")} function blankQ(s,ok,bad){return {scene:`

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

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

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

`}} function pickOpts(ok,all,n=3){return shuffle([ok,...shuffle(all.filter(x=>x!==ok)).slice(0,n-1)])} function rightTri(a,b,c,ask){ const lab=(v,k)=>k===ask?"?":`${v} cm`; return ` ${lab(a,"a")}${lab(b,"b")}${lab(c,"c")}`; } /* ---------- Preguntas ---------- */ function makeQ(id,used){ if(id==="recursos"){const [f,r]=listQ(FRASES_REC,used);return {scene:`

«${esc(f)}»

`,answer:r,opts:pickOpts(r,RECURSOS),txt:true,why:RECWHY[r]};} if(id==="bvgj"){const [ok,bad]=listQ(BVGJ,used);return {scene:`

¿Cuál está bien escrita?

`,answer:ok,opts:shuffle([ok,bad]),txt:true};} if(id==="categorias"){const [s,c]=listQ(GRAM,used);return {scene:`

${sentenceHtml(s)}

`,answer:c,opts:pickOpts(c,CATS),txt:true};} if(id==="diptongos"){const [w,sy,t]=listQ(DIPT,used);return {scene:`

${esc(w)}

`,answer:t,opts:["diptongo","hiato"],txt:true, why:t==="hiato"?`Las vocales van en sílabas distintas: ${sy}.`:`Las vocales van en la misma sílaba: ${sy}.`};} if(id==="divisibilidad"){ const g=rand(2,8); let x=rand(2,7),y=rand(2,7); while(y===x||gcd(x,y)!==1){x=rand(2,7);y=rand(2,7)} const a=g*x,b=g*y,mcd=g,mcm=g*x*y,askMcd=Math.random()<.5; if(askMcd){const s=new Set([mcd,mcm]);[1,g*2,g*x].forEach(v=>{if(s.size<3&&!(a%v===0&&b%v===0&&v!==g))s.add(v)}); return {scene:`

m.c.d.(${a}, ${b}) = ?

`,answer:fmt(mcd),opts:shuffle([...s].map(fmt)),why:`${a} = ${g} × ${x} y ${b} = ${g} × ${y}: el mayor divisor común es ${g}.`};} const s=new Set([mcm,a*b===mcm?mcm*2:a*b,mcd]); return {scene:`

m.c.m.(${a}, ${b}) = ?

`,answer:fmt(mcm),opts:shuffle([...s].map(fmt)),why:`${mcm} es el menor número que es múltiplo de ${a} y de ${b}.`}; } if(id==="enteros"){ const nz=()=>{let v=0;while(!v)v=rand(-12,12);return v}; const a=nz(),b=nz(),op=pick(["+","−","×"]); const r=op==="+"?a+b:op==="−"?a-b:a*b; const ex=op==="+"?[a-b,-r]:op==="−"?[a+b,-r]:[-r,a+b]; return {scene:`

${par(a)} ${op} ${par(b)} = ?

`,answer:fmtI(r),opts:intOpts(r,ex),why:op==="×"?"Signos iguales: positivo. Signos distintos: negativo.":""}; } if(id==="fracciones"){ const q1=rand(2,6),q2=rand(2,6),p1=rand(1,q1+2),p2=rand(1,q2+2),op=pick(["+","−","×",":"]); let n,d,wrong; if(op==="+"){n=p1*q2+p2*q1;d=q1*q2;wrong=fr(p1+p2,q1+q2)} else if(op==="−"){n=p1*q2-p2*q1;d=q1*q2;wrong=fr(p1-p2,Math.max(1,Math.abs(q1-q2)))} else if(op==="×"){n=p1*p2;d=q1*q2;wrong=fr(p1*q2,q1*p2)} else {n=p1*q2;d=q1*p2;wrong=fr(p1*p2,q1*q2)} const ok=fr(n,d); const s=new Set([ok,wrong]); let k=1; while(s.size<3){s.add(fr(n+k,d));k++} return {scene:`

${F(p1,q1)} ${op} ${F(p2,q2)} = ?

`,answer:ok,opts:shuffle([...s]),render:true, why:{"+":"Reduce a común denominador y suma los numeradores.","−":"Reduce a común denominador y resta los numeradores.","×":"Numerador por numerador y denominador por denominador.",":":"Multiplica en cruz."}[op]}; } if(id==="ecuaciones"){ const x=rand(-9,9),a=rand(2,9),b=rand(-15,15)||3,c=a*x+b; const lhs=`${a}x ${b<0?"−":"+"} ${Math.abs(b)}`; const s=new Set([x]);[-x,c-b,x+1].forEach(v=>{if(s.size<3)s.add(v)}); return {scene:`

${lhs} = ${fmtI(c)}

`,answer:"x = "+fmtI(x),opts:shuffle([...s].map(v=>"x = "+fmtI(v))),txt:true, why:`${a}x = ${fmtI(c)} ${b<0?"+":"−"} ${Math.abs(b)} = ${fmtI(c-b)}; x = ${fmtI(c-b)} : ${a} = ${fmtI(x)}.`}; } if(id==="proporcion"){ const k=rand(0,2); if(k===0){const p=pick([1.5,2,2.5,3,3.5,4]),n1=rand(2,5),n2=rand(6,12),r=p*n2; return {scene:`

Si ${n1} cuadernos cuestan ${fmt(p*n1)} €, ¿cuánto cuestan ${n2} cuadernos?

`,answer:fmt(r)+" €",opts:numOpts(r,[p*n1+n2,r+p]," €"),txt:true,why:`Cada cuaderno cuesta ${fmt(p)} €; ${fmt(p)} × ${n2} = ${fmt(r)} €.`};} if(k===1){const p=pick([5,10,15,20,25,30,40,60,75]),n=pick([40,60,80,120,160,200,240,300,500]),r=n*p/100; return {scene:`

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

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

Un abono de ${P} € sube un ${p} %. ¿Cuánto cuesta ahora?

`,answer:fmt(r)+" €",opts:numOpts(r,[P*p/100,P+p]," €"),txt:true,why:`${P} × ${fmt(1+p/100)} = ${fmt(r)} €.`}; } if(id==="pitagoras"){ const [a0,b0,c0]=pick([[3,4,5],[6,8,10],[5,12,13],[8,15,17],[9,12,15],[12,16,20],[7,24,25]]); if(Math.random()<.6){const s=new Set([c0,a0+b0,c0+1]); return {scene:rightTri(a0,b0,c0,"c")+`

¿Cuánto mide la hipotenusa?

`,answer:c0+" cm",opts:shuffle([...s].map(v=>v+" cm")),txt:true,why:`√(${a0}² + ${b0}²) = √${a0*a0+b0*b0} = ${c0}.`};} const s=new Set([b0,c0-a0,b0+2]); return {scene:rightTri(a0,b0,c0,"b")+`

¿Cuánto mide el cateto que falta?

`,answer:b0+" cm",opts:shuffle([...s].map(v=>v+" cm")),txt:true,why:`√(${c0}² − ${a0}²) = √${c0*c0-a0*a0} = ${b0}.`}; } if(id==="estadistica"){ const n=pick([5,7]); let v; do{const base=shuffle([1,2,3,4,5,6,7,8,9,10]).slice(0,n-1);v=shuffle([...base,pick(base)])}while(v.reduce((a,b)=>a+b,0)%n); const sorted=[...v].sort((a,b)=>a-b), media=v.reduce((a,b)=>a+b,0)/n, mediana=sorted[(n-1)/2]; const cnt={};v.forEach(x=>cnt[x]=(cnt[x]||0)+1); const moda=+Object.keys(cnt).find(k=>cnt[k]===2); const kind=pick(["media","mediana","moda"]), r={media,mediana,moda}[kind]; const s=new Set([fmt(r)]);[media,mediana,moda,r+1,r-1].forEach(x=>{if(s.size<3&&x>=0)s.add(fmt(x))}); return {scene:`
${v.map(x=>`${x}`).join("")}

¿Cuál es la ${kind}?

`,answer:fmt(r),opts:shuffle([...s]), why:{media:`Suma (${v.reduce((a,b)=>a+b,0)}) entre ${n} = ${fmt(media)}.`,mediana:`Ordenados: ${sorted.join(", ")}. El del centro es ${mediana}.`,moda:`El ${moda} es el que más se repite.`}[kind]}; } if(id==="celula"){const [f,o]=listQ(CELULA,used);return {scene:`

${esc(f)}

`,answer:o,opts:pickOpts(o,ORG),txt:true};} if(id==="invertebrados"){const [n,e,g]=listQ(INV,used);return {scene:`

${e}

${esc(n)}

`,answer:g,opts:pickOpts(g,GRUPOS),txt:true};} if(id==="continentes"){const [l,c]=listQ(LUGARES,used);return {scene:`

${esc(l)}

`,answer:c,opts:pickOpts(c,CONTS),txt:true};} if(id==="grecia"){const [h,c]=listQ(ANTIGUA,used);return {scene:`

${esc(h)}

`,answer:c,opts:["Antigua Grecia","Antigua Roma"],txt:true};} const [s,ok,bad]=listQ(GRAMMAR,used); return blankQ(s,ok,bad); } /* ---------- 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]);