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:'',
-f2:'',
+f1:'',
+f2:'',
f3:'',
-f4:'',
-f5:'',
+f4:'',
+f5:'',
f6:''
};
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);
}
}