From ae48088768c86ee5d313476019dc8dc9ae072a5f Mon Sep 17 00:00:00 2001 From: hangshuo652 Date: Mon, 29 Jun 2026 13:37:31 +0800 Subject: [PATCH] =?UTF-8?q?enhance:=20=E8=A7=A3=E6=9E=90=E5=A2=9E=E5=BC=BA?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=20-=20=E6=AF=8F=E9=A2=98=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0=E5=85=AC=E5=BC=8F+=E6=98=93=E9=94=99?= =?UTF-8?q?=E7=82=B9(E=C2=B7W/R=C2=B7U/L=C2=B7E=C2=B7S)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index.html | 104 ++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 88 insertions(+), 16 deletions(-) diff --git a/index.html b/index.html index abd2571..124fa00 100644 --- a/index.html +++ b/index.html @@ -656,11 +656,11 @@ const READINGS = [ ]; const DIAGRAMS={ -f1:'ABCDGFEO1O2', -f2:'ABCDE4cm6cm', +f1:'ABCDGFEO1O2', +f2:'ABCDE4cm6cm', f3:'ABC34半圆', -f4:'ABDC8', -f5:'A', +f4:'ABDC8', +f5:'A', f6:'1←第一排32←第二排456←第三排10987←第四排' }; const SI={"热身圈":"🟡","第一赛段":"🟢","第二赛段":"🔵","第三赛段":"🟠","最终圈":"🔴"}; @@ -725,7 +725,7 @@ function getHintText(q){ '简便运算':'交换律/结合律/分配律巧用','分数计算':'通分后运算','分数比大小':'分母同比分子,分子同比分母', '小数计算':'对齐小数点','百分数':'百分数→小数→分数转化','比和比例':'内项积=外项积', '方程':'移项变号','解方程':'等式两边同加减乘除','列方程':'设未知数→列等量→解', - '行程问题':'速度×时间=距离','工程问题':'效率×时间=总量','分数应用题':'找准单位"1"', + '行程问题':'速度×时间=距离','工程问题':'效率×时间=总量','分数应用题':'找准单位1', '百分数应用题':'百分数×整体=部分','比例应用题':'设比例系数','鸡兔同笼':'假设法或方程法', '周期问题':'找周期→余数对应','植树问题':'段数=棵数±1','年龄问题':'年龄差不变', '定义新运算':'按新规则代入','平面图形':'面积/周长公式','立体图形':'体积/表面积公式', @@ -769,7 +769,7 @@ function renderCard(q,i,hintMode){ } if(d!==undefined){ let kor=(d===q.ans||d===true); - h+='
'+(kor?'✅ PERFECT! 完美通过!':'❌ MISS! 再练练!')+'
🔧 维修站解析:'+q.exp+'
'; + h+='
'+(kor?'✅ PERFECT! 完美通过!':'❌ MISS! 再练练!')+'
🔧 维修站解析:'+enhanceExp(q)+'
'; if(!kor&&d!=='__s__'){ let sims=getSimQuestions(q,3); if(sims.length){ @@ -812,6 +812,78 @@ function buildTrack(total,done){ svg.innerHTML=h; } // === UPDATE === + +// === 增强解析系统 === +const EXP_RULES = { + "行程问题":"\n📐 公式:路程=速度×时间 相遇:S=(v₁+v₂)t 追及:S=(v₂-v₁)t", + "工程问题":"\n📐 公式:总量=效率×时间 合作效率=效率₁+效率₂", + "浓度问题":"\n📐 公式:浓度=溶质÷溶液×100% 十字交叉法:高-目标:目标-低=低质量:高质量", + "鸡兔同笼":"\n📐 解法:假设全鸡→多出脚÷(4-2)=兔数;假设全兔→少了脚÷(4-2)=鸡数", + "牛吃草问题":"\n📐 公式:生长量=(多总量-少总量)÷天数差 原有量=总量-生长×天数", + "盈亏问题":"\n📐 公式:(盈+亏)÷分配差=人数 大盈-小盈也是变种", + "植树问题":"\n📐 两端都种:棵数=段数+1 一端种:棵数=段数 两端不种:棵数=段数-1", + "周期问题":"\n📐 位置÷周期=组数…余数 余数对应周期中的位置", + "时钟问题":"\n📐 分针6°/分 时针0.5°/分 夹角=|30h-5.5m|", + "年龄问题":"\n📐 核心:年龄差不变 设未知数列方程", + "利润与折扣":"\n📐 利润=售价-成本 利润率=利润÷成本×100% 折扣=现价÷原价", + "百分数":"\n📐 部分=整体×百分数 百分数=部分÷整体×100%", + "比例尺":"\n📐 比例尺=图上距离÷实际距离 注意单位统一", + "最大公因数与最小公倍数":"\n📐 最大公因数:取公共质因数最低次 最小公倍数:取所有质因数最高次", + "平面图形":"\n📐 S正=a² S长=ab S三=ah÷2 S梯=(a+b)h÷2 S圆=πr²", + "立体图形":"\n📐 V正=a³ V长=abc V柱=πr²h V锥=⅓πr²h", + "圆柱与圆锥":"\n📐 等底等高:V锥=⅓V柱 S侧=2πrh", + "分数计算":"\n📐 加减:通分 乘:分子乘分子 除:乘以倒数", + "简算巧算":"\n📐 交换律a+b=b+a 结合律(a+b)+c=a+(b+c) 分配律a(b+c)=ab+ac", + "解方程":"\n📐 移项变号 等式两边同加减/同乘除", + "找规律":"\n📐 先看差→再比倍→最后试平方/立方", + "容斥原理":"\n📐 |A∪B|=|A|+|B|-|A∩B| 三集合公式", + "最值问题":"\n📐 和定差小积大 拆数尽量拆3,余2加2,余1变2+2", + "方阵问题":"\n📐 最外层=(边长-1)×4 实心=边长² 空心=外²-内²", + "一般现在时":"\n📐 主语三单→动词+s/es 否定:doesn't+动原 疑问:Does+主+动原?", + "现在进行时":"\n📐 be+doing 现在分词:一般+ing 去e+ing 双写+ing", + "一般过去时":"\n📐 V过去式:规则+ed 不规则单独记 否定:didn't+动原", + "一般将来时":"\n📐 will+动原 / be going to+动原", + "现在完成时":"\n📐 have/has+过去分词 关键词:already/yet/ever/never/just/since/for", + "过去进行时":"\n📐 was/were+doing 表示过去某刻正在进行的动作", + "被动语态":"\n📐 be+过去分词 一般现在:am/is/are+done 过去:was/were+done", + "情态动词":"\n📐 情态+动原 can能力 may允许 must必须 should应该", + "名词复数":"\n📐 一般+s s/x/sh/ch+es 辅音+y→ies f/fe→ves 不规则单独记", + "冠词":"\n📐 a/an(泛指) the(特指) 零冠词:球类/棋类/三餐/学科/by+交通", + "代词":"\n📐 主格做主语(I/you/he) 宾格做宾语(me/you/him) 形代+名(my book) 名代单独用(mine)", + "介词":"\n📐 at+点 in+月年/早上下 on+具体天/日期 for+段 since+点", + "比较级":"\n📐 单音节+er 多音节+more 不规则:good->better->best as+原级+as", + "there be":"\n📐 就近原则:be与最近的主语保持一致", + "be动词":"\n📐 I用am you用are he/she/it用is we/you/they用are", +}; +const EXP_WRONG = { + "行程问题":"\n⚠️ 易错:单位不统一、忘记速度和/速度差、相遇时间≠追及时间", + "工程问题":"\n⚠️ 易错:没统一成1、合作时间混淆", + "浓度问题":"\n⚠️ 易错:溶质和溶液混淆、十字交叉方向搞反", + "鸡兔同笼":"\n⚠️ 易错:假设后的计算方向搞反", + "平面图形":"\n⚠️ 易错:面积周长公式记混、单位换算漏了", + "立体图形":"\n⚠️ 易错:圆锥忘记乘⅓、单位不一致", + "分数计算":"\n⚠️ 易错:加减忘通分、除法忘变倒数", + "解方程":"\n⚠️ 易错:移项忘变号、去括号没乘全", + "冠词":"\n⚠️ 易错:元音看发音不看字母、球类/乐器搞反", + "代词":"\n⚠️ 易错:主格宾格混淆、形代名代不分", + "时态":"\n⚠️ 易错:时间词判断不准、不规则过去分词记不住", +}; + +function enhanceExp(q) { + if (!q || !q.exp) return ""; + var parts = [q.exp]; + // Add formula + var formula = EXP_RULES[q.topic]; + if (formula) parts.push(formula); + // Add wrong tips (only for wrong answers) + var wrongTip = EXP_WRONG[q.topic]; + if (wrongTip) parts.push(wrongTip); + // For math, add "设x" approach hint + if (q.sub === "math" && q.type === "fill" && q.stem.indexOf("设") < 0 && q.stem.indexOf("x") < 0) { + parts.push("\n💡 提示:遇到应用题,先设未知数x,找等量关系列方程"); + } + return parts.join(""); +} function upd(){ let total=Q.length,done=Object.keys(conv).length,cor=0,wr=getWrongIds(); Object.keys(conv).forEach(k=>{let q=Q.find(x=>x.id===k);if(!q)return;if(conv[k]===q.ans)cor++;}); @@ -1072,7 +1144,7 @@ function cli(id,j){ } let fb=document.createElement('div'); fb.className='fb sh '+(kor?'go':'bd'); - fb.innerHTML=(kor?'✅ PERFECT! 完美通过!':'❌ MISS! 再练练!')+'
🔧 维修站解析:'+q.exp; + fb.innerHTML=(kor?'✅ PERFECT! 完美通过!':'❌ MISS! 再练练!')+'
🔧 维修站解析:'+enhanceExp(q); cd.appendChild(fb); if(!kor){ let sims=getSimQuestions(q,3); @@ -1141,7 +1213,7 @@ function cfil(id){ let fb=document.createElement('div'); fb.className='fb sh '+(kor?'go':'bd'); if(kor){ - fb.innerHTML='✅ PERFECT! 完美通过!
🔧 维修站解析:'+q.exp; + fb.innerHTML='✅ PERFECT! 完美通过!
🔧 维修站解析:'+enhanceExp(q); }else{ fb.innerHTML='❌ MISS! 再练练!
🔧 维修站解析:'+q.exp+'
✅ 正确答案:'+q.ans; if(v!==q.ans)fb.innerHTML+='
你的答案: '+v+''; @@ -1805,7 +1877,7 @@ function renderTrophyCabinet() { const done = stageQs.every(function(q) { return conv[q.id] !== undefined; }); const icon = document.createElement("span"); icon.textContent = done ? "🏆" : "▢"; - icon.style.cssText = "font-size:12px;opacity:" + (done ? "1" : "0.2"); + icon.style.cssText = "font-size:12px;opacity:" + (done ? 1 : "0.2"); icon.title = stages[i] + (done ? " ✅" : ""); row.appendChild(icon); } @@ -1943,7 +2015,7 @@ window.recAns = function(id, ok) { const allDone = stageQs.every(function(x) { return conv[x.id] !== undefined; }); const stageLevel = {"热身圈":1,"第一赛段":2,"第二赛段":3,"第三赛段":4,"最终圈":5}; if (allDone && conv[id] !== undefined && !sessionStorage.getItem("podium_" + q.sub + "_" + q.ch)) { - sessionStorage.setItem("podium_" + q.sub + "_" + q.ch, "1"); + sessionStorage.setItem("podium_" + q.sub + "_" + q.ch, 1); setTimeout(function() { showPodium(stageLevel[q.ch] || 1); }, 500); } } @@ -2165,7 +2237,7 @@ function renderTrophyCabinet() { const done = stageQs.every(function(q) { return conv[q.id] !== undefined; }); const icon = document.createElement("span"); icon.textContent = done ? "🏆" : "▢"; - icon.style.cssText = "font-size:12px;opacity:" + (done ? "1" : "0.2"); + icon.style.cssText = "font-size:12px;opacity:" + (done ? 1 : "0.2"); icon.title = stages[i] + (done ? " ✅" : ""); row.appendChild(icon); } @@ -2303,7 +2375,7 @@ window.recAns = function(id, ok) { const allDone = stageQs.every(function(x) { return conv[x.id] !== undefined; }); const stageLevel = {"热身圈":1,"第一赛段":2,"第二赛段":3,"第三赛段":4,"最终圈":5}; if (allDone && conv[id] !== undefined && !sessionStorage.getItem("podium_" + q.sub + "_" + q.ch)) { - sessionStorage.setItem("podium_" + q.sub + "_" + q.ch, "1"); + sessionStorage.setItem("podium_" + q.sub + "_" + q.ch, 1); setTimeout(function() { showPodium(stageLevel[q.ch] || 1); }, 500); } } @@ -2549,7 +2621,7 @@ function renderTrophyCabinet() { const done = stageQs.every(function(q) { return conv[q.id] !== undefined; }); const icon = document.createElement("span"); icon.textContent = done ? "🏆" : "▢"; - icon.style.cssText = "font-size:12px;opacity:" + (done ? "1" : "0.2"); + icon.style.cssText = "font-size:12px;opacity:" + (done ? 1 : "0.2"); icon.title = stages[i] + (done ? " ✅" : ""); row.appendChild(icon); } @@ -2687,7 +2759,7 @@ window.recAns = function(id, ok) { const allDone = stageQs.every(function(x) { return conv[x.id] !== undefined; }); const stageLevel = {"热身圈":1,"第一赛段":2,"第二赛段":3,"第三赛段":4,"最终圈":5}; if (allDone && conv[id] !== undefined && !sessionStorage.getItem("podium_" + q.sub + "_" + q.ch)) { - sessionStorage.setItem("podium_" + q.sub + "_" + q.ch, "1"); + sessionStorage.setItem("podium_" + q.sub + "_" + q.ch, 1); setTimeout(function() { showPodium(stageLevel[q.ch] || 1); }, 500); } } @@ -2933,7 +3005,7 @@ function renderTrophyCabinet() { const done = stageQs.every(function(q) { return conv[q.id] !== undefined; }); const icon = document.createElement("span"); icon.textContent = done ? "🏆" : "▢"; - icon.style.cssText = "font-size:12px;opacity:" + (done ? "1" : "0.2"); + icon.style.cssText = "font-size:12px;opacity:" + (done ? 1 : "0.2"); icon.title = stages[i] + (done ? " ✅" : ""); row.appendChild(icon); } @@ -3071,7 +3143,7 @@ window.recAns = function(id, ok) { const allDone = stageQs.every(function(x) { return conv[x.id] !== undefined; }); const stageLevel = {"热身圈":1,"第一赛段":2,"第二赛段":3,"第三赛段":4,"最终圈":5}; if (allDone && conv[id] !== undefined && !sessionStorage.getItem("podium_" + q.sub + "_" + q.ch)) { - sessionStorage.setItem("podium_" + q.sub + "_" + q.ch, "1"); + sessionStorage.setItem("podium_" + q.sub + "_" + q.ch, 1); setTimeout(function() { showPodium(stageLevel[q.ch] || 1); }, 500); } }