F1知识拉力赛 v2.0 - 360题 + 知识图谱 + 弱点诊断 + 限时模考 + F1情绪价值引擎
This commit is contained in:
+3124
@@ -0,0 +1,3124 @@
|
||||
|
||||
{"id":"m401","src":"鐪熼","sub":"math","ch":"绗笁璧涙","topic":"鐗涘悆鑽夐棶棰?,"type":"fill","stem":"涓€鐗囪崏鍦版瘡澶╁寑閫熺敓闀裤€傚鏋?4澶寸墰鍚冿紝6澶╁悆瀹岋紱濡傛灉21澶寸墰鍚冿紝8澶╁悆瀹屻€傛渶灏戝灏戝ご鐗涘彲浠ヤ竴鐩村悆涓嶅畬锛?,"opts":null,"ans":"12","exp":"璁炬瘡澶寸墰姣忓ぉ鍚?浠姐€?4*6=144浠斤紝21*8=168浠姐€傛瘡澶╃敓闀?(168-144)/(8-6)=12浠姐€傚師鏈夎崏=144-12*6=72浠姐€傝浣胯崏姘歌繙鍚冧笉瀹岋紝鐗涚殑鏁伴噺<=姣忓ぉ鐢熼暱閲忥紝鍗?=12澶淬€?},
|
||||
{"id":"m402","src":"鐪熼","sub":"math","ch":"绗笁璧涙","topic":"鐗涘悆鑽夐棶棰?,"type":"fill","stem":"涓€涓按姹犳湁涓€涓繘姘寸鍜?涓帓姘寸銆傚崟寮€杩涙按绠?0鍒嗛挓娉ㄦ弧锛涘悓鏃跺紑5涓帓姘寸锛?0鍒嗛挓鎺掔┖銆傚厛寮€杩涙按绠?0鍒嗛挓鍚庯紝鍐嶅紑鎵€鏈夋帓姘寸锛屽灏戝垎閽熷悗鎺掔┖锛?,"opts":null,"ans":"15","exp":"璁炬€绘按閲?銆傝繘姘存晥鐜?/60锛屾帓姘存晥鐜?/20銆傝繘姘寸30鍒嗛挓娉ㄥ叆1/2銆傝x鍒嗛挓鍚庢帓绌猴細杩涙按=鎺掓按锛?1/60)*(30+x)=(1/20)*x锛岃В寰梮=15銆傛敞鎰忔帓姘存椂杩涙按绠′粛鍦ㄨ繘姘淬€?},
|
||||
{"id":"m403","src":"鐪熼","sub":"math","ch":"绗笁璧涙","topic":"鐩堜簭闂","type":"choice","stem":"骞煎効鍥€佸笀缁欏皬鏈嬪弸鍒嗙硸鏋溿€傛瘡浜哄垎3棰楀8棰楋紱姣忎汉鍒?棰楀皯6棰椼€傛湁鍑犱釜灏忔湅鍙嬶紵鍑犻绯栨灉锛?,"opts":["A. 6涓? 26棰?,"B. 7涓? 29棰?,"C. 8涓? 32棰?,"D. 9涓? 35棰?],"ans":1,"exp":"鐩堜簭鍏紡锛?鐩?浜?/涓ゆ鍒嗛厤宸?浜烘暟銆?8+6)/(5-3)=14/2=7浜恒€傜硸鏋?7*3+8=29棰椼€?},
|
||||
{"id":"m404","src":"鐪熼","sub":"math","ch":"绗笁璧涙","topic":"鐩堜簭闂","type":"choice","stem":"鍏ㄧ彮鍚屽鍘诲垝鑸广€傚鏋滃鍔犱竴鏉¤埞锛屾瘡鏉¤埞姝eソ鍧?浜猴紱濡傛灉鍑忓皯涓€鏉¤埞锛屾瘡鏉¤埞姝eソ鍧?浜恒€傚叏鐝灏戜汉锛?,"opts":["A. 36","B. 32","C. 40","D. 30"],"ans":0,"exp":"璁惧師鏉ユ湁x鏉¤埞銆?(x+1)=9(x-1)銆?x+6=9x-9锛?x=15锛寈=5銆備汉鏁?6*(5+1)=36浜恒€?},
|
||||
{"id":"m405","src":"鐪熼","sub":"math","ch":"绗竴璧涙","topic":"妞嶆爲闂","type":"choice","stem":"鍦ㄤ竴鏉¢暱240绫崇殑閬撹矾涓€杈规瘡闅?绫崇涓€妫垫爲锛堜袱绔兘绉嶏級锛岄渶瑕佸灏戞5鏍戯紵","opts":["A. 29","B. 30","C. 31","D. 32"],"ans":2,"exp":"涓ょ閮界锛氭5鏁?娈垫暟+1=240/8+1=30+1=31妫点€?},
|
||||
{"id":"m406","src":"鐪熼","sub":"math","ch":"绗竴璧涙","topic":"妞嶆爲闂","type":"fill","stem":"鍦ㄤ竴鏉¢暱200绫崇殑閬撹矾涓ゆ梺姣忛殧5绫崇涓€妫垫爲锛堜袱绔兘绉嶏級锛屼竴鍏遍渶瑕佸灏戞5鏍戯紵","opts":null,"ans":"82","exp":"鍗曚晶锛?00/5+1=41妫点€備袱渚э細41*2=82妫点€傛敞鎰忔槸\"涓ゆ梺\"銆?},
|
||||
{"id":"m407","src":"鐪熼","sub":"math","ch":"绗竴璧涙","topic":"鍛ㄦ湡闂","type":"fill","stem":"2026骞?鏈?鏃ユ槸鏄熸湡涓€銆傞偅涔?026骞?鏈?鏃ユ槸鏄熸湡鍑狅紵","opts":null,"ans":"涓?,"exp":"6鏈堟湁30澶┿€?鏈?鏃ュ埌7鏈?鏃ヨ繃浜?0澶┿€?0/7=4鍛ㄤ綑2澶┿€傛槦鏈熶竴+2=鏄熸湡涓夈€?},
|
||||
{"id":"m408","src":"鐪熼","sub":"math","ch":"绗竴璧涙","topic":"鍛ㄦ湡闂","type":"choice","stem":"涓€涓插僵鐏寜\"绾€侀粍銆佽摑銆佺豢銆佺传\"鐨勯『搴忛噸澶嶆帓鍒楋紝绗?6鐩忕伅鏄粈涔堥鑹诧紵","opts":["A. 绾㈣壊","B. 榛勮壊","C. 钃濊壊","D. 绱壊"],"ans":1,"exp":"86/5=17锛堢粍锛変綑1锛堢洀锛夈€備綑1瀵瑰簲绗?鐩?绾㈣壊銆?},
|
||||
{"id":"m409","src":"鐪熼","sub":"math","ch":"绗笁璧涙","topic":"鏃堕挓闂","type":"choice","stem":"浠?:15鍒?:45锛屽垎閽堣浆鍔ㄤ簡澶氬皯搴︼紵","opts":["A. 90搴?,"B. 120搴?,"C. 150搴?,"D. 180搴?],"ans":3,"exp":"30鍒嗛挓銆傚垎閽堟瘡鍒嗛挓杞?搴︼紝30*6=180搴︺€?},
|
||||
{"id":"m410","src":"鐪熼","sub":"math","ch":"绗笁璧涙","topic":"鏃堕挓闂","type":"fill","stem":"6鐐规暣鏃讹紝鏃堕拡鍜屽垎閽堢殑澶硅鏄灏戝害锛?灏忔椂鍚庡す瑙掓槸澶氬皯搴︼紵","opts":null,"ans":"180,90","exp":"6鐐规暣锛氬垎閽堟寚12锛屾椂閽堟寚6锛屽す瑙?80搴︺€?灏忔椂鍚庢槸9鐐规暣锛屽垎閽堟寚12锛屾椂閽堟寚9锛屽す瑙?0搴︺€?},
|
||||
{"id":"m411","src":"鐪熼","sub":"math","ch":"鐑韩鍦?,"topic":"鍒嗘暟璁$畻","type":"fill","stem":"璁$畻锛?/3 + 1/6 + 1/12 + 1/24 = 锛?锛?,"opts":null,"ans":"5/8","exp":"閫氬垎鍒嗘瘝24锛?/24+4/24+2/24+1/24=15/24=5/8銆?},
|
||||
{"id":"m412","src":"鐪熼","sub":"math","ch":"鐑韩鍦?,"topic":"鍒嗘暟璁$畻","type":"choice","stem":"璁$畻锛?/5 * 3/4 / 3/5 = 锛?锛?,"opts":["A. 1/2","B. 3/5","C. 2/3","D. 1"],"ans":0,"exp":"2/5*3/4/3/5=2/5*3/4*5/3=2/5*5/4=2/4=1/2銆傞櫎浠ュ垎鏁扮瓑浜庝箻浠ュ€掓暟銆?},
|
||||
{"id":"m413","src":"鐪熼","sub":"math","ch":"鐑韩鍦?,"topic":"绠€绠楀阀绠?,"type":"fill","stem":"绠€渚胯绠楋細25 * 32 * 125 = 锛?锛?,"opts":null,"ans":"100000","exp":"25*32*125=25*4*8*125=100*1000=100000銆傛媶鍒?2=4*8銆?},
|
||||
{"id":"m414","src":"鐪熼","sub":"math","ch":"鐑韩鍦?,"topic":"绠€绠楀阀绠?,"type":"fill","stem":"绠€渚胯绠楋細99 * 99 + 99 = 锛?锛?,"opts":null,"ans":"9900","exp":"99*99+99=99*(99+1)=99*100=9900銆傛彁鍙栧叕鍥犳暟99銆?},
|
||||
{"id":"m415","src":"鐪熼","sub":"math","ch":"鐑韩鍦?,"topic":"瑙f柟绋?,"type":"fill","stem":"瑙f柟绋嬶細3x + 5 = 20锛寈 = 锛?锛?,"opts":null,"ans":"5","exp":"3x+5=20锛?x=20-5=15锛寈=15/3=5銆?},
|
||||
{"id":"m416","src":"鐪熼","sub":"math","ch":"鐑韩鍦?,"topic":"瑙f柟绋?,"type":"fill","stem":"瑙f柟绋嬶細2(x - 3) = 14锛寈 = 锛?锛?,"opts":null,"ans":"10","exp":"2(x-3)=14锛寈-3=7锛寈=10銆傛敞鎰忓厛鍘绘嫭鍙枫€?},
|
||||
{"id":"m417","src":"鐪熼","sub":"math","ch":"鏈€缁堝湀","topic":"鏈€鍊奸棶棰?,"type":"choice","stem":"鐢?,2,3,4鍥涗釜鏁板瓧缁勬垚涓や釜涓や綅鏁帮紝浣垮畠浠殑涔樼Н鏈€澶с€傝繖涓や釜涓や綅鏁板垎鍒槸澶氬皯锛?,"opts":["A. 41鍜?2","B. 42鍜?1","C. 43鍜?1","D. 43鍜?2"],"ans":0,"exp":"瑕佷娇涔樼Н鏈€澶э紝涓ゆ暟搴斿敖鍙兘鎺ヨ繎銆?1*32=1312锛?2*31=1302锛?3*21=903锛?3*12=516銆傛渶澶т负1312銆?},
|
||||
{"id":"m418","src":"鐪熼","sub":"math","ch":"鏈€缁堝湀","topic":"鏈€鍊奸棶棰?,"type":"choice","stem":"灏?鍒嗘垚鍑犱釜鑷劧鏁扮殑鍜岋紝浣垮畠浠殑涔樼Н鏈€澶э紝鏈€澶х殑涔樼Н鏄灏戯紵","opts":["A. 24","B. 27","C. 30","D. 36"],"ans":1,"exp":"灏介噺鎷嗘垚3銆?=3+3+3锛屼箻绉?3*3*3=27銆傝寰嬶細鎷嗘垚灏介噺澶氱殑3锛屼綑2鍒欏姞涓€涓?锛屼綑1鍒欐妸涓€涓?+1鍙樻垚2+2銆?},
|
||||
{"id":"m419","src":"鐪熼","sub":"math","ch":"绗簩璧涙","topic":"瀹规枼鍘熺悊","type":"choice","stem":"鏌愮彮鏈?0浜猴紝鍠滄璇枃鐨勬湁28浜猴紝鍠滄鏁板鐨勬湁25浜猴紝涓ょ閮藉枩娆㈢殑鏈?8浜恒€備袱绉戦兘涓嶅枩娆㈢殑鏈夊灏戜汉锛?,"opts":["A. 3","B. 4","C. 5","D. 6"],"ans":2,"exp":"鑷冲皯鍠滄涓€绉戯細28+25-18=35浜恒€傞兘涓嶅枩娆細40-35=5浜恒€傚鏂ュ叕寮忥細A骞禕=A+B-A浜銆?},
|
||||
{"id":"m420","src":"鐪熼","sub":"math","ch":"绗簩璧涙","topic":"瀹规枼鍘熺悊","type":"fill","stem":"鏌愮彮50浜猴紝璁㈤槄A鏉傚織鐨勬湁30浜猴紝璁㈤槄B鏉傚織鐨勬湁25浜猴紝涓ょ閮借闃呯殑鏈?0浜恒€傚彧璁㈤槄涓€绉嶆潅蹇楃殑鏈夊灏戜汉锛?,"opts":null,"ans":"35","exp":"鍙A锛?0-10=20浜恒€傚彧璁锛?5-10=15浜恒€傚彧璁竴绉嶏細20+15=35浜恒€?},
|
||||
{"id":"m421","src":"鐪熼","sub":"math","ch":"绗簩璧涙","topic":"鏂归樀闂","type":"fill","stem":"鏌愭牎杩涜闃熷垪琛ㄦ紨锛屾帓鎴愪竴涓鏂瑰舰鏂归樀銆傛渶澶栧眰姣忚竟鏈?2浜猴紝鏈€澶栧眰涓€鍏辨湁澶氬皯浜猴紵","opts":null,"ans":"44","exp":"鏈€澶栧眰浜烘暟=(12-1)*4=44浜恒€傛敞鎰忓洓涓鐨勪汉涓嶉噸澶嶈鏁般€?},
|
||||
{"id":"m422","src":"鐪熼","sub":"math","ch":"绗簩璧涙","topic":"鏂归樀闂","type":"fill","stem":"涓€涓疄蹇冩柟闃碉紝鏈€澶栧眰姣忚竟15浜猴紝杩欎釜鏂归樀涓€鍏辨湁澶氬皯浜猴紵","opts":null,"ans":"225","exp":"瀹炲績鏂归樀鎬讳汉鏁?杈归暱*杈归暱=15*15=225浜恒€?},
|
||||
{"id":"e401","src":"真题","sub":"english","ch":"第二赛段","topic":"现在完成时","type":"choice","stem":"I ___ already ___ my homework.","opts":["A. have, finish","B. has, finished","C. have, finished","D. have, finishing"],"ans":2,"exp":"现在完成时结构:have/has + 过去分词。主语I用have,finish的过去分词为finished。"},
|
||||
{"id":"e402","src":"真题","sub":"english","ch":"第二赛段","topic":"现在完成时","type":"choice","stem":"She ___ to Beijing twice.","opts":["A. have been","B. has been","C. has gone","D. have gone"],"ans":1,"exp":"have/has been to表示\"去过某地(已回来)\"。主语She用has。"},
|
||||
{"id":"e403","src":"真题","sub":"english","ch":"第二赛段","topic":"现在完成时","type":"fill","stem":"用所给词的正确形式填空:\nHe never ___ (eat) such delicious food before.","opts":null,"ans":"has eaten","exp":"never...before提示现在完成时。主语He用has,eat过去分词eaten。"},
|
||||
{"id":"e404","src":"真题","sub":"english","ch":"第二赛段","topic":"现在完成时","type":"choice","stem":"___ you ever ___ to the Great Wall?","opts":["A. Have, gone","B. Has, been","C. Have, been","D. Did, go"],"ans":2,"exp":"\"你曾经去过长城吗?\"。ever用于现在完成时疑问句。Have you ever been to...? 固定句型。"},
|
||||
{"id":"e405","src":"真题","sub":"english","ch":"第二赛段","topic":"过去进行时","type":"choice","stem":"I ___ TV when my mother came back.","opts":["A. watch","B. was watching","C. watched","D. am watching"],"ans":1,"exp":"\"当妈妈回来时我正在看电视\"。过去某一时刻正在发生的动作,用过去进行时was/were doing。"},
|
||||
{"id":"e406","src":"真题","sub":"english","ch":"第二赛段","topic":"过去进行时","type":"choice","stem":"They ___ football at 4 o'clock yesterday afternoon.","opts":["A. played","B. were playing","C. are playing","D. play"],"ans":1,"exp":"过去具体时间点正在进行的动作,用过去进行时。They用were playing。"},
|
||||
{"id":"e407","src":"真题","sub":"english","ch":"第二赛段","topic":"过去进行时","type":"fill","stem":"用所给词填空:\nWhile I ___ (walk) home, I met an old friend.","opts":null,"ans":"was walking","exp":"while引导的时间状语从句,表示\"在……过程中\",用过去进行时。"},
|
||||
{"id":"e408","src":"真题","sub":"english","ch":"第三赛段","topic":"被动语态","type":"choice","stem":"English ___ in many countries.","opts":["A. speak","B. is spoken","C. speaks","D. was spoken"],"ans":1,"exp":"英语被说(被动语态)。一般现在时的被动:am/is/are+过去分词。English是单数,用is spoken。"},
|
||||
{"id":"e409","src":"真题","sub":"english","ch":"第三赛段","topic":"被动语态","type":"choice","stem":"The bridge ___ last year.","opts":["A. built","B. was built","C. is built","D. builds"],"ans":1,"exp":"last year过去时间,桥被建造(被动语态)。过去时被动:was/were+过去分词。bridge单数用was built。注意不规则动词build→built。"},
|
||||
{"id":"e410","src":"真题","sub":"english","ch":"第三赛段","topic":"被动语态","type":"choice","stem":"This kind of machine ___ in China.","opts":["A. is made","B. was made","C. are made","D. made"],"ans":0,"exp":"\"这种机器是中国制造的\"。一般现在时被动is made。machine不可数或作单数看,用is。"},
|
||||
{"id":"e411","src":"真题","sub":"english","ch":"第三赛段","topic":"宾语从句","type":"choice","stem":"I don't know ___ she will come tomorrow.","opts":["A. that","B. if","C. what","D. which"],"ans":1,"exp":"宾语从句用if/whether表示\"是否\"。句意为\"我不知道她明天是否会来\"。"},
|
||||
{"id":"e412","src":"真题","sub":"english","ch":"第三赛段","topic":"宾语从句","type":"choice","stem":"Can you tell me ___ the hospital is?","opts":["A. what","B. where","C. who","D. whose"],"ans":1,"exp":"宾语从句疑问词的选择。句意为\"你能告诉我医院在哪里吗?\",问地点用where。"},
|
||||
{"id":"e413","src":"真题","sub":"english","ch":"热身圈","topic":"there be","type":"choice","stem":"There ___ a book and two pens on the desk.","opts":["A. is","B. are","C. have","D. has"],"ans":0,"exp":"there be就近原则:靠近be动词的主语a book是单数,用is。"},
|
||||
{"id":"e414","src":"真题","sub":"english","ch":"热身圈","topic":"there be","type":"choice","stem":"___ any milk in the fridge?","opts":["A. Is there","B. Are there","C. There is","D. There are"],"ans":0,"exp":"milk不可数,用there be单数疑问句:Is there any...?"},
|
||||
{"id":"e415","src":"真题","sub":"english","ch":"热身圈","topic":"there be","type":"fill","stem":"用所给词填空:\nThere ___ (be) some apples on the table.","opts":null,"ans":"are","exp":"some apples是复数,be用are。there be中be与后面的主语保持数的一致。"},
|
||||
{"id":"e416","src":"真题","sub":"english","ch":"热身圈","topic":"不定代词","type":"choice","stem":"I'm hungry. I want ___ to eat.","opts":["A. something","B. anything","C. nothing","D. everything"],"ans":0,"exp":"肯定句中用something。\"我饿了,想吃点东西\"。"},
|
||||
{"id":"e417","src":"真题","sub":"english","ch":"热身圈","topic":"不定代词","type":"choice","stem":"There isn't ___ wrong with my bike.","opts":["A. something","B. anything","C. nothing","D. everything"],"ans":1,"exp":"否定句用anything。there isn't anything wrong = there is nothing wrong。"},
|
||||
!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no">
|
||||
<title>🏁 小升初 · F1知识拉力赛</title>
|
||||
<style>
|
||||
@import url('https://fonts.googleapis.com/css2?family=Orbitron:wght@400;700;900&display=swap');
|
||||
*{margin:0;padding:0;box-sizing:border-box}
|
||||
body{font-family:"PingFang SC","Microsoft YaHei",sans-serif;background:#1a1a2e;color:#e0e0e0;min-height:100vh}
|
||||
.hd{background:linear-gradient(135deg,#0f0f23,#1a1a3e,#0f0f23);border-bottom:3px solid #e63946;color:#fff;padding:14px 16px;text-align:center;position:sticky;top:0;z-index:100}
|
||||
.hd h1{font-size:18px;letter-spacing:2px;font-family:'Orbitron',sans-serif}
|
||||
.hd h1 .flag{color:#e63946}
|
||||
.hd p{font-size:11px;opacity:.7;margin-top:2px;letter-spacing:1px}
|
||||
.tb{display:flex;gap:3px;padding:8px 12px;background:#16213e;border-bottom:2px solid #0f3460;position:sticky;top:52px;z-index:99}
|
||||
.tb button{flex:1;padding:6px 8px;border:2px solid transparent;border-radius:4px;font-size:12px;font-weight:700;cursor:pointer;background:#1a1a3e;color:#888;font-family:'Orbitron',sans-serif;letter-spacing:1px;transition:.2s}
|
||||
.tb button.on{background:#e63946;color:#fff;border-color:#ff6b6b;box-shadow:0 0 10px rgba(230,57,70,.5)}
|
||||
.ch{display:flex;gap:0;padding:6px 0;background:#1a1a2e;overflow-x:auto;position:sticky;top:96px;z-index:98;border-bottom:1px solid #333}
|
||||
.ch button{flex:1;min-width:70px;padding:6px 4px;border:none;border-right:1px dashed #333;font-size:10px;cursor:pointer;white-space:nowrap;background:transparent;color:#666;transition:.2s;font-weight:600}
|
||||
.ch button:last-child{border-right:none}
|
||||
.ch button.on{color:#e63946;background:rgba(230,57,70,.1)}
|
||||
.ch button .ico{display:block;font-size:16px;margin-bottom:2px}
|
||||
.mn{padding:12px;max-width:760px;margin:0 auto;padding-bottom:120px}
|
||||
.cd{background:linear-gradient(145deg,#16213e,#1a1a3e);border-radius:8px;padding:16px;margin-bottom:10px;border-left:4px solid #e63946;box-shadow:0 2px 8px rgba(0,0,0,.3);position:relative}
|
||||
.cd .rn{background:#e63946;color:#fff;width:24px;height:24px;display:inline-flex;align-items:center;justify-content:center;font-size:11px;font-weight:700;margin-right:6px;clip-path:polygon(0 0,100% 0,100% 100%,0 100%,0 50%);padding-left:3px}
|
||||
.cd .tp{font-size:10px;color:#ffd166;background:rgba(255,209,102,.15);padding:2px 10px;border-radius:2px;font-weight:600;letter-spacing:.5px}
|
||||
.cd .st{font-size:15px;line-height:1.7;margin:10px 0;color:#eee;white-space:pre-line}
|
||||
.cd .src-tag{display:inline-block;font-size:9px;padding:1px 6px;border-radius:3px;margin-left:4px;vertical-align:middle;font-weight:600}
|
||||
.cd .src-real{background:rgba(230,57,70,.2);color:#e63946;border:1px solid rgba(230,57,70,.3)}
|
||||
.cd .src-prac{background:rgba(255,209,102,.15);color:#ffd166;border:1px solid rgba(255,209,102,.2)}
|
||||
.cd .fig-wrap{text-align:center;margin:8px 0}.cd .fig-wrap svg{max-width:100%;background:#0f0f23;border-radius:4px;border:1px solid #333}
|
||||
.cd .op{display:block;width:100%;text-align:left;padding:10px 14px;margin-bottom:4px;border:2px solid #333;border-radius:4px;background:#1a1a3e;color:#ccc;font-size:14px;cursor:pointer;transition:.2s;font-family:inherit}
|
||||
.cd .op:hover:not(.di){border-color:#e63946;background:#1f1f45;color:#fff}
|
||||
.cd .op.ok{background:#1b4332;border-color:#2d6a4f;color:#52b788}
|
||||
.cd .op.no{background:#4a1c1c;border-color:#e63946;color:#ff6b6b}
|
||||
.cd .op.di{cursor:default}
|
||||
.cd .inp{display:block;width:100%;padding:10px 14px;margin:8px 0;border:2px solid #333;border-radius:4px;font-size:15px;outline:none;background:#1a1a3e;color:#eee;font-family:inherit}
|
||||
.cd .inp:focus{border-color:#e63946}
|
||||
.cd .inp.ok{border-color:#2d6a4f;background:#1b4332}
|
||||
.cd .inp.no{border-color:#e63946;background:#4a1c1c}
|
||||
.br{margin:8px 0;display:flex;gap:6px}
|
||||
.br button{padding:7px 18px;border:none;border-radius:4px;font-size:13px;cursor:pointer;font-weight:600;transition:.2s;font-family:inherit}
|
||||
.br button:active{transform:scale(.96)}
|
||||
.br .cf{background:#e63946;color:#fff}
|
||||
.br .cf:hover{background:#ff4757}
|
||||
.br .sh{background:#333;color:#aaa}
|
||||
.br .sh:hover{background:#444;color:#fff}
|
||||
.fb{margin-top:10px;padding:10px 14px;border-radius:4px;font-size:13px;line-height:1.7;display:none;border:1px solid}
|
||||
.fb.sh{display:block}
|
||||
.fb.go{background:#1b4332;color:#52b788;border-color:#2d6a4f}
|
||||
.fb.bd{background:#4a1c1c;color:#ff6b6b;border-color:#e63946}
|
||||
.fb.inf{background:#1a1a3e;color:#ffd166;border-color:#ffd166}
|
||||
.pb{position:fixed;bottom:0;left:0;right:0;background:#0f0f23;padding:8px 14px;border-top:2px solid #e63946;z-index:100;display:flex;align-items:center;gap:10px}
|
||||
.pb .tk{flex:1;height:8px;background:#333;border-radius:2px;overflow:hidden}
|
||||
.pb .fl{height:100%;border-radius:2px;background:linear-gradient(90deg,#e63946,#ffd166);transition:width .3s;position:relative}
|
||||
.pb .fl::after{content:'';position:absolute;right:-4px;top:-4px;width:16px;height:16px;background:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='white'%3E%3Cpath d='M12 2L15 9H22L16 14L19 21L12 16.5L5 21L8 14L2 9H9L12 2Z'/%3E%3C/svg%3E") center/contain no-repeat}
|
||||
.pb .tx{font-size:11px;color:#888;white-space:nowrap;font-family:'Orbitron',sans-serif;letter-spacing:.5px}
|
||||
.pk{position:fixed;bottom:46px;right:12px;z-index:99;display:flex;flex-direction:column;gap:4px}
|
||||
.pk button{width:50px;height:50px;border:none;border-radius:50%;cursor:pointer;font-size:22px;box-shadow:0 3px 15px rgba(0,0,0,.4);transition:.2s;background:linear-gradient(135deg,#e63946,#ff6b6b);color:#fff;position:relative}
|
||||
.pk button::after{content:'🏁';position:absolute;font-size:14px;bottom:-2px;right:-2px}
|
||||
.pk button:active{transform:scale(.9)}
|
||||
.pk .mute{width:auto;height:auto;padding:4px 9px;border-radius:12px;font-size:10px;background:#333;color:#aaa;box-shadow:0 2px 8px rgba(0,0,0,.3);border:1px solid #555;font-family:'Orbitron',sans-serif;cursor:pointer;transition:.2s;position:static}
|
||||
.pk .mute::after{display:none}
|
||||
.pk .mute:hover{background:#444;border-color:#e63946;color:#fff}
|
||||
.mo{display:none;position:fixed;inset:0;background:rgba(0,0,0,.7);z-index:200;align-items:center;justify-content:center}
|
||||
.mo.sh{display:flex}
|
||||
.mi{background:linear-gradient(145deg,#16213e,#1a1a3e);border-radius:12px;padding:28px;max-width:380px;width:90%;text-align:center;animation:pop .3s;border:2px solid #e63946}
|
||||
@keyframes pop{from{transform:scale(.8);opacity:0}to{transform:scale(1);opacity:1}}
|
||||
.mi .bi{font-size:50px;margin-bottom:8px}
|
||||
.mi h3{font-size:20px;color:#e63946;font-family:'Orbitron',sans-serif}
|
||||
.mi p{font-size:14px;color:#aaa;margin:14px 0;line-height:1.8}
|
||||
.mi .cl{padding:10px 30px;border:none;border-radius:4px;background:#e63946;color:#fff;font-size:15px;cursor:pointer;font-weight:700;transition:.2s;font-family:inherit}
|
||||
.mi .cl:hover{background:#ff4757}
|
||||
.ld{text-align:center;padding:60px}
|
||||
.ld .sp{width:40px;height:40px;border:3px solid #333;border-top-color:#e63946;border-radius:50%;animation:s .8s linear infinite;margin:0 auto 10px}
|
||||
@keyframes s{to{transform:rotate(360deg)}}
|
||||
.ni{text-align:center;padding:40px 20px;color:#666;font-size:14px}
|
||||
.flag-bg{position:fixed;top:0;left:0;right:0;bottom:0;background:repeating-linear-gradient(90deg,transparent 0,transparent 20px,rgba(255,255,255,.02) 20px,rgba(255,255,255,.02) 40px);pointer-events:none;z-index:-1}
|
||||
.cd .stage-tag{position:absolute;top:10px;right:12px;font-size:9px;color:#666;letter-spacing:1px;font-family:'Orbitron',sans-serif}
|
||||
.stage-indicator{display:flex;justify-content:center;gap:6px;padding:6px 0;margin-bottom:2px}
|
||||
.stage-indicator span{width:22px;height:22px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;font-size:10px;background:#333;color:#666;transition:.3s}
|
||||
.stage-indicator span.done{background:#2d6a4f;color:#52b788}
|
||||
.stage-indicator span.current{background:#e63946;color:#fff;box-shadow:0 0 8px rgba(230,57,70,.6)}
|
||||
/* ===== F1 RACE TRACK ===== */
|
||||
.track-wrap{background:#0f0f23;padding:4px 12px 8px;border-bottom:1px solid #222;position:sticky;top:48px;z-index:97;overflow:hidden}
|
||||
.track-wrap .track-title{text-align:center;font-size:9px;color:#555;letter-spacing:2px;font-family:'Orbitron',sans-serif;margin-bottom:2px}
|
||||
.track-svg{width:100%;height:44px;display:block}
|
||||
.track-svg .node-circle{cursor:pointer;transition:.3s}
|
||||
.track-svg .node-circle.passed{fill:#2d6a4f;stroke:#52b788}
|
||||
.track-svg .node-circle.active{fill:#e63946;stroke:#ff6b6b;filter:drop-shadow(0 0 4px #e63946)}
|
||||
.track-svg .node-circle.future{fill:#333;stroke:#555}
|
||||
.track-svg .car-group{transition:all .6s cubic-bezier(.25,.46,.45,.94)}
|
||||
.track-svg .car-group text{font-size:7px;fill:#ffd166;font-family:'Orbitron',sans-serif}
|
||||
.track-svg .car-body{transform-origin:center;animation:bounce .3s ease-in-out infinite alternate}
|
||||
@keyframes bounce{from{transform:translateY(0)}to{transform:translateY(-1.5px)}}
|
||||
.track-svg .node-label{font-size:6px;fill:#888;font-family:'Orbitron',sans-serif;text-anchor:middle}
|
||||
.track-svg .node-label.passed{fill:#52b788}
|
||||
.track-svg .node-label.active{fill:#ff6b6b}
|
||||
|
||||
/* ===== MODE BAR (Free Practice / Wrong Book / Retry) ===== */
|
||||
.mb2{display:flex;gap:2px;padding:5px 10px;background:#12122a;border-bottom:1px solid #1a1a3e;position:sticky;top:94px;z-index:97;overflow-x:auto}
|
||||
.mb2 button{flex:0 0 auto;padding:5px 12px;border:1px solid #333;border-radius:14px;font-size:10px;cursor:pointer;background:transparent;color:#666;white-space:nowrap;transition:.2s;font-family:'Orbitron',sans-serif;letter-spacing:.5px;font-weight:600}
|
||||
.mb2 button.on{background:#e63946;color:#fff;border-color:#ff6b6b;box-shadow:0 0 6px rgba(230,57,70,.4)}
|
||||
.mb2 button .badge{background:#e63946;color:#fff;border-radius:10px;padding:0 6px;font-size:9px;margin-left:4px;font-family:sans-serif}
|
||||
/* ===== RETRY / RESET BUTTONS ===== */
|
||||
.cd .retry{display:inline-block;padding:3px 10px;margin-left:8px;border:1px solid #555;border-radius:12px;font-size:9px;cursor:pointer;background:transparent;color:#888;transition:.2s;font-family:'Orbitron',sans-serif;vertical-align:middle}
|
||||
.cd .retry:hover{border-color:#ffd166;color:#ffd166;background:rgba(255,209,102,.1)}
|
||||
.cd .retry.done{display:none}
|
||||
.cd .wrong-tag{display:inline-block;font-size:9px;color:#ff6b6b;background:rgba(230,57,70,.15);padding:1px 8px;border-radius:3px;margin-left:6px;vertical-align:middle}
|
||||
.cd .sim{background:linear-gradient(145deg,#1a1a40,#16213e);border:1px dashed #444;border-radius:6px;padding:10px 12px;margin-top:8px;display:none}
|
||||
.cd .sim.sh{display:block}
|
||||
.cd .sim .st{font-size:12px;color:#aaa;white-space:pre-line}
|
||||
.cd .sim .op{font-size:12px;padding:6px 10px}
|
||||
.cd .sim .tp2{font-size:9px;color:#ffd166;margin-bottom:4px;display:block}
|
||||
|
||||
/* ===== STAT PANEL ===== */
|
||||
.stat-panel{display:none;background:#0f0f23;border:1px solid #333;border-radius:8px;padding:14px;margin-bottom:12px}
|
||||
.stat-panel.sh{display:block}
|
||||
.stat-panel .row{display:flex;justify-content:space-between;margin:4px 0;font-size:12px;color:#888}
|
||||
.stat-panel .row .v{color:#e0e0e0;font-family:'Orbitron',sans-serif}
|
||||
.stat-panel .row .v.red{color:#ff6b6b}
|
||||
|
||||
/* ===== DAILY GOAL BAR ===== */
|
||||
.mb3{display:flex;align-items:center;gap:8px;padding:4px 10px;background:#0f0f23;border-bottom:1px solid #1a1a3e;position:sticky;top:136px;z-index:97;font-size:10px}
|
||||
.mb3 .gp{flex:1;height:6px;background:#333;border-radius:3px;overflow:hidden}
|
||||
.mb3 .gp .gf{height:100%;background:#ffd166;border-radius:3px;transition:width .3s}
|
||||
.mb3 .gl{color:#888;font-family:'Orbitron',sans-serif;white-space:nowrap}
|
||||
.mb3 .gl b{color:#ffd166}
|
||||
/* ===== TOPIC GRID ===== */
|
||||
.mg{display:none;grid-template-columns:repeat(auto-fill,minmax(130px,1fr));gap:4px;padding:8px 12px;max-width:760px;margin:0 auto}
|
||||
.mg.sh{display:grid}
|
||||
.mg-item{background:#16213e;border:1px solid #333;border-radius:6px;padding:8px;cursor:pointer;text-align:center;transition:.2s}
|
||||
.mg-item:hover{border-color:#e63946;background:#1a1a3e}
|
||||
.mg-item .tp{font-size:11px;color:#ccc;display:block;margin-bottom:2px}
|
||||
.mg-item .stars{font-size:16px;display:block}
|
||||
.mg-item .pct{font-size:9px;color:#888;display:block}
|
||||
.mg-item .sz{font-size:9px;color:#555;display:block}
|
||||
/* ===== REVIEW BADGE ===== */
|
||||
.tp .rvg{display:inline-block;font-size:8px;background:#e63946;color:#fff;padding:1px 5px;border-radius:3px;margin-left:4px;vertical-align:middle}
|
||||
/* ===== EXAM MODE ===== */
|
||||
.exam-hdr{display:none;background:#0f0f23;border-bottom:1px solid #e63946;padding:6px 12px;justify-content:space-between;align-items:center;position:sticky;top:170px;z-index:96;font-size:12px}
|
||||
.exam-hdr.sh{display:flex}
|
||||
.exam-hdr .qct{color:#888;font-family:'Orbitron',sans-serif}
|
||||
.exam-hdr .tmr{color:#ffd166;font-family:'Orbitron',sans-serif;font-weight:700}
|
||||
.exam-picker{display:none;gap:6px;padding:8px 12px;background:#0f0f23;border-bottom:1px solid #1a1a3e;flex-wrap:wrap}
|
||||
.exam-picker.sh{display:flex}
|
||||
.exam-picker button{flex:1;min-width:60px;padding:6px;border:1px solid #333;border-radius:4px;font-size:10px;cursor:pointer;background:transparent;color:#888;font-family:'Orbitron',sans-serif;transition:.2s}
|
||||
.exam-picker button:hover{border-color:#e63946;color:#fff}
|
||||
.exam-result{text-align:center;padding:40px 20px}
|
||||
.exam-result h2{color:#ffd166;margin-bottom:10px;font-size:16px}
|
||||
.exam-result p{font-size:18px;margin-bottom:20px;color:#eee}
|
||||
.exam-result .cf{padding:10px 30px;border:none;border-radius:4px;background:#e63946;color:#fff;font-size:14px;cursor:pointer}
|
||||
/* ===== REPORT PANEL ===== */
|
||||
.rp{display:none;padding:12px;max-width:760px;margin:0 auto}
|
||||
.rp.sh{display:block}
|
||||
.rp .rw{display:flex;justify-content:space-between;padding:6px 0;border-bottom:1px solid #222;font-size:13px}
|
||||
.rp .rw .lb{color:#888}
|
||||
.rp .rw .vl{color:#e0e0e0;font-weight:600}
|
||||
.rp .rw .vl.g{color:#52b788}
|
||||
.rp .rw .vl.r{color:#ff6b6b}
|
||||
.rp .rw .vl.y{color:#ffd166}
|
||||
.rp .stitle{font-size:13px;color:#ffd166;margin-top:14px;margin-bottom:6px;font-weight:600}
|
||||
.rp .topic-bar{display:flex;align-items:center;gap:8px;padding:4px 0;font-size:11px}
|
||||
.rp .topic-bar .nm{color:#aaa;width:80px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
||||
.rp .topic-bar .bar{flex:1;height:8px;background:#333;border-radius:4px;overflow:hidden}
|
||||
.rp .topic-bar .bar .fill{height:100%;border-radius:4px;transition:width .3s}
|
||||
.rp .topic-bar .stars{width:50px;text-align:right;font-size:14px}
|
||||
.rp .dw{display:flex;gap:4px;align-items:flex-end;height:44px;padding:4px 0}
|
||||
.rp .dw .day{flex:1;display:flex;flex-direction:column;align-items:center;font-size:8px;color:#666}
|
||||
.rp .dw .day .b{width:100%;background:#e63946;border-radius:2px 2px 0 0;min-height:2px}
|
||||
/* ===== HINT SYSTEM ===== */
|
||||
.cd .ht{display:none;margin-top:6px;padding:8px 12px;background:#1a1a3e;border-left:3px solid #ffd166;color:#ffd166;font-size:12px;line-height:1.5}
|
||||
.cd .ht.sh{display:block}
|
||||
.cd .rt{display:inline-block;padding:4px 12px;border:1px solid #ffd166;border-radius:12px;font-size:10px;cursor:pointer;background:transparent;color:#ffd166;margin-top:6px;font-family:'Orbitron',sans-serif}
|
||||
.cd .rt:hover{background:rgba(255,209,102,.15)}
|
||||
/* ===== PAGINATION ===== */
|
||||
.pg{display:flex;align-items:center;justify-content:center;gap:4px;padding:14px 0 8px;flex-wrap:wrap}
|
||||
.pg button{min-width:34px;padding:5px 10px;border:1px solid #333;border-radius:4px;font-size:11px;cursor:pointer;background:transparent;color:#888;font-family:'Orbitron',sans-serif;transition:.2s;font-weight:600}
|
||||
.pg button:hover:not(.di){border-color:#e63946;color:#fff;background:rgba(230,57,70,.15)}
|
||||
.pg button.on{background:#e63946;color:#fff;border-color:#ff6b6b;box-shadow:0 0 6px rgba(230,57,70,.4)}
|
||||
.pg button.di{opacity:.3;cursor:default}
|
||||
.pg .info{font-size:10px;color:#555;margin:0 6px;font-family:'Orbitron',sans-serif}
|
||||
/* ===== CONFETTI CANVAS ===== */
|
||||
#confetti-canvas{position:fixed;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:999}
|
||||
|
||||
/* ===== FEATURE PACK: KNOWLEDGE CARD ===== */
|
||||
.kc-btn:hover{transform:scale(1.1)}
|
||||
#kcModal pre{font-family:"PingFang SC","Microsoft YaHei",sans-serif}
|
||||
/* ===== FEATURE PACK: EXAM OVERLAY ===== */
|
||||
#examOverlay *{box-sizing:border-box}
|
||||
/* ===== FEATURE PACK: DIAGNOSIS ===== */
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<canvas id="confetti-canvas"></canvas>
|
||||
<div class="flag-bg"></div>
|
||||
<div class="hd"><h1><span class="flag">🏁</span> F1 知识拉力赛 <span class="flag">🏁</span></h1><p>小升初 · 数学 语文 英语 — 答对闯关 冲向终点</p></div>
|
||||
<div class="track-wrap" id="trackWrap"><div class="track-title">🏎 RACE TRACK</div><svg class="track-svg" id="trackSvg" viewBox="0 0 760 50"></svg></div>
|
||||
<div class="tb" id="tb"></div>
|
||||
<div class="ch" id="ch"></div>
|
||||
<div class="mb2" id="mb2"></div>
|
||||
<div class="mb3" id="mb3"></div>
|
||||
<div class="exam-picker" id="ep"></div>
|
||||
<div class="exam-hdr" id="eh"><span class="qct" id="eqc"></span><span class="tmr" id="et">0:00</span></div>
|
||||
<div class="mg" id="mg"></div>
|
||||
<div class="rp" id="rp"></div>
|
||||
<div class="mn" id="mn"><div class="ld"><div class="sp"></div><div>🔧 引擎启动中...</div></div></div>
|
||||
<div class="pk"><button onclick="ckin()">🏆</button><button class="mute" id="muteBtn" onclick="AUDIO.toggle()">🔊</button></div>
|
||||
<div class="pb"><span class="tx" id="pt">0/0</span><div class="tk"><div class="fl" id="pf" style="width:0%"></div></div><span class="tx" id="st">正确率:--%</span></div>
|
||||
<div class="mo" id="mo"><div class="mi"><div class="bi" id="mb">🏆</div><h3 id="mt">领奖台!</h3><p id="mbd">...</p><button class="cl" onclick="cm()">下一圈 →</button></div></div>
|
||||
<script>
|
||||
const Q = [
|
||||
{"id":"m1","src":"真题","sub":"math","ch":"热身圈","topic":"整数读写","type":"choice","stem":"450007020 读作( ),省略万后面的尾数约( )万。","opts":["D. 四亿五千万七千零二十, 4500万","B. 四亿五千万七千零二十, 45000万","C. 四亿五千万零七千零二十, 45001万","A. 四亿五千万七千零二十, 45001万"],"ans":3,"exp":"这个数=4亿5000万7020。省略万位后面的尾数,看千位是7,进一位,约45001万。"},
|
||||
{"id":"m2","src":"真题","sub":"math","ch":"热身圈","topic":"小数点移动","type":"fill","stem":"一个数的小数点先向右移动一位,再向左移动三位,得到的新数比原数少34.65,原数是多少?","opts":null,"ans":"35","exp":"向右移1位再向左移3位=向左移2位=原数100。新数=原数-34.65,原数100=原数-34.65,原数=35。"},
|
||||
{"id":"m3","src":"真题","sub":"math","ch":"热身圈","topic":"分数","type":"choice","stem":"把5米长的钢丝平均截成8段,每段是5米的( ),每段长( )米。","opts":["D. 5/8, 0.8","B. 1/8, 0.5","C. 5/8, 0.625","A. 1/8, 0.625"],"ans":3,"exp":"每段占全长1/8。每段长5-8=0.625米。注意一个是分数(几分之几),一个是小数(实际长度)。"},
|
||||
{"id":"m4","src":"真题","sub":"math","ch":"第一赛段","topic":"最大公因数与最小公倍数","type":"choice","stem":"20和36的最大公因数是( ),最小公倍数是( )。","opts":["D. 6, 180","B. 2, 360","C. 4, 720","A. 4, 180"],"ans":3,"exp":"20=2x2x5,36=2x2x3x3。最大公因数取公共部分:2x2=4。最小公倍数取所有因数最高次:2x2x3x3x5=180。"},
|
||||
{"id":"m5","src":"真题","sub":"math","ch":"第一赛段","topic":"整除","type":"choice","stem":"能同时被2,3,5整除的最大三位数是( ),最小四位数是( )。","opts":["D. 980, 1020","B. 960, 1020","C. 990, 1000","A. 990, 1020"],"ans":3,"exp":"同时被2和5整除,个位必须是0。还要被3整除,各位数字之和是3的倍数。最大三位数:990(9+9+0=18)。最小四位数1020(1+0+2+0=3)。"},
|
||||
{"id":"m6","src":"真题","sub":"math","ch":"第一赛段","topic":"质数","type":"choice","stem":"长方体的右面和上面的面积之和为91平方厘米,长宽高都是质数,体积是多少?","opts":["D. 110","B. 165","C. 182","A. 154"],"ans":3,"exp":"设长a宽b高c。右面bc+上面ab=b(a+c)=91=7x13。b=7,则a+c=13,a,c都是质数,11+2=13。体积11x7x2=154。"},
|
||||
{"id":"m7","src":"真题","sub":"math","ch":"第二赛段","topic":"化简比","type":"choice","stem":"比值是0.72的最简单整数比是( )。","opts":["D. 24:33","B. 36:50","C. 72:100","A. 18:25"],"ans":3,"exp":"0.72=72/100=18/25,最简整数比是18:25。"},
|
||||
{"id":"m8","src":"真题","sub":"math","ch":"第二赛段","topic":"圆柱与圆锥","type":"choice","stem":"一个圆柱和一个圆锥的底面积和体积相等,圆锥的高1.8分米,圆柱的高是( )。","opts":["D. 0.9分米","B. 1.8分米","C. 5.4分米","A. 0.6分米"],"ans":3,"exp":"V柱=Sh柱,V锥=1/3xSxh锥。体积相等:Sh柱=1/3xSx1.8,h柱=0.6分米。"},
|
||||
{"id":"m9","src":"真题","sub":"math","ch":"第二赛段","topic":"行程问题","type":"choice","stem":"摩托车和自行车从相距176千米的两地相向而行,2小时后相遇。摩托车速度是自行车速度的4倍。自行车速度多少?","opts":["D. 20","B. 18","C. 16","A. 17.6"],"ans":3,"exp":"设自行车速度x,则摩托车4x。(x+4x)x2=176,10x=176,x=17.6。"},
|
||||
{"id":"m10","src":"真题","sub":"math","ch":"第三赛段","topic":"工程问题","type":"fill","stem":"甲独做30天完成,乙独做40天完成。合做25天完成,甲休息天数是乙的2倍。乙休息几天?","opts":null,"ans":"5","exp":"设乙休息x天,甲休息2x天。甲工作(25-2x)天,乙工作(25-x)天。(25-2x)/30+(25-x)/40=1,乘120,4(25-2x)+3(25-x)=120,x=5。"},
|
||||
{"id":"m11","src":"真题","sub":"math","ch":"第三赛段","topic":"浓度问题","type":"fill","stem":"20%盐水和5%盐水混合成15%盐水450克,各需多少克?","opts":null,"ans":"300,150","exp":"十字交叉:(20%-15%):(15%-5%)=5:10=1:2。20%与5%质量比=2:1。20%盐水=450x2/3=300克,5%盐水=150克。"},
|
||||
{"id":"m12","src":"真题","sub":"math","ch":"第三赛段","topic":"鸡兔同笼","type":"fill","stem":"竞赛20道题,做对得5分,做错倒扣2分,考了72分。做对几道?","opts":null,"ans":"16","exp":"设做对x道,做错(20-x)道。5x-2(20-x)=72,7x=112,x=16。"},
|
||||
{"id":"m13","src":"真题","sub":"math","ch":"最终圈","topic":"年龄问题","type":"choice","stem":"儿子年龄是父亲的1/6,15年后是父亲的1/3。父亲多少岁?","opts":["A. 36","B. 42","C. 45","D. 48"],"ans":1,"exp":"设父亲x岁,儿子x/6岁。15年后x/6+15=(x+15)/3,乘6:x+90=2x+30,x=42。"},
|
||||
{"id":"m14","src":"真题","sub":"math","ch":"最终圈","topic":"列方程","type":"choice","stem":"甲班50人,乙班46人。要使甲班是乙班的2倍,从乙班调多少人到甲班?","opts":["D. 2(50+x)=46-x","B. 50+2x=46","C. 50-x=2(46+x)","A. 50+x=2(46-x)"],"ans":3,"exp":"设调x人。调后甲班(50+x),乙班(46-x)。甲=2x乙,50+x=2(46-x)。"},
|
||||
{"id":"m15","src":"真题","sub":"math","ch":"最终圈","topic":"数列规律","type":"fill","stem":"数列2,6,12,20,30,...,第6个数是___,第n个数是___。","opts":null,"ans":"42, n(n+1)","exp":"2=1x2,6=2x3,12=3x4,20=4x5,30=5x6。第n个=n(n+1),第6个=6x7=42。"},
|
||||
{"id":"m24","src":"真题","sub":"math","ch":"第一赛段","topic":"比例尺","type":"choice","stem":"建长600m宽400m广场,画在长20cm宽16cm纸上,选哪种比例尺?","opts":["A. 1:2500","B. 1:3000","C. 1:4000","D. 1:4000000"],"ans":2,"exp":"600m=60000cm,400m=40000cm。1:4000时图上长=15cm,宽=10cm,在纸范围内。1:3000时宽13.3cm。最适宜1:4000。"},
|
||||
{"id":"m38","src":"真题","sub":"math","ch":"热身圈","topic":"分数化小数","type":"choice","stem":"下列分数不能化成有限小数的是( )。","opts":["A. 1/4","B. 1/8","D. 1/2","C. 1/3"],"ans":3,"exp":"分母只含质因数2和5的分数能化成有限小数。1/3分母含3,不能化成有限小数。"},
|
||||
{"id":"m59","src":"真题","sub":"math","ch":"第二赛段","topic":"组合图形","type":"choice","stem":"[FIG:4]长方形长8宽6,A和B是宽的中点,则阴影部分的面积是( )。","opts":["A. 12","B. 18","C. 24","D. 36"],"ans":0,"exp":"阴影三角形底=AB=8,高=宽的一半=3,面积=8x3/2=12。选A。"},
|
||||
{"id":"m133","src":"真题","sub":"math","ch":"最终圈","topic":"逻辑推理","type":"choice","stem":"有50名学生参加联欢会。第一个到会的女生同全部男生握过手,第二个到会的女生只差1个男生没握过手,第三个到会的女生只差2个男生没握手,以此类推,最后一个到会的女生同7个男生握过手。这50名同学中有多少男生?","opts":["A. 21人","B. 22人","C. 28人","D. 29人"],"ans":2,"exp":"设男生x人。第1个女生握x人,第2个握(x-1)人,第n个女生握(x-n+1)人。最后一个女生握7人,则x-n+1=7。总人数50:女生n+男生x=50。由x-n+1=7得x=n+6,代入x+n=50得n=22,x=28。选C。"},
|
||||
{"id":"m134","src":"真题","sub":"math","ch":"最终圈","topic":"逻辑推理","type":"choice","stem":"1号、2号、3号、4号运动员取得了800m赛跑的前四名。1号说:“3号在我们3人前面冲向终点。”另一位得第3名的运动员说:“1号不是第四名。”小裁判说:“他们的号码与他们的名次各不相同。”那么2号运动员的名次是第几名?","opts":["A. 第1名","B. 第2名","C. 第3名","D. 第4名"],"ans":3,"exp":"由1号的话可知3号是第1名(1/2/4号三人都在3号后面)。3号是第1名,则得第3名的运动员不是3号。他说1号不是第4名,1号也不是第3名,所以1号是第2名。剩下2号和4号争第3、第4名。号码与名次不同,4号不能第4名,所以4号第3名,2号第4名。选D。"},
|
||||
{"id":"m136","src":"真题","sub":"math","ch":"热身圈","topic":"统计图","type":"choice","stem":"长虹电视机厂为了能清楚地表示出上半年月产量的多少与增减变化的情况,应绘制( )。","opts":["A. 条形统计图","B. 折线统计图","C. 扇形统计图","D. 以上都可以"],"ans":1,"exp":"表示数量的多少用条形,表示增减变化用折线,表示占比用扇形。既要表示多少又要表示增减变化,选折线统计图。"},
|
||||
{"id":"m137","src":"真题","sub":"math","ch":"热身圈","topic":"概率","type":"choice","stem":"一枚质量均匀的硬币,每次投出后正面朝上和反面朝上的概率相同。将这枚硬币先后投两次,恰好其中一次正面朝上、另一次反面朝上的概率是多少?","opts":["A. 1/2","B. 1/3","C. 1/4","D. 2/3"],"ans":0,"exp":"投两次有4种等可能结果:正正、正反、反正、反反。一正一反有2种,概率=2/4=1/2。"},
|
||||
{"id":"m138","src":"真题","sub":"math","ch":"第二赛段","topic":"立体图形","type":"choice","stem":"一个边长为10厘米的正方体,在它的表面涂上红色的油漆,再将它切成边长为1厘米的小正方体。涂了一个面的小正方体有多少个?","opts":["A. 64个","B. 384个","C. 96个","D. 488个"],"ans":1,"exp":"每个面中间部分:边长为10-2=8厘米,8x8=64个。6个面共64x6=384个。角上的8个涂3面,棱上的96个涂2面,内部512个未涂色。"},
|
||||
{"id":"m139","src":"真题","sub":"math","ch":"第二赛段","topic":"组合图形","type":"choice","stem":"[FIG:1]如图所示,正方形ABCD边长为4,正方形CEFG边长为6,O1、O2分别是两个正方形的中心,则三角形O1CO2的面积是( )。","opts":["A. 4","B. 6","C. 8","D. 10"],"ans":1,"exp":"O1到C的水平和垂直距离均为正方形边长的一半:O1=(2,2)相对于C,O2=(-3,3)相对于C。三角形面积=1/2*底*高,用坐标法得面积=6。选B。"},
|
||||
{"id":"m142","src":"真题","sub":"math","ch":"最终圈","topic":"角度计算","type":"choice","stem":"[FIG:5]如图,∠A+∠B+∠C+∠D+∠E+∠F+∠G+∠H+∠I = ( )。","opts":["A. 360°","B. 540°","C. 720°","D. 900°"],"ans":1,"exp":"五角星的内角和=180°x(5-2)=540°。选B。"},
|
||||
{"id":"m143","src":"真题","sub":"math","ch":"第二赛段","topic":"找规律","type":"choice","stem":"[FIG:6]将正整数按如图所示的规律排列。若有序数对(n,m)表示第n排从左到右第m个数,如(4,2)表示实数9,则表示整数17的有序数对是( )。","opts":["A. (5,3)","B. (6,2)","C. (5,4)","D. (6,5)"],"ans":1,"exp":"第1排1个数,第2排2个…第6排共21个数。奇数排从左到右,偶数排从右到左。17在第6排,该排从左到右:…12,11,10,9,8,7。17在第6排从左数的第2个,即(6,2)。选B。"},
|
||||
{"id":"m144","src":"真题","sub":"math","ch":"最终圈","topic":"年龄问题","type":"choice","stem":"有甲、乙、丙三个人。当甲的年龄是丙的年龄的2倍时,三人的年龄和为83岁;当乙的年龄是丙的年龄的2倍时,甲是26岁。问:当甲的年龄是乙的年龄的2倍时,丙是多少岁?","opts":["A. 5","B. 7","C. 14","D. 19"],"ans":0,"exp":"条件1:甲=2丙,三人和=83。设丙=x,则甲=2x,乙=83-3x。条件2:乙=2丙,甲=26。设丙=y,则乙=2y。年龄差不变,联立得x=19,y=7。即条件1时甲38乙26丙19,条件2时甲26乙14丙7。求甲=2乙时丙的年龄:设从条件2过t年,则26+t=2(14+t),得t=-2。丙=7-2=5岁。选A。"},
|
||||
{"id":"c1","src":"真题","sub":"chinese","ch":"热身圈","topic":"看拼音写汉字","type":"fill","stem":"看拼音写汉字:\n心惊胆zhan( ) 应接不xia( ) 等量qi( )观 shou( )屈一指","opts":null,"ans":"战,暇,齐,首","exp":"心惊胆战(害怕)、应接不暇(忙不过来)、等量齐观(一视同仁)、首屈一指(排名第一)。"},
|
||||
{"id":"c2","src":"真题","sub":"chinese","ch":"热身圈","topic":"字音辨析","type":"choice","stem":"下列加点字读音不同的一项是( )。\nA. 世博/搏击风流 B. 作为/为富不仁 C. 仍然/忍辱负重 D. 词章/义不容辞","opts":["A. 世博/搏击风流","B. 作为/为富不仁","D. 词章/义不容辞","C. 仍然/忍辱负重"],"ans":3,"exp":"仍读reng,忍读ren,读音不同。A都读bo,B都读wei,D都读ci。"},
|
||||
{"id":"c3","src":"真题","sub":"chinese","ch":"第一赛段","topic":"错别字","type":"choice","stem":"下列各组中没有错别字的一项是( )。","opts":["A. 融恰 精湛 斩钉截铁 里应外和","B. 绚烂 铠旋 迫不急待 励精图治","D. 烦燥 鞠躬尽悴 赏心悦目","C. 懒惰 企图 小心翼翼 大材小用"],"ans":3,"exp":"A融恰=融洽,里应外和=合;B铠旋=凯旋,迫不急待=及;D烦燥=躁,鞠躬尽悴=瘁。C全对。"},
|
||||
{"id":"c4","src":"真题","sub":"chinese","ch":"第一赛段","topic":"成语运用","type":"choice","stem":"加点成语运用错误的一项是( )。","opts":["A. 剩下的复习时间指日可待。","B. 落入法网后痛心疾首。","C. 新场馆给人耳目一新的感觉。","D. 观点新颖,确实不同凡响。"],"ans":0,"exp":"指日可待指好事不久实现,用在复习时间上不恰当。应用屈指可数或时间紧迫。"},
|
||||
{"id":"c5","src":"真题","sub":"chinese","ch":"第二赛段","topic":"修改病句","type":"choice","stem":"没有语病的一项是( )。","opts":["A. 随着京剧活动引入课堂,让更多学生受到了熏陶。","D. 节目受到喜爱,是因为其形式新颖,有文化内涵的原因。","C. 读者深受喜爱的杨绛先生,不凡的一生中留下了大量作品。","B. 中国体育健儿正在积极备战奥运会。"],"ans":3,"exp":"A缺少主语(随着...让...);C读者深受喜爱应为深受读者喜爱;D是因为...的原因重复。B正确。"},
|
||||
{"id":"c7","src":"真题","sub":"chinese","ch":"最终圈","topic":"文学常识","type":"fill","stem":"唐宋八大家:唐___、___;宋___、___、___、___、___、___。","opts":null,"ans":"韩愈,柳宗元,欧阳修,苏洵,苏轼,苏辙,王安石,曾巩","exp":"口诀:韩柳欧苏王曾苏(韩愈、柳宗元、欧阳修、苏洵、苏轼、苏辙、王安石、曾巩)。"},
|
||||
{"id":"c38","src":"真题","sub":"chinese","ch":"热身圈","topic":"字音","type":"choice","stem":"下列加点字注音完全正确的一项是( )。","opts":["A. 粗糙(cao) 应和(he) 酝酿(niang) 锲而不舍(qie)","B. 炫目(xuan) 称职(cheng) 倔强(jue) 白驹过隙(xi)","D. 干涸(he) 灼热(zhuo) 挣脱(zheng) 潜移默化(qian)","C. 翘楚(qiao) 汲取(ji) 和煦(xu) 茅塞顿开(se)"],"ans":3,"exp":"A粗糙cao错、C翘qiao应读二声、D潜qian应读二声。B全对。"},
|
||||
{"id":"c39","src":"真题","sub":"chinese","ch":"热身圈","topic":"看拼音写汉字","type":"fill","stem":"看拼音写词语:\npai huai( ) chou ti( ) cui can( ) yishan lan lu( ) kun peng( )展翅","opts":null,"ans":"徘徊,抽屉,璀璨,衣衫褴褛,鲲鹏","exp":"徘徊(犹豫不决)、抽屉(家具)、璀璨(光彩夺目)、衣衫褴褛(衣服破烂)、鲲鹏(古代传说中的大鸟)。"},
|
||||
{"id":"c40","src":"真题","sub":"chinese","ch":"热身圈","topic":"字音辨析","type":"fill","stem":"给下列加点字注音:\n档( )次 给( )予 模( )样 惩( )罚 潜( )能\n歼( )灭 造诣( ) 膝( )盖 尽( )管 拖累( )","opts":null,"ans":"dang,ji,mu,cheng,qian,jian,yi,xi,jin,lei","exp":"档次dang、给予ji、模样mu、惩罚cheng、潜能qian、歼灭jian、造诣yi、膝盖xi、尽管jin、拖累lei。注意都是易错读音。"},
|
||||
{"id":"c41","src":"真题","sub":"chinese","ch":"热身圈","topic":"错别字","type":"choice","stem":"下列词语中错别字最多的一项是( )。","opts":["A. 优久 迎和 安详 滥芋充数","B. 干躁 荒费 秘决 不谋而合","C. 气慨 元霄 闲瑕 搬弄事非","D. 篷勃 泻气 悬涯 变本加厉"],"ans":3,"exp":"D篷-蓬、泻-泄、涯-崖,3个错。A忧(悠→改优)、和-合、芋-竽,3个。B躁-燥、费-废、决-诀,3个。C慨-概、霄-宵、瑕-暇、事-是,4个。C最多。"},
|
||||
{"id":"c43","src":"真题","sub":"chinese","ch":"热身圈","topic":"反义词","type":"fill","stem":"写出下列词语的反义词:\n杂乱无章-( ) 华而不实-( ) 尴尬-( )","opts":null,"ans":"井井有条,朴实无华,自然","exp":"杂乱无章反义井井有条(或条理清晰),华而不实反义朴实无华(或表里如一),尴尬反义自然(或大方)。"},
|
||||
{"id":"c44","src":"真题","sub":"chinese","ch":"第一赛段","topic":"成语故事人物","type":"fill","stem":"写出下列成语中的历史人物:\n闻鸡起舞( ) 卧薪尝胆( ) 破釜沉舟( )","opts":null,"ans":"祖逖,勾践,项羽","exp":"闻鸡起舞-祖逖与刘琨,卧薪尝胆-勾践,破釜沉舟-项羽。"},
|
||||
{"id":"c45","src":"真题","sub":"chinese","ch":"第一赛段","topic":"成语故事人物","type":"fill","stem":"写出下列成语中的历史人物:\n完璧归赵( ) 负荆请罪( ) 鞠躬尽瘁( )","opts":null,"ans":"蔺相如,廉颇,诸葛亮","exp":"完璧归赵-蔺相如,负荆请罪-廉颇,鞠躬尽瘁-诸葛亮。"},
|
||||
{"id":"c49","src":"真题","sub":"chinese","ch":"第一赛段","topic":"病句修改","type":"fill","stem":"修改病句:\n(1) 从化的天气是一个疗养、游玩的好地方。\n(2) 老师们都离开了,只有李老师还在批改作业。","opts":null,"ans":"从化是一个疗养游玩的好地方,老师们都离开了办公室只有李老师还在批改作业","exp":"(1)搭配不当:天气不是好地方,改为'从化'。(2)前后矛盾:都离开了与只有李老师矛盾,改为'其他老师都离开了'。"},
|
||||
{"id":"c50","src":"真题","sub":"chinese","ch":"第一赛段","topic":"修辞手法","type":"choice","stem":"选出下列各句中运用修辞方法不同的一句( )。","opts":["A. 柳枝染上了嫩绿,在春风里尽情飘摆。","B. 一架架风筝在同白云戏耍。","C. 燕子有一个剪刀似的尾巴。","D. 连翘花举起金黄色的小喇叭,向着春天吹奏。"],"ans":2,"exp":"ABD都是拟人(赋予人的动作),C是比喻(把尾巴比作剪刀)。"},
|
||||
{"id":"c51","src":"真题","sub":"chinese","ch":"第一赛段","topic":"修辞手法","type":"fill","stem":"指出下列句子使用的修辞手法:\n(1) 项羽大喝一声,好似把山也震得晃动起来。( )\n(2) 对面有个白胡子向我们走来。( )\n(3) 潮水喘着粗气向岸边涌来。( )","opts":null,"ans":"夸张,借代,拟人","exp":"(1)夸张(夸大),(2)借代(用白胡子代老人),(3)拟人(喘着粗气)。"},
|
||||
{"id":"c52","src":"真题","sub":"chinese","ch":"第一赛段","topic":"句子排序","type":"choice","stem":"将下列句子组成一段连贯的话,最恰当的顺序是( )。\n①人格是什么?\n②只有恪守纯洁、崇高的人格。\n③一个人格猥琐、低劣,其一生必将渺小、肮脏。\n④才能造就亮丽、伟岸的人生。\n⑤人格是心灵的护佑、人生的座基。","opts":["A. ①⑤③②④","B. ①③⑤②④","C. ⑤①③②④","D. ③①⑤②④"],"ans":0,"exp":"①问→⑤答→③反面→②条件→④结果。正确顺序①⑤③②④。"},
|
||||
{"id":"c53","src":"真题","sub":"chinese","ch":"第一赛段","topic":"句子排序","type":"choice","stem":"填入横线处最恰当的句子是:\n回首昨天,应该是( )的;面对今天,应该是( )的;展望明天,应该是( )的。","opts":["A. 问心无愧 倍加珍惜 信心百倍","B. 信心百倍 问心无愧 倍加珍惜","C. 问心无愧 信心百倍 倍加珍惜","D. 倍加珍惜 问心无愧 信心百倍"],"ans":0,"exp":"回首昨天→问心无愧,面对今天→倍加珍惜,展望明天→信心百倍。"},
|
||||
{"id":"c61","src":"真题","sub":"chinese","ch":"第二赛段","topic":"古诗文默写","type":"fill","stem":"补写出下列名句的空缺部分:\n(1) 小荷才露尖尖角,( )。\n(2) ( ),悠然见南山。\n(3) 接天莲叶无穷碧,( )。\n(4) 谁言寸草心,( )。\n(5) 随风潜入夜,( )。","opts":null,"ans":"早有蜻蜓立上头,采菊东篱下,映日荷花别样红,报得三春晖,润物细无声","exp":"(1)杨万里《小池》,(2)陶渊明《饮酒》,(3)杨万里《晓出净慈寺》,(4)孟郊《游子吟》,(5)杜甫《春夜喜雨》。"},
|
||||
{"id":"c62","src":"真题","sub":"chinese","ch":"第二赛段","topic":"古诗文默写","type":"fill","stem":"补写出下列名句的空缺部分:\n(1) 人生自古谁无死,( )。\n(2) 我寄愁心与明月,( )。\n(3) 横眉冷对千夫指,( )。\n(4) 忽如一夜春风来,( )。\n(5) 会当凌绝顶,( )。","opts":null,"ans":"留取丹心照汗青,随君直到夜郎西,俯首甘为孺子牛,千树万树梨花开,一览众山小","exp":"(1)文天祥《过零丁洋》,(2)李白《闻王昌龄左迁龙标遥有此寄》,(3)鲁迅《自嘲》,(4)岑参《白雪歌送武判官归京》,(5)杜甫《望岳》。"},
|
||||
{"id":"c63","src":"真题","sub":"chinese","ch":"第二赛段","topic":"古诗文默写","type":"fill","stem":"古典诗词中意境纷繁。请默写出古诗词中含有「雨」字的两个连贯的句子:\n(1) ( )\n(2) ( )","opts":null,"ans":"好雨知时节,当春乃发生","exp":"含雨的诗句很多:好雨知时节当春乃发生、清明时节雨纷纷、渭城朝雨浥轻尘、天街小雨润如酥等。"},
|
||||
{"id":"c66","src":"真题","sub":"chinese","ch":"第三赛段","topic":"文言文阅读","type":"choice","stem":"阅读《师旷论学》:\n晋平公问于师旷曰:“吾年七十,欲学,恐已暮矣!”\n师旷曰:“何不炳烛乎?”\n平公曰:“安有为人臣而戏其君乎?”\n师旷曰:“盲臣安敢戏其君乎?臣闻之:少而好学,如日出之阳;壮而好学,如日中之光;老而好学,如炳烛之明。炳烛之明,孰与昧行乎?”\n平公曰:“善哉!”\n\n“恐已暮矣”中“暮”的意思是( )。","opts":["A. 傍晚","B. 年老","C. 昏暗","D. 迟、晚"],"ans":3,"exp":"暮本义傍晚,此处引申为晚了、迟了。"},
|
||||
{"id":"c67","src":"真题","sub":"chinese","ch":"第三赛段","topic":"文言文阅读","type":"choice","stem":"(接上题)“何不炳烛乎”中“炳”的意思是( )。","opts":["A. 明亮","D. 照耀","C. 火炬","B. 点燃"],"ans":3,"exp":"炳在此处作动词,点燃。炳烛=点燃蜡烛。"},
|
||||
{"id":"c68","src":"真题","sub":"chinese","ch":"第三赛段","topic":"文言文阅读","type":"choice","stem":"(接上题)师旷用“日出之阳”“日中之光”“炳烛之明”说明什么道理?","opts":["A. 人老了不用学习","B. 学习要趁年轻","C. 任何时候学习都不晚","D. 老年人学习不如年轻人"],"ans":2,"exp":"师旷用三个比喻说明:少年中年老年都好学,但晚年学习虽晚仍胜过不学。核心是任何时候学习都不晚。"},
|
||||
{"id":"c69","src":"真题","sub":"chinese","ch":"第三赛段","topic":"文言文阅读","type":"choice","stem":"“少而好学,如日出之阳”运用了什么修辞手法?","opts":["A. 拟人","B. 夸张","C. 比喻","D. 排比"],"ans":2,"exp":"把少时好学比作初升的太阳,是比喻。同时三个'如'构成排比。"},
|
||||
{"id":"c70","src":"真题","sub":"chinese","ch":"第三赛段","topic":"文言文阅读","type":"fill","stem":"翻译句子:\n“炳烛之明,孰与昧行乎?”\n译文:_______________","opts":null,"ans":"点燃蜡烛的光亮,与在黑暗中行走相比哪个更好呢","exp":"孰与表比较,昧行意为在黑暗中行走。整句意为:点燃蜡烛的光亮总比在黑暗中行走好吧。"},
|
||||
{"id":"c71","src":"真题","sub":"chinese","ch":"第三赛段","topic":"现代文阅读","type":"fill","stem":"阅读《忆洗星海》(茅盾):\n和洗星海见面的时候,已经是在听过他作品的演奏、读过了他那万余言的自传以后。那一次我所听到的《黄河大合唱》,据说是小规模的。那次演奏的指挥是一位青年音乐家,朋友告诉我,洗星海就是那位青年音乐家的老师……\n\n填写表格:\n回忆:听《黄河大合唱》\n想象、印象:_______________","opts":null,"ans":"气势磅礴/深受感动","exp":"从选文可知,小规模的演奏已给作者留下深刻印象,可填'气势磅礴'或'深受感动'。"},
|
||||
{"id":"c72","src":"真题","sub":"chinese","ch":"第三赛段","topic":"现代文阅读","type":"fill","stem":"(接上题)\n回忆:读洗星海的自传\n想象、印象:_______________","opts":null,"ans":"气魄伟大/好学深思","exp":"从选文中对洗星海的描述和传记可得出'气魄伟大,好学深思'的印象。"},
|
||||
{"id":"c73","src":"真题","sub":"chinese","ch":"第三赛段","topic":"现代文阅读","type":"fill","stem":"(接上题)\n回忆:( )\n想象、印象:气魄伟大,好学深思,热爱祖国\n\n横线处应填什么回忆内容?","opts":null,"ans":"和洗星海见面","exp":"一二行是听演奏和读自传,第三行从印象反推应是'和洗星海见面'。"},
|
||||
{"id":"c74","src":"真题","sub":"chinese","ch":"第三赛段","topic":"现代文阅读","type":"choice","stem":"(接上题)结合文章内容,揣摩作者在正式见面前已经听过洗星海的作品、读过他的自传,这说明作者对洗星海有着怎样的情感?","opts":["A. 充满好奇","B. 非常怀疑","C. 毫不在意","D. 十分失望"],"ans":0,"exp":"正式见面前先去听作品、读自传,说明作者对洗星海充满好奇。这正是'好奇'的原因和内容。"},
|
||||
{"id":"c75","src":"真题","sub":"chinese","ch":"第三赛段","topic":"现代文阅读","type":"fill","stem":"阅读《一件毛衣的温度》。\n请概括文章的主要内容:\n_______________","opts":null,"ans":"文章通过一件毛衣的故事,讲述了人与人之间的温暖与关爱","exp":"概括主要内容要抓住:人物+事件+主题。记叙文概括公式:谁+做了什么+表现了什么。"},
|
||||
{"id":"c76","src":"真题","sub":"chinese","ch":"第三赛段","topic":"现代文阅读","type":"fill","stem":"(接上题)\n请赏析文中画线句子的修辞手法和表达效果:\n_______________","opts":null,"ans":"运用了比喻的修辞手法,生动形象地写出了……","exp":"赏析句子公式:修辞手法+具体表达效果+情感。常见修辞:比喻、拟人、排比、夸张。"},
|
||||
{"id":"c77","src":"真题","sub":"chinese","ch":"第三赛段","topic":"现代文阅读","type":"fill","stem":"阅读《一件毛衣的温度》。\n请找出文中你认为最感人的一处细节描写,并说明理由:\n_______________","opts":null,"ans":"细节描写处+原因分析","exp":"细节描写赏析:找具体的动作、神态、语言描写,分析其表达的情感。"},
|
||||
{"id":"c79","src":"真题","sub":"chinese","ch":"第三赛段","topic":"文学常识","type":"fill","stem":"下面对联吟咏了我国几位著名文学家:\n(1) 痛饮读离骚,放开古今才子胆;狂歌吊湘水,照见江潭渔父心。( )\n(2) 「草堂留后世,诗圣著千秋」写的是( )。\n(3) 「大河百代,众浪齐奔,淘尽万古英雄汉;词苑千载,群芳竞秀,盛开一枝女儿花」写的是( )。","opts":null,"ans":"屈原,杜甫,李清照","exp":"(1)屈原作《离骚》,投汨罗江;(2)杜甫草堂+诗圣;(3)词苑+女儿花=女词人李清照。"},
|
||||
{"id":"c80","src":"真题","sub":"chinese","ch":"第三赛段","topic":"文学常识","type":"fill","stem":"《三国演义》中“三国”指( )、( )、( )。\n“可叹停机德,堪怜咏絮才”依次指《红楼梦》中的( )和( )。","opts":null,"ans":"魏,蜀,吴,薛宝钗,林黛玉","exp":"三国鼎立:曹魏、蜀汉、东吴。停机德指薛宝钗,咏絮才指林黛玉。"},
|
||||
{"id":"c96","src":"真题","sub":"chinese","ch":"热身圈","topic":"错别字","type":"fill","stem":"改正下列词语中的错别字:\n前扑后继( ) 拾金不味( ) 愤不顾身( )\n无可耐何( ) 文丝不动( ) 迫不急待( )","opts":null,"ans":"扑-仆,味-昧,愤-奋,耐-奈,文-纹,急-及","exp":"前仆后继、拾金不昧、奋不顾身、无可奈何、纹丝不动、迫不及待。"},
|
||||
{"id":"e1","src":"真题","sub":"english","ch":"热身圈","topic":"be动词","type":"choice","stem":"Five and seven ___ twelve.","opts":["C. is","B. are","A. be","D. am"],"ans":0,"exp":"5+7=12是一个整体概念(一个数),用is。"},
|
||||
{"id":"e2","src":"真题","sub":"english","ch":"热身圈","topic":"冠词","type":"choice","stem":"Mr. Wang is ___ excellent teacher.","opts":["A. a","D. /","C. the","B. an"],"ans":3,"exp":"excellent以元音音素/e/开头,用an。"},
|
||||
{"id":"e3","src":"真题","sub":"english","ch":"热身圈","topic":"冠词","type":"choice","stem":"Do you like playing ___ piano? - No, I like playing ___ chess.","opts":["A. a, the","D. the, a","C. /, the","B. the, /"],"ans":3,"exp":"乐器前加the(piano),球类/棋类前不加冠词(chess)。"},
|
||||
{"id":"e4","src":"真题","sub":"english","ch":"第一赛段","topic":"代词","type":"choice","stem":"My cousin gave ___ a cute teddy bear for my birthday.","opts":["C. me","B. my","A. I","D. mine"],"ans":0,"exp":"gave后接宾语,用宾格me。"},
|
||||
{"id":"e5","src":"真题","sub":"english","ch":"第一赛段","topic":"介词","type":"choice","stem":"John starts work ___ 10 o'clock every day.","opts":["C. at","B. on","A. in","D. for"],"ans":0,"exp":"at+具体时间点。at跟点,on跟天,in跟月年。"},
|
||||
{"id":"e6","src":"真题","sub":"english","ch":"第一赛段","topic":"一般现在时","type":"choice","stem":"My mother often ___ after supper with my sister.","opts":["A. is taking a walk","B. take walk","C. takes walks","D. takes a walk"],"ans":3,"exp":"第三人称单数(My mother),often表经常,用一般现在时,动词加s。take a walk固定搭配。"},
|
||||
{"id":"e7","src":"真题","sub":"english","ch":"第二赛段","topic":"现在进行时","type":"choice","stem":"We ___ a model plane now.","opts":["A. make","D. is making","C. makes","B. are making"],"ans":3,"exp":"now表正在,用现在进行时be+doing。主语We,用are。"},
|
||||
{"id":"e8","src":"真题","sub":"english","ch":"第二赛段","topic":"一般过去时","type":"choice","stem":"There ___ a sports meeting last week.","opts":["C. was","B. is","A. be","D. had"],"ans":0,"exp":"last week是过去时间。sports meeting单数,There was。"},
|
||||
{"id":"e9","src":"真题","sub":"english","ch":"第二赛段","topic":"一般将来时","type":"choice","stem":"___ stay with your uncle this winter holiday?","opts":["A. Are you going to","B. Do you","C. Were you going to","D. Are you"],"ans":0,"exp":"this winter holiday表将来。be going to表计划。主语you,用Are you going to。"},
|
||||
{"id":"e10","src":"真题","sub":"english","ch":"第三赛段","topic":"比较级最高级","type":"choice","stem":"Who climbs ___, Jim, Peter or Sam?","opts":["A. the higher","B. higher","C. high","D. the highest"],"ans":3,"exp":"三个人比较,用最高级,最高级前加the。"},
|
||||
{"id":"e11","src":"真题","sub":"english","ch":"第三赛段","topic":"疑问词","type":"choice","stem":"___ does Julia go to work? - She walks to the bus stop, then takes the bus.","opts":["A. How far","B. How long","C. How often","D. How"],"ans":3,"exp":"答句说交通方式,问怎么去,用How。"},
|
||||
{"id":"e13","src":"真题","sub":"english","ch":"最终圈","topic":"完形填空","type":"choice","stem":"Mrs. Jack was always ___1___ lots of time and money in ___2___ the shopping. One day, Mrs. Jack wanted to do a lot of shopping, so she waited ___3___ it was Saturday when her husband was ___4___, and she ___5___ him to the shops with her.\n___1.","opts":["A. spent","D. to spend","C. spend","B. spending"],"ans":3,"exp":"be always doing sth总是做某事,且spend time (in) doing是固定搭配。选spending。\n💡 完形口诀:固定搭配先想到→spend time (in) doing。"},
|
||||
{"id":"e14","src":"真题","sub":"english","ch":"最终圈","topic":"语音","type":"choice","stem":"划线部分读音不同的一项是( ):","opts":["A. cake","D. name","C. gate","B. apple"],"ans":3,"exp":"apple的a发/ae,其他三个cake/gate/name发/ei/。"},
|
||||
{"id":"e15","src":"真题","sub":"english","ch":"最终圈","topic":"语音","type":"choice","stem":"oo发音不同的一项是( ):","opts":["A. look","B. good","C. book","D. school"],"ans":3,"exp":"look,good,book的oo发/u/,school的oo发/u:/。"},
|
||||
{"id":"e30","src":"真题","sub":"english","ch":"热身圈","topic":"be动词","type":"fill","stem":"用am/is/are填空:\nI ___ a student. You ___ my friend. She ___ a teacher.","opts":null,"ans":"am,are,is","exp":"I用am,you用are,第三人称单数she用is。"},
|
||||
{"id":"e31","src":"真题","sub":"english","ch":"热身圈","topic":"特殊疑问句","type":"choice","stem":"___ do you go to school? - At 7:30.","opts":["A. What time","B. What","C. Where","D. How"],"ans":0,"exp":"答句7:30是时间,问几点,用What time或When。"},
|
||||
{"id":"e32","src":"真题","sub":"english","ch":"热身圈","topic":"特殊疑问句","type":"choice","stem":"___ is your school? - It's near the park.","opts":["A. What","D. Who","C. How","B. Where"],"ans":3,"exp":"答是地点,用Where。"},
|
||||
{"id":"e33","src":"真题","sub":"english","ch":"热身圈","topic":"特殊疑问句","type":"choice","stem":"___ books do you have? - I have ten.","opts":["A. How much","D. How long","C. How old","B. How many"],"ans":3,"exp":"books可数,用How many。How much修饰不可数名词或问价格。"},
|
||||
{"id":"e34","src":"真题","sub":"english","ch":"热身圈","topic":"特殊疑问句","type":"choice","stem":"___ is the skirt? - It's 50 yuan.","opts":["A. How many","D. How long","C. How old","B. How much"],"ans":3,"exp":"问价格用How much。"},
|
||||
{"id":"e35","src":"真题","sub":"english","ch":"热身圈","topic":"特殊疑问句","type":"choice","stem":"___ do you like summer? - Because I can swim.","opts":["A. What","D. Where","C. When","B. Why"],"ans":3,"exp":"答because,问原因用Why。"},
|
||||
{"id":"e36","src":"真题","sub":"english","ch":"热身圈","topic":"特殊疑问句","type":"choice","stem":"___ is that girl? - She's my sister.","opts":["C. Who","B. Where","A. What","D. Whose"],"ans":0,"exp":"问人用Who。"},
|
||||
{"id":"e37","src":"真题","sub":"english","ch":"第二赛段","topic":"过去时","type":"choice","stem":"My mother ___ a new dress for me yesterday.","opts":["A. buy","B. buys","D. buying","C. bought"],"ans":3,"exp":"yesterday表过去,用过去式bought。"},
|
||||
{"id":"e38","src":"真题","sub":"english","ch":"第二赛段","topic":"过去时","type":"choice","stem":"We ___ to the park last Sunday.","opts":["A. go","B. goes","D. going","C. went"],"ans":3,"exp":"last Sunday表过去,用过去式went。"},
|
||||
{"id":"e39","src":"真题","sub":"english","ch":"第二赛段","topic":"过去时","type":"fill","stem":"用所给词的适当形式填空:\nHe ___ (visit) his grandparents last weekend.","opts":null,"ans":"visited","exp":"last weekend表过去,visit变过去式visited。"},
|
||||
{"id":"e40","src":"真题","sub":"english","ch":"第二赛段","topic":"将来时","type":"choice","stem":"There ___ a football match tomorrow.","opts":["A. is","B. was","C. is going to be","D. will has"],"ans":2,"exp":"tomorrow表将来。There be的将来时=There is going to be或There will be。"},
|
||||
{"id":"e41","src":"真题","sub":"english","ch":"第二赛段","topic":"将来时","type":"choice","stem":"I ___ you tomorrow.","opts":["A. call","B. called","C. will call","D. am call"],"ans":2,"exp":"tomorrow表将来。will+动词原形,will call。"},
|
||||
{"id":"e42","src":"真题","sub":"english","ch":"第二赛段","topic":"将来时","type":"fill","stem":"用所给词填空:\nThey ___ (have) a party next week.","opts":null,"ans":"will have","exp":"next week表将来。will have。"},
|
||||
{"id":"e44","src":"真题","sub":"english","ch":"第二赛段","topic":"进行时","type":"fill","stem":"用所给词填空:\nLook! They ___ (play) football.","opts":null,"ans":"are playing","exp":"Look表正在发生,用现在进行时。主语They,用are playing。"},
|
||||
{"id":"e49","src":"真题","sub":"english","ch":"第三赛段","topic":"比较级","type":"choice","stem":"Tom is ___ than his brother.","opts":["A. tall","D. more tall","C. tallest","B. taller"],"ans":3,"exp":"than提示比较级。tall的比较级taller。"},
|
||||
{"id":"e50","src":"真题","sub":"english","ch":"第三赛段","topic":"比较级","type":"choice","stem":"This book is ___ than that one.","opts":["A. interestinger","D. interesting","C. most interesting","B. more interesting"],"ans":3,"exp":"多音节词interesting的比较级用more interesting。"},
|
||||
{"id":"e66","src":"真题","sub":"english","ch":"第二赛段","topic":"句型转换","type":"fill","stem":"改为一般疑问句:\nHe likes playing football.\n___ he ___ playing football?","opts":null,"ans":"Does,like","exp":"主语he三单,需用Does开头,动词like恢复原形。"},
|
||||
{"id":"e67","src":"真题","sub":"english","ch":"第二赛段","topic":"句型转换","type":"fill","stem":"改为否定句:\nShe can swim.\nShe ___ ___ swim.","opts":null,"ans":"cannot","exp":"can的否定式是cannot(cant)。"},
|
||||
{"id":"e71","src":"真题","sub":"english","ch":"第三赛段","topic":"阅读理解","type":"choice","stem":"Read the passage:\nTony loved basketball. One afternoon on his way to a basketball game, he was walking and dreaming about playing college basketball the next year. Suddenly a car hit him and he was thrown three meters into the air. Tony woke up in a hospital room. When the doctor told him that both his legs were broken, he knew his college basketball dreams were over. After he left the hospital, Tony was sent to a health center. A week after he arrived there, he met Sunny Chen. Sunny used to be a coach. His legs were hurt badly in a skating accident. Though he couldnt move his legs, Sunny became a coach of a basketball team called the Suns. It was an on-wheelchair basketball team. Sunny invited Tony to join the game. Tony played badly, but for the first time since the accident, he stopped feeling sorry for himself.\n\nFrom the passage, we know that Tony was hit by ___.","opts":["A. a bus","D. a football","C. a basketball","B. a car"],"ans":3,"exp":"原文:Suddenly a car hit him and he was thrown three meters into the air.\n📖 阅读口诀:先看题→划关键词(hit)→回原文定位→找同义句。"},
|
||||
{"id":"e72","src":"真题","sub":"english","ch":"第三赛段","topic":"阅读理解","type":"choice","stem":"(接上题)Where did Tony meet Sunny?","opts":["A. At the hospital","D. In a car accident","C. At a basketball game","B. At the health center"],"ans":3,"exp":"原文:After he left the hospital, Tony was sent to a health center. A week after he arrived there, he met Sunny Chen.\n📖 阅读口诀:问地点→找where同义词(health center)→人名出现处就是答案。"},
|
||||
{"id":"e73","src":"真题","sub":"english","ch":"第三赛段","topic":"阅读理解","type":"choice","stem":"(接上题)How did Sunny help Tony?","opts":["A. By teaching him how to play basketball","B. By giving him some medicine","C. By having dinner with him","D. By inviting him to join the Suns and being with him"],"ans":3,"exp":"原文:Sunny became a coach of a basketball team called the Suns... Sunny invited Tony to join the game.\n📖 阅读口诀:细节题→找help的同义词(invited/join)→锁定答案。"},
|
||||
{"id":"e75","src":"真题","sub":"english","ch":"第三赛段","topic":"阅读理解","type":"choice","stem":"Read the passage:\nDear Linda,\nI'm having a great time in Hong Kong! The weather is sunny and hot. I go to the beach every day. I also visit the Peak and see the beautiful view. The food here is delicious - I love the dim sum! Tomorrow I'm going to Disneyland. I can't wait!\nLove, Amy\n\nWhere is Amy now?","opts":["A. She is in London","D. She is in Tokyo","C. She is in New York","B. She is in Hong Kong"],"ans":3,"exp":"信的开头:I'm having a great time in Hong Kong!\n📖 阅读口诀:主旨题→首句或尾句找答案→书信开头给出地点。"},
|
||||
{"id":"e76","src":"真题","sub":"english","ch":"第三赛段","topic":"阅读理解","type":"choice","stem":"(接上题)What does Amy go every day?","opts":["A. To the park","B. To the beach","C. To the museum","D. To the school"],"ans":1,"exp":"文中:I go to the beach every day.\n📖 阅读口诀:关键词定位法→找every day的同义词→原文直接给答案。"},
|
||||
{"id":"e77","src":"真题","sub":"english","ch":"第三赛段","topic":"阅读理解","type":"choice","stem":"(接上题)What is Amy going to do tomorrow?","opts":["A. Go shopping","B. Go to Disneyland","C. Go home","D. Visit a friend"],"ans":1,"exp":"文中:Tomorrow I'm going to Disneyland.\n📖 阅读口诀:时间词定位法→找到tomorrow→后面的内容就是答案。"},
|
||||
{"id":"e78","src":"真题","sub":"english","ch":"第三赛段","topic":"阅读理解","type":"choice","stem":"(接上题)What does Amy think of Hong Kong food?","opts":["A. Too spicy","B. Delicious","C. Very expensive","D. Not good"],"ans":1,"exp":"文中:The food here is delicious - I love the dim sum!\n📖 阅读口诀:观点题→找评价性形容词(delicious/love)→就是作者态度。"},
|
||||
{"id":"e84","src":"真题","sub":"english","ch":"热身圈","topic":"语音","type":"choice","stem":"找出划线部分读音不同的选项:A. city B. finish C. physical D. science","opts":["A. city","B. finish","C. physical","D. science"],"ans":3,"exp":"city/finish/physical的i发/I/,science的i发/aI/。"},
|
||||
{"id":"e85","src":"真题","sub":"english","ch":"热身圈","topic":"语音","type":"choice","stem":"找出划线部分读音不同的选项:A. subject B. duty C. cute D. Tuesday","opts":["A. subject","B. duty","C. cute","D. Tuesday"],"ans":0,"exp":"duty/cute/Tuesday的u发/ju:/,subject的u发/Q/。"},
|
||||
{"id":"e86","src":"真题","sub":"english","ch":"热身圈","topic":"语音","type":"choice","stem":"找出划线部分读音不同的选项:A. chat B. glad C. have D. grape","opts":["A. chat","B. glad","C. have","D. grape"],"ans":3,"exp":"chat/glad/have的a发/{/,grape的a发/eI/(开音节)。"},
|
||||
{"id":"e87","src":"真题","sub":"english","ch":"热身圈","topic":"语音","type":"choice","stem":"找出划线部分读音不同的选项:A. seat B. read C. sweater D. bean","opts":["A. seat","B. read","C. sweater","D. bean"],"ans":2,"exp":"seat/read/bean的ea发/i:/,sweater的ea发/e/。"},
|
||||
{"id":"e88","src":"真题","sub":"english","ch":"热身圈","topic":"语音","type":"choice","stem":"找出划线部分读音不同的选项:A. give B. like C. bike D. Mike","opts":["A. give","B. like","C. bike","D. Mike"],"ans":0,"exp":"like/bike/Mike的i发/aI/,give的i发/I/。"},
|
||||
{"id":"e89","src":"真题","sub":"english","ch":"热身圈","topic":"语音","type":"choice","stem":"找出划线部分读音不同的选项:A. with B. thank C. think D. month","opts":["A. with","B. thank","C. think","D. month"],"ans":0,"exp":"thank/think/month的th发/θ/,with的th发/e/。"},
|
||||
{"id":"e100","src":"真题","sub":"english","ch":"热身圈","topic":"冠词","type":"choice","stem":"Do you like playing ___ piano? — No, I like playing ___ chess.","opts":["A. a, the","B. the, /","C. /, the","D. the, a"],"ans":1,"exp":"乐器前加the(弹钢琴),球类/棋类前不加冠词(下棋)。"},
|
||||
{"id":"e101","src":"真题","sub":"english","ch":"热身圈","topic":"冠词","type":"choice","stem":"There's ___ interesting book about animals in my bag.","opts":["A. a","B. an","C. the","D. /"],"ans":1,"exp":"interesting以元音音素开头,用an。泛指一本有趣的书。"},
|
||||
{"id":"e114","src":"真题","sub":"english","ch":"热身圈","topic":"介词","type":"choice","stem":"We usually go to school ___ bus.","opts":["A. in","B. on","C. by","D. with"],"ans":2,"exp":"by+交通工具,by bus坐公交车。"},
|
||||
{"id":"e115","src":"真题","sub":"english","ch":"热身圈","topic":"介词","type":"choice","stem":"My sister was born ___ the morning of May 1st.","opts":["A. in","B. on","C. at","D. for"],"ans":1,"exp":"具体某一天的上午/下午用on。"},
|
||||
{"id":"e121","src":"真题","sub":"english","ch":"第二赛段","topic":"名词复数","type":"fill","stem":"将下列句子改为单数:\nThe children have some apples.\nThe ___ ___ some ___.","opts":null,"ans":"child has,an apple","exp":"children单数child,have变has,apples变an apple。"},
|
||||
{"id":"e122","src":"真题","sub":"english","ch":"第二赛段","topic":"名词复数","type":"choice","stem":"Look! The ___ are playing in the park.","opts":["A. child","B. childs","C. children","D. childrens"],"ans":2,"exp":"child的复数是不规则变化children,不加s。"},
|
||||
{"id":"e123","src":"真题","sub":"english","ch":"第二赛段","topic":"名词复数","type":"choice","stem":"There are five ___ and two ___ in the room.","opts":["A. mans, womans","B. men, woman","C. men, women","D. mans, women"],"ans":2,"exp":"man→men, woman→women。均为不规则复数。"},
|
||||
{"id":"e124","src":"真题","sub":"english","ch":"第二赛段","topic":"句型转换","type":"fill","stem":"They like swimming.(改为否定句)\nThey ___ ___ swimming.","opts":null,"ans":"don't like","exp":"一般现在时,主语they,否定用don't+动词原形。"},
|
||||
{"id":"e125","src":"真题","sub":"english","ch":"第二赛段","topic":"句型转换","type":"fill","stem":"He can play the piano.(改为一般疑问句)\n___ he ___ the piano?","opts":null,"ans":"Can,play","exp":"情态动词can提至句首,动词用原形。"},
|
||||
{"id":"e126","src":"真题","sub":"english","ch":"热身圈","topic":"比较级","type":"choice","stem":"Whose paper planes are ___, Lucy or Lily?","opts":["A. well","B. best","C. the best","D. better"],"ans":3,"exp":"两者之间(Lucy和Lily两人)用比较级better。"},
|
||||
{"id":"e127","src":"真题","sub":"english","ch":"热身圈","topic":"情态动词","type":"choice","stem":"—Can you speak English? —No, I ___.","opts":["A. can","B. can't","C. am not","D. don't"],"ans":1,"exp":"用can提问,否定回答用can't。"},
|
||||
{"id":"e130","src":"真题","sub":"english","ch":"第一赛段","topic":"句型转换","type":"fill","stem":"Mary reads English every morning.(改为一般疑问句)\n___ Mary ___ English every morning?","opts":null,"ans":"Does,read","exp":"一般现在时,主语Mary三单,用Does提问,动词还原为read。"},
|
||||
{"id":"e131","src":"真题","sub":"english","ch":"第一赛段","topic":"句型转换","type":"fill","stem":"Miss Zhang teaches us English.(对划线部分提问,划线部分为Miss Zhang)\n___ teaches you English?","opts":null,"ans":"Who","exp":"对人物主语提问用Who。"},
|
||||
{"id":"e132","src":"真题","sub":"english","ch":"第二赛段","topic":"句型转换","type":"fill","stem":"She is good at speaking English.(改为同义句)\nShe ___ ___ speaking English.","opts":null,"ans":"does well in","exp":"be good at = do well in,主语三单She,用does。"},
|
||||
{"id":"e133","src":"真题","sub":"english","ch":"热身圈","topic":"语音","type":"choice","stem":"找出划线部分读音不同的选项:count house trousers young","opts":["A. count","B. house","C. trousers","D. young"],"ans":3,"exp":"count/house/trousers的ou发/a?/,young的ou发/?/。"},
|
||||
{"id":"e134","src":"真题","sub":"english","ch":"热身圈","topic":"语音","type":"choice","stem":"找出划线部分读音不同的选项:which Chinese brochure cheap","opts":["A. which","B. Chinese","C. brochure","D. cheap"],"ans":2,"exp":"which/Chinese/cheap的ch发/t?/,brochure的ch发/?/。"},
|
||||
{"id":"e135","src":"真题","sub":"english","ch":"热身圈","topic":"语音","type":"choice","stem":"找出划线部分读音不同的选项:reached laughed needed worked","opts":["A. reached","B. laughed","C. needed","D. worked"],"ans":2,"exp":"reached/t/、laughed/t/、worked/t/,needed因ed前是t读/Id/。选C。"},
|
||||
{"id":"e138","src":"真题","sub":"english","ch":"第一赛段","topic":"一般现在时","type":"choice","stem":"—How often does Tom play football? —___ He doesn't like football.","opts":["A. Often","B. Always","C. Hardly ever","D. Every day"],"ans":2,"exp":"He doesn't like football说明他几乎不踢球,选Hardly ever(几乎从不)。\n💡 一般现在时口诀:频率副词要看清,often经常always总,hardly ever几乎不。"},
|
||||
{"id":"e139","src":"真题","sub":"english","ch":"第一赛段","topic":"一般现在时","type":"fill","stem":"Mary reads English every morning.(改为一般疑问句)\n___ Mary ___ English every morning?","opts":null,"ans":"Does,read","exp":"一般现在时主语Mary三单,需用Does提问,动词reads还原为read。\n💡 句型转换口诀:三单借Does,动词还原形。"},
|
||||
{"id":"m201","src":"真题","sub":"math","ch":"热身圈","topic":"整数与小数读写","type":"fill","stem":"五亿零七千三百写作( ),300.009读作( )。","opts":null,"ans":"500007300,三百点零零九","exp":"五亿=5_0000_0000,零七千三百=7300,合=500007300。300.009读作三百点零零九。"},
|
||||
{"id":"m202","src":"真题","sub":"math","ch":"热身圈","topic":"分数","type":"choice","stem":"一个自然数(0除外)乘真分数所得的积( )。","opts":["A. 等于这个自然数","B. 大于这个自然数","D. 不能判定","C. 小于这个自然数"],"ans":3,"exp":"真分数<1,一个数乘以小于1的数,结果比原数小。"},
|
||||
{"id":"m203","src":"真题","sub":"math","ch":"第一赛段","topic":"质数与因数","type":"fill","stem":"“孪生质数”是指一对质数,它们之间相差2。100以内的“孪生质数”有( )对。","opts":null,"ans":"8","exp":"(3,5)(5,7)(11,13)(17,19)(29,31)(41,43)(59,61)(71,73),共8对。"},
|
||||
{"id":"m204","src":"真题","sub":"math","ch":"热身圈","topic":"分数化小数","type":"choice","stem":"下列分数中不能化成有限小数的是( )。","opts":["A. 1/4","B. 1/5","C. 1/3","D. 1/2"],"ans":2,"exp":"分母只含质因数2和5的分数能化成有限小数。1/3分母含3,不能化成有限小数。"},
|
||||
{"id":"m205","src":"真题","sub":"math","ch":"第二赛段","topic":"比与比例","type":"choice","stem":"甲数比乙数多2倍,乙数比丙数多它的1/2,则甲:乙:丙=( )。","opts":["A. 3:1:2","B. 2:1:3","C. 3:1:6","D. 9:3:2"],"ans":3,"exp":"设丙=2,乙=2+1=3,甲=3+6=9。甲:乙:丙=9:3:2。"},
|
||||
{"id":"m206","src":"真题","sub":"math","ch":"第二赛段","topic":"比例尺","type":"choice","stem":"比例尺一定,图上距离与实际距离( )。","opts":["B. 成反比例","A. 成正比例","C. 不成比例","D. 无法确定"],"ans":1,"exp":"比例尺固定,图上距离越大实际距离越大,比值一定,成正比例。"},
|
||||
{"id":"m207","src":"真题","sub":"math","ch":"第二赛段","topic":"比例尺","type":"fill","stem":"一幅地图,图上15厘米表示实际距离60千米。这幅地图的比例尺是( )。","opts":null,"ans":"1:400000","exp":"60km=6000000cm,15:6000000=1:400000。"},
|
||||
{"id":"m208","src":"真题","sub":"math","ch":"第二赛段","topic":"按比例分配","type":"choice","stem":"两堆棋子,甲堆白子与黑子的比为3:7,乙堆白子与黑子的比为2:5。从乙堆中拿出21枚棋子放入甲堆,使甲堆白子与黑子的比变为8:19,乙堆白子与黑子的比不变。甲堆原有( )枚棋子。","opts":["A. 50","B. 60","C. 70","D. 80"],"ans":0,"exp":"设甲堆白3k黑7k共10k,乙堆白2m黑5m共7m。从乙拿21枚后,乙堆比不变,则21枚中白:黑=2:5,白6黑15。甲新白3k+6,新黑7k+15,比(3k+6):(7k+15)=8:19,解得k=5。甲原有10x5=50枚。"},
|
||||
{"id":"m209","src":"真题","sub":"math","ch":"第三赛段","topic":"行程问题","type":"fill","stem":"一艘轮船顺流航行120千米、逆流航行80千米共用16时;顺流航行60千米、逆流航行120千米也用16时。求水流的速度(千米/时)。","opts":null,"ans":"2.5","exp":"设船速v水速u。120/(v+u)+80/(v-u)=16,60/(v+u)+120/(v-u)=16。两式相减得60/(v+u)=40/(v-u),3(v-u)=2(v+u),v=5u。代入得120/6u+80/4u=20/u+20/u=40/u=16,u=2.5。"},
|
||||
{"id":"m210","src":"真题","sub":"math","ch":"第三赛段","topic":"行程问题","type":"fill","stem":"某人驾车以每小时20千米的速度行驶了90千米,返回时每小时30千米,全程的平均速度是多少千米/时?","opts":null,"ans":"24","exp":"去程90/20=4.5时,返程90/30=3时。总路程180km,总时间7.5时,平均速度180/7.5=24km/h。"},
|
||||
{"id":"m211","src":"真题","sub":"math","ch":"第三赛段","topic":"工程问题","type":"fill","stem":"一件工作甲单独做10小时完成,乙单独做12小时完成,丙单独做15小时完成。三人合作几小时可以完成工作的一半?","opts":null,"ans":"2","exp":"甲效率1/10,乙1/12,丙1/15。和=1/10+1/12+1/15=6/60+5/60+4/60=15/60=1/4。一半需(1/2)/(1/4)=2小时。"},
|
||||
{"id":"m212","src":"真题","sub":"math","ch":"第三赛段","topic":"浓度问题","type":"fill","stem":"六年级同学采了10千克蘑菇,含水量为99%,晾晒后含水量下降到98%,晾晒后的蘑菇重( )千克。","opts":null,"ans":"5","exp":"干物质不变。原干物质=10x1%=0.1千克。晾晒后含水量98%,干物质占2%。总质量=0.1/2%=5千克。"},
|
||||
{"id":"m213","src":"真题","sub":"math","ch":"第三赛段","topic":"浓度问题","type":"choice","stem":"甲乙两瓶盐水,甲瓶盐水的浓度是乙瓶的3倍。将100克甲瓶与300克乙瓶混合后得15%的新盐水,甲瓶盐水的浓度是( )。","opts":["A. 20%","B. 25%","C. 30%","D. 35%"],"ans":2,"exp":"设乙浓度x%,甲3x%。(100x3x%+300xx%)/400=15%,(3x+3x)/4=15,6x=60,x=10。甲浓度=30%。"},
|
||||
{"id":"m214","src":"真题","sub":"math","ch":"第三赛段","topic":"利润与折扣","type":"choice","stem":"一种电视机提价10%后,又降价10%,原价与现价相比( )。","opts":["A. 降价了","B. 提高了","C. 没有变","D. 不确定"],"ans":0,"exp":"设原价100,提价10%后110,再降10%后99。比原价降了1%。"},
|
||||
{"id":"m215","src":"真题","sub":"math","ch":"第三赛段","topic":"利润与折扣","type":"choice","stem":"商店购进一批钢笔,每支9.5元出售。第一周卖60%还差84元收回成本。全部售出后共获利润372元。每支钢笔进价多少元?","opts":["A. 6.4","B. 6.5","C. 6.6","D. 7.0"],"ans":0,"exp":"设共x支,进价y元。0.6x*9.5=xy-84,x*9.5=xy+372。相减得0.4x*9.5=456,x=120。代入1140=120y+372,120y=768,y=6.4。"},
|
||||
{"id":"m216","src":"真题","sub":"math","ch":"第三赛段","topic":"年龄问题","type":"fill","stem":"今年儿子年龄是父亲的1/6,15年后儿子年龄是父亲的1/3。父亲今年多少岁?","opts":null,"ans":"42","exp":"设父亲x岁,儿子x/6。15年后x/6+15=(x+15)/3,乘6:x+90=2x+30,x=42。"},
|
||||
{"id":"m217","src":"真题","sub":"math","ch":"第三赛段","topic":"列方程","type":"fill","stem":"2009年北京生产运营和居民家庭用水总和5.8亿立方米,居民用水比生产运营的3倍多0.6亿立方米。生产运营用水多少亿立方米?","opts":null,"ans":"1.3","exp":"设生产用水x亿,居民(3x+0.6)亿。x+3x+0.6=5.8,4x=5.2,x=1.3。"},
|
||||
{"id":"m218","src":"真题","sub":"math","ch":"第三赛段","topic":"列方程","type":"fill","stem":"甲、乙、丙三数之和是211,甲比乙的3倍多5,乙比丙的2倍少4。甲数是( )。","opts":null,"ans":"131","exp":"设丙x,乙=2x-4,甲=3(2x-4)+5=6x-7。x+2x-4+6x-7=211,9x=222,x=24.67。甲=6x24.67-7=148-7=141?x=222/9=24.67,甲=6x24.67-7=148-7=141。验证和=24.67+45.33+141=211,正确。"},
|
||||
{"id":"m219","src":"真题","sub":"math","ch":"第三赛段","topic":"列方程","type":"fill","stem":"已知两个数的商是7,这两个数的差是114,那么较小的数是( )。","opts":null,"ans":"19","exp":"设小数x,大数7x。7x-x=114,6x=114,x=19。"},
|
||||
{"id":"m220","src":"真题","sub":"math","ch":"最终圈","topic":"逻辑推理","type":"choice","stem":"甲、乙、丙三人中只有一人会开车。甲说:“我会开。”乙说:“我不会开。”丙说:“甲不会开。”只有一人说真话。会开车的是谁?","opts":["A. 甲","B. 乙","C. 丙","D. 无法确定"],"ans":1,"exp":"假设甲真→甲会而乙假说乙会开(矛盾)。假设乙真→乙不会→甲假→甲不会→丙假→甲会开(矛盾)。假设丙真→甲不会→甲假→甲不会→乙假→乙会开。乙会开。"},
|
||||
{"id":"m221","src":"真题","sub":"math","ch":"第二赛段","topic":"立体图形","type":"choice","stem":"棱长为6cm的正方体削成尽可能大的圆锥,被削掉的部分最少是( )立方厘米(保留π)。","opts":["A. 216-18π","B. 216-12π","C. 216-9π","D. 216-6π"],"ans":0,"exp":"圆锥底面直径6cm(半径3cm),高6cm。体积=1/3xπx3²x6=18π。正方体体积=216。削掉=216-18π。"},
|
||||
{"id":"m222","src":"真题","sub":"math","ch":"第二赛段","topic":"立体图形","type":"fill","stem":"长方形长5cm宽3cm,以长为轴旋转得圆柱A,以宽为轴旋转得圆柱B。A与B的体积比是( )。","opts":null,"ans":"3:5","exp":"A:半径3高5,体积=πx9x5=45π。B:半径5高3,体积=πx25x3=75π。A:B=45:75=3:5。"},
|
||||
{"id":"m223","src":"真题","sub":"math","ch":"第二赛段","topic":"角度计算","type":"fill","stem":"三角形三内角度数比是1/2:1/3:1/6,最小角是( )度。","opts":null,"ans":"30","exp":"化简比=3:2:1。总和6份,每份180/6=30。最小角=30度。"},
|
||||
{"id":"m224","src":"真题","sub":"math","ch":"最终圈","topic":"找规律","type":"fill","stem":"按规律排列:x, 3x², 7x³, 15x⁴, 31x⁵, ...,第101个式子是( )。","opts":null,"ans":"(2¹⁰¹-1)x¹⁰¹","exp":"系数规律:1,3,7,15,31即2¹-1,2²-1,2³-1,...第n个系数=2ⁿ-1。x指数=n。第101个=(2¹⁰¹-1)x¹⁰¹。"},
|
||||
{"id":"m225","src":"真题","sub":"math","ch":"最终圈","topic":"找规律","type":"fill","stem":"观察数列2,6,12,20,30,...的规律,第6个数是( ),第n个数是( )。","opts":null,"ans":"42,n(n+1)","exp":"2=1x2,6=2x3,12=3x4,20=4x5,30=5x6。第n个=n(n+1),第6个=6x7=42。"},
|
||||
{"id":"c201","src":"真题","sub":"chinese","ch":"热身圈","topic":"看拼音写汉字","type":"fill","stem":"看拼音写词语:\npái huái( ) chōu tì( ) cuǐ càn( )\n衣衫lán lǚ( ) kūn péng( )展翅","opts":null,"ans":"徘徊,抽屉,璀璨,衣衫褴褛,鲲鹏","exp":"徘徊(犹豫不决)、抽屉(家具)、璀璨(光彩夺目)、衣衫褴褛(衣服破烂)、鲲鹏(古代大鸟)。"},
|
||||
{"id":"c202","src":"真题","sub":"chinese","ch":"热身圈","topic":"字音辨析","type":"fill","stem":"给下列加点字注音:\n档( )次 给( )予 模( )样 惩( )罚 潜( )能\n歼( )灭 造诣( ) 膝( )盖 尽( )管 拖累( )","opts":null,"ans":"dang,ji,mu,cheng,qian,jian,yi,xi,jin,lei","exp":"档次dàng、给予jǐ、模样mú、惩罚chéng、潜能qián、歼灭jiān、造诣yì、膝盖xī、尽管jǐn、拖累lěi。注意都是易错读音。"},
|
||||
{"id":"c203","src":"真题","sub":"chinese","ch":"热身圈","topic":"字音辨析","type":"choice","stem":"下列加点字注音完全正确的一项是( )。","opts":["A. 粗糙(cāo) 应和(hè) 酝酿(niàng) 锲而不舍(qiè)","B. 炫目(xuàn) 称职(chèng) 倔强(juè) 白驹过隙(xī)","C. 翘楚(qiáo) 汲取(jí) 和煦(xù) 茅塞顿开(sè)","D. 干涸(hé) 灼热(zhuó) 挣脱(zhēng) 潜移默化(qiǎn)"],"ans":0,"exp":"A全对。B称chèng应为chèn,倔juè应为jué。C翘qiáo应为qiào。D潜qiǎn应为qián。"},
|
||||
{"id":"c204","src":"真题","sub":"chinese","ch":"热身圈","topic":"错别字","type":"choice","stem":"下列词语中错别字最多的一项是( )。","opts":["A. 优久 迎和 安详 滥芋充数","B. 干躁 荒费 秘决 不谋而合","C. 气慨 元霄 闲瑕 搬弄事非","D. 篷勃 泻气 悬涯 变本加厉"],"ans":2,"exp":"A悠(优→悠)、合(和→合)、竽(芋→竽),3个。B躁(燥→躁)、费(废→费)、诀(决→诀),3个。C慨(慨→概)、霄(霄→宵)、瑕(瑕→暇)、事(事→是),4个。D篷(蓬→篷)、泻(泄→泻)、涯(涯→崖),3个。C最多。"},
|
||||
{"id":"c205","src":"真题","sub":"chinese","ch":"第一赛段","topic":"成语运用","type":"choice","stem":"下列加点成语运用错误的一项是( )。","opts":["A. 距离中考越来越近了,剩下的复习时间指日可待。","B. 许多腐败分子在落入法网后才痛心疾首。","C. 春晚出现不少新面孔,给人耳目一新的感觉。","D. 这篇文章观点新颖,见解深刻,的确不同凡响。"],"ans":0,"exp":"指日可待指好事不久实现,用在复习时间上不恰当。应用屈指可数。"},
|
||||
{"id":"c206","src":"真题","sub":"chinese","ch":"第一赛段","topic":"近义词反义词","type":"fill","stem":"写出词语的反义词和近义词:\n杂乱无章--近义( )反义( )\n华而不实--近义( )反义( )\n尴尬--近义( )反义( )","opts":null,"ans":"乱七八糟/井井有条,浮夸/朴实无华,难堪/自然","exp":"杂乱无章近义乱七八糟反义井井有条;华而不实近义浮夸反义朴实无华;尴尬近义难堪反义自然。"},
|
||||
{"id":"c207","src":"真题","sub":"chinese","ch":"第一赛段","topic":"成语故事人物","type":"fill","stem":"写出下列成语中的历史人物:\n闻鸡起舞( ) 卧薪尝胆( ) 破釜沉舟( )\n完璧归赵( ) 负荆请罪( ) 鞠躬尽瘁( )","opts":null,"ans":"祖逖,勾践,项羽,蔺相如,廉颇,诸葛亮","exp":"闻鸡起舞-祖逖,卧薪尝胆-勾践,破釜沉舟-项羽,完璧归赵-蔺相如,负荆请罪-廉颇,鞠躬尽瘁-诸葛亮。"},
|
||||
{"id":"c208","src":"真题","sub":"chinese","ch":"第一赛段","topic":"修改病句","type":"choice","stem":"下列句子中没有病句的一项是( )。","opts":["A. 随着京剧活动引入课堂,让更多学生受到了熏陶。","D. 节目受到喜爱,是因为其形式新颖,有文化内涵的原因。","C. 读者深受喜爱的杨绛先生,不凡的一生中留下了大量作品。","B. 中国体育健儿正在积极备战2020年奥运会。"],"ans":3,"exp":"A缺主语(删“让”)。C“读者深受喜爱”应为“深受读者喜爱”。D“是因为…的原因”重复。"},
|
||||
{"id":"c209","src":"真题","sub":"chinese","ch":"第一赛段","topic":"修改病句","type":"fill","stem":"修改病句:\n从化的天气是一个疗养、游玩的好地方。\n( )","opts":null,"ans":"从化是一个疗养游玩的好地方","exp":"搭配不当:天气不是好地方,应把“的天气”删去,改为“从化是一个疗养游玩的好地方”。"},
|
||||
{"id":"c210","src":"真题","sub":"chinese","ch":"第一赛段","topic":"修辞手法","type":"choice","stem":"选出下列各句中运用修辞方法不同的一句( )。","opts":["A. 柳枝染上了嫩绿,在春风里尽情飘摆。","B. 一架架风筝在同白云戏耍。","C. 燕子有一个剪刀似的尾巴。","D. 连翘花举起金黄色的小喇叭,向着春天吹奏。"],"ans":2,"exp":"ABD为拟人(赋予人的动作),C为比喻(把尾巴比作剪刀)。"},
|
||||
{"id":"c211","src":"真题","sub":"chinese","ch":"第一赛段","topic":"句子排序","type":"choice","stem":"将下列句子组成一段连贯的话,最恰当的顺序是( )。\n①人格是什么?\n②只有恪守纯洁、崇高的人格。\n③一个人格猥琐、低劣,其一生必将渺小、肮脏。\n④才能造就亮丽、伟岸的人生。\n⑤人格是心灵的护佑、人生的座基。","opts":["A. ①⑤③②④","B. ①③⑤②④","C. ⑤①③②④","D. ③①⑤②④"],"ans":0,"exp":"①问→⑤答→③反面→②条件→④结果。正确顺序①⑤③②④。"},
|
||||
{"id":"c212","src":"真题","sub":"chinese","ch":"第一赛段","topic":"句子排序","type":"choice","stem":"填入横线处最恰当的句子是:\n回首昨天,应该是( )的;面对今天,应该是( )的;展望明天,应该是( )的。","opts":["A. 问心无愧 倍加珍惜 信心百倍","B. 信心百倍 问心无愧 倍加珍惜","C. 问心无愧 信心百倍 倍加珍惜","D. 倍加珍惜 问心无愧 信心百倍"],"ans":0,"exp":"回首昨天→问心无愧,面对今天→倍加珍惜,展望明天→信心百倍。"},
|
||||
{"id":"c213","src":"真题","sub":"chinese","ch":"第三赛段","topic":"古诗文默写","type":"fill","stem":"补写出下列名句的空缺部分:\n(1)小荷才露尖尖角,( )。\n(2)( ),悠然见南山。\n(3)接天莲叶无穷碧,( )。\n(4)谁言寸草心,( )。\n(5)( ),留取丹心照汗青。","opts":null,"ans":"早有蜻蜓立上头,采菊东篱下,映日荷花别样红,报得三春晖,人生自古谁无死","exp":"(1)杨万里《小池》(2)陶渊明《饮酒》(3)杨万里《晓出净慈寺》(4)孟郊《游子吟》(5)文天祥《过零丁洋》。"},
|
||||
{"id":"c214","src":"真题","sub":"chinese","ch":"第三赛段","topic":"古诗文默写","type":"fill","stem":"补写诗句:\n(1)我寄愁心与明月,( )。\n(2)横眉冷对千夫指,( )。\n(3)忽如一夜春风来,( )。\n(4)会当凌绝顶,( )。\n(5)随风潜入夜,( )。","opts":null,"ans":"随君直到夜郎西,俯首甘为孺子牛,千树万树梨花开,一览众山小,润物细无声","exp":"(1)李白《闻王昌龄左迁》(2)鲁迅《自嘲》(3)岑参《白雪歌》(4)杜甫《望岳》(5)杜甫《春夜喜雨》。"},
|
||||
{"id":"c215","src":"真题","sub":"chinese","ch":"第三赛段","topic":"古诗文默写","type":"fill","stem":"古典诗词中意境纷繁。请默写出古诗词中含有“雨”字的两个连贯的句子:\n( ),( )。","opts":null,"ans":"好雨知时节,当春乃发生","exp":"含雨的诗句:好雨知时节当春乃发生、清明时节雨纷纷、渭城朝雨浥轻尘、天街小雨润如酥等。"},
|
||||
{"id":"c216","src":"真题","sub":"chinese","ch":"第三赛段","topic":"文学常识","type":"fill","stem":"“一门父子三词客,千古文章八大家”。八大家是唐宋散文家:唐( )、( );宋( )、( )、( )、( )、( )、( )。","opts":null,"ans":"韩愈,柳宗元,欧阳修,苏洵,苏轼,苏辙,王安石,曾巩","exp":"口诀:韩柳欧王曾三苏(韩愈、柳宗元、欧阳修、王安石、曾巩、苏洵、苏轼、苏辙)。"},
|
||||
{"id":"c217","src":"真题","sub":"chinese","ch":"第三赛段","topic":"文学常识","type":"fill","stem":"下列对联写的是谁?\n(1)痛饮读离骚,放开古今才子胆;狂歌吊湘水,照见江潭渔父心。( )\n(2)草堂留后世,诗圣著千秋。( )\n(3)大河百代,群芳竞秀,盛开一枝女儿花。( )","opts":null,"ans":"屈原,杜甫,李清照","exp":"(1)《离骚》+湘水→屈原;(2)诗圣→杜甫;(3)词苑+女儿花→李清照。"},
|
||||
{"id":"c218","src":"真题","sub":"chinese","ch":"第三赛段","topic":"文学常识","type":"fill","stem":"“可叹停机德,堪怜咏絮才”依次指《红楼梦》中的( )和( )。","opts":null,"ans":"薛宝钗,林黛玉","exp":"停机德指薛宝钗(劝夫求功名),咏絮才指林黛玉(才思敏捷)。"},
|
||||
{"id":"c219","src":"真题","sub":"chinese","ch":"第三赛段","topic":"文言文阅读","type":"choice","stem":"阅读《师旷论学》:\n晋平公问于师旷曰:“吾年七十,欲学,恐已暮矣!”\n师旷曰:“何不炳烛乎?”\n平公曰:“安有为人臣而戏其君乎?”\n师旷曰:“盲臣安敢戏其君乎?臣闻之:少而好学,如日出之阳;壮而好学,如日中之光;老而好学,如炳烛之明。炳烛之明,孰与昧行乎?”\n平公曰:“善哉!”\n\n“恐已暮矣”中“暮”的意思是( )。","opts":["A. 傍晚","B. 年老","C. 昏暗","D. 迟、晚"],"ans":3,"exp":"暮本义傍晚,此处引申为晚了、迟了。"},
|
||||
{"id":"c220","src":"真题","sub":"chinese","ch":"第三赛段","topic":"文言文阅读","type":"choice","stem":"(接上题)“何不炳烛乎”中“炳”的意思是( )。","opts":["A. 明亮","D. 照耀","C. 火炬","B. 点燃"],"ans":3,"exp":"炳在此作动词,点燃。炳烛=点燃蜡烛。"},
|
||||
{"id":"c221","src":"真题","sub":"chinese","ch":"第三赛段","topic":"文言文阅读","type":"choice","stem":"(接上题)师旷用“日出之阳”“日中之光”“炳烛之明”说明的道理是( )。","opts":["A. 人老了不用学习","B. 学习要趁年轻","C. 任何时候学习都不晚","D. 老年人学习不如年轻人"],"ans":2,"exp":"师旷用三个比喻说明任何时候学习都不晚。晚年学习虽晚仍胜过不学。"},
|
||||
{"id":"c222","src":"真题","sub":"chinese","ch":"第一赛段","topic":"错别字","type":"fill","stem":"改正下列词语中的错别字:\n前扑后继( ) 拾金不味( ) 愤不顾身( )\n无可耐何( ) 文丝不动( ) 迫不急待( )","opts":null,"ans":"扑→仆,味→昧,愤→奋,耐→奈,文→纹,急→及","exp":"前仆后继、拾金不昧、奋不顾身、无可奈何、纹丝不动、迫不及待。"},
|
||||
{"id":"e201","src":"真题","sub":"english","ch":"热身圈","topic":"be动词","type":"fill","stem":"用am/is/are填空:\n(1) Excuse me. What ___ this in English?\n(2) ___ this your coat? No, it ___ not.\n(3) What ___ these? ___ they maps?\n(4) I ___ in Class Eleven. What class ___ you in?","opts":null,"ans":"is,Is,is,are,Are,am,are","exp":"(1)this单数用is(2)疑问句Is提前,答句is(3)these复数用are(4)I用am,you用are。"},
|
||||
{"id":"e202","src":"真题","sub":"english","ch":"热身圈","topic":"冠词","type":"choice","stem":"What's in your bag? -- There's ___ interesting book about animals.","opts":["A. a","B. an","C. the","D. /"],"ans":1,"exp":"interesting以元音音素开头,用an。"},
|
||||
{"id":"e203","src":"真题","sub":"english","ch":"第一赛段","topic":"代词","type":"choice","stem":"The coat on the wall isn't Kate's. It's ___.","opts":["A. I","B. mine","C. me","D. my"],"ans":1,"exp":"空后无名词,用名词性物主代词mine。"},
|
||||
{"id":"e204","src":"真题","sub":"english","ch":"第一赛段","topic":"代词","type":"choice","stem":"--I didn't go to the Disneyland last year. --Me, ___.","opts":["A. neither","B. either","C. also","D. too"],"ans":1,"exp":"否定句中“也”用either。Me either=我也不。"},
|
||||
{"id":"e205","src":"真题","sub":"english","ch":"热身圈","topic":"介词","type":"choice","stem":"I live at school. So I often go home ___ Friday afternoon.","opts":["A. in","B. at","C. on","D. /"],"ans":2,"exp":"具体某一天的上下午用on。on Friday afternoon=在周五下午。"},
|
||||
{"id":"e206","src":"真题","sub":"english","ch":"热身圈","topic":"介词","type":"choice","stem":"--How long have you been skating? --I have been skating ___ nine o'clock.","opts":["A. for","B. at","C. since","D. from"],"ans":2,"exp":"since+时间点(从九点开始),for+时间段。since nine o'clock=自从九点。"},
|
||||
{"id":"e207","src":"真题","sub":"english","ch":"热身圈","topic":"一般现在时","type":"choice","stem":"--How often does Tom play football? --___ He doesn't like football.","opts":["A. Often","B. Always","C. Hardly ever","D. Every day"],"ans":2,"exp":"He doesn't like football说明几乎不踢,选Hardly ever(几乎从不)。"},
|
||||
{"id":"e208","src":"真题","sub":"english","ch":"第一赛段","topic":"现在进行时","type":"choice","stem":"Are you thinking about ___ a long vacation?","opts":["A. take","B. to take","C. taking","D. took"],"ans":2,"exp":"about是介词,后接动名词。think about doing sth考虑做某事。"},
|
||||
{"id":"e209","src":"真题","sub":"english","ch":"第二赛段","topic":"一般过去时","type":"choice","stem":"Mike went boating with his friends last weekend. They ___ a good time.","opts":["A. have","B. had","C. will have","D. are having"],"ans":1,"exp":"last weekend过去时,had a good time玩得开心。"},
|
||||
{"id":"e210","src":"真题","sub":"english","ch":"第二赛段","topic":"一般过去时","type":"fill","stem":"He was ill yesterday so he didn't go to school.(对划线部分提问,划线部分为because he was ill)\n___ ___ he go to school?","opts":null,"ans":"Why didnt","exp":"对原因提问用Why。过去时否定用didn't。"},
|
||||
{"id":"e211","src":"真题","sub":"english","ch":"第二赛段","topic":"一般过去时","type":"fill","stem":"He finished his homework yesterday afternoon.(改为否定句)\nHe ___ ___ his homework yesterday afternoon.","opts":null,"ans":"didnt finish","exp":"一般过去时否定:didn't+动词原形。"},
|
||||
{"id":"e212","src":"真题","sub":"english","ch":"第二赛段","topic":"一般将来时","type":"choice","stem":"--National Day is coming. Do you have any plans? --Yes, I ___ a second language.","opts":["A. am going to learn","B. was learning","C. learnt","D. am learnt"],"ans":0,"exp":"计划做某事用be going to,选am going to learn。"},
|
||||
{"id":"e213","src":"真题","sub":"english","ch":"第二赛段","topic":"一般将来时","type":"choice","stem":"There ___ a sports meeting after National Day.","opts":["A. are going to be","B. is having","C. is going to have","D. is going to be"],"ans":3,"exp":"there be的将来时:There is going to be(be动词不能与have连用)。"},
|
||||
{"id":"e214","src":"真题","sub":"english","ch":"第二赛段","topic":"比较级","type":"choice","stem":"This sweater is too expensive. I can't afford it. -- How about this one? It's much ___.","opts":["A. cheap","B. cheapest","C. cheaper","D. the cheapest"],"ans":2,"exp":"两者比较用比较级,much修饰比较级表程度。much cheaper=便宜得多。"},
|
||||
{"id":"e215","src":"真题","sub":"english","ch":"热身圈","topic":"情态动词","type":"choice","stem":"Linda is my good friend. She can ___ very well.","opts":["A. dances","B. dance","C. dancing","D. danced"],"ans":1,"exp":"can后接动词原形,选dance。"},
|
||||
{"id":"e216","src":"真题","sub":"english","ch":"热身圈","topic":"疑问词","type":"choice","stem":"--___ should I get my mom for Mother's Day? --Why don't you get her a scarf?","opts":["A. Who","B. What","C. When","D. How"],"ans":1,"exp":"问送什么东西,用What。"},
|
||||
{"id":"e217","src":"真题","sub":"english","ch":"第一赛段","topic":"句型转换","type":"fill","stem":"I'd like a cup of tea.(变为一般疑问句)\n___ you ___ a cup of tea?","opts":null,"ans":"Would,like","exp":"I'd like = I would like,变疑问将Would提前。"},
|
||||
{"id":"e218","src":"真题","sub":"english","ch":"第二赛段","topic":"句型转换","type":"fill","stem":"She is good at speaking English.(改为同义句)\nShe ___ ___ speaking English.","opts":null,"ans":"does well in","exp":"be good at = do well in。主语三单She,用does。"},
|
||||
{"id":"e219","src":"真题","sub":"english","ch":"第三赛段","topic":"完形填空","type":"choice","stem":"Mrs. Jack was always ___ lots of time and money in doing the shopping.","opts":["A. spent","B. spending","C. spend","D. to spend"],"ans":1,"exp":"be always doing sth总是做某事,且spend time (in) doing是固定搭配。"},
|
||||
{"id":"e220","src":"真题","sub":"english","ch":"第三赛段","topic":"完形填空","type":"choice","stem":"She waited ___ it was Saturday when her husband was free.","opts":["A. for","B. when","C. until","D. because"],"ans":2,"exp":"wait until等到。等到星期六才有空去购物。"},
|
||||
{"id":"e221","src":"真题","sub":"english","ch":"第三赛段","topic":"语音","type":"choice","stem":"找出划线部分读音不同的选项:\ncity finish physical science","opts":["A. city","B. finish","C. physical","D. science"],"ans":3,"exp":"city/finish/physical的i发/I/,science的ie发/aI/。选D。"},
|
||||
{"id":"e222","src":"真题","sub":"english","ch":"第三赛段","topic":"语音","type":"choice","stem":"找出划线部分读音不同的选项:\nsubject duty cute Tuesday","opts":["A. subject","B. duty","C. cute","D. Tuesday"],"ans":0,"exp":"subject的u发/ʌ/,duty/cute/Tuesday的u发/ju:/。选A。"},
|
||||
{"id":"e223","src":"真题","sub":"english","ch":"第三赛段","topic":"语音","type":"choice","stem":"找出划线部分读音不同的选项:\nchat glad have grape","opts":["A. chat","B. glad","C. have","D. grape"],"ans":3,"exp":"chat/glad/have的a发/æ/,grape的a发/eI/。选D。"},
|
||||
{"id":"e224","src":"真题","sub":"english","ch":"第三赛段","topic":"语音","type":"choice","stem":"找出划线部分读音不同的选项:\nseat read sweater bean","opts":["A. seat","B. read","C. sweater","D. bean"],"ans":2,"exp":"seat/read/bean的ea发/i:/,sweater的ea发/e/。选C。"},
|
||||
{"id":"e225","src":"真题","sub":"english","ch":"第三赛段","topic":"语音","type":"choice","stem":"找出划线部分读音不同的选项:\ngive like bike Mike","opts":["A. give","B. like","C. bike","D. Mike"],"ans":0,"exp":"give的i发/I/,like/bike/Mike的i发/aI/。选A。"},
|
||||
{"id":"e226","src":"真题","sub":"english","ch":"第三赛段","topic":"语音","type":"choice","stem":"找出划线部分读音不同的选项:\nwith thank think month","opts":["A. with","B. thank","C. think","D. month"],"ans":0,"exp":"with的th发/ð/,thank/think/month的th发/θ/。选A。"},
|
||||
{"id":"e227","src":"真题","sub":"english","ch":"第三赛段","topic":"语音","type":"choice","stem":"找出划线部分读音不同的选项:\near bear there pear","opts":["A. ear","B. bear","C. there","D. pear"],"ans":0,"exp":"ear的ear发/Iə/,bear/there/pear的ear发/eə/。选A。"},
|
||||
{"id":"c301","src":"真题","sub":"chinese","ch":"第三赛段","topic":"文言文阅读","type":"choice","stem":"阅读《论语》选段:\n\n子曰:\"学而时习之,不亦说乎?有朋自远方来,不亦乐乎?人不知而不愠,不亦君子乎?\"\n\n\"学而时习之\"中\"时\"的意思是( )。","opts":["B. 按时","A. 时间","C. 时常","D. 时时"],"ans":0,"exp":"\"时\"在此为名词作状语,意为\"按一定时间\"(即按时)。\"学而时习之\"=学习后按时温习。"},
|
||||
{"id":"c302","src":"真题","sub":"chinese","ch":"第三赛段","topic":"文言文阅读","type":"choice","stem":"(接上题)\"不亦说乎\"中\"说\"的意思是( )。","opts":["B. 喜悦","A. 说话","C. 说明","D. 学说"],"ans":0,"exp":"\"说\"通\"悦\",愉快、高兴的意思。不亦说乎=不也是很高兴的事吗?"},
|
||||
{"id":"c303","src":"真题","sub":"chinese","ch":"第三赛段","topic":"文言文阅读","type":"choice","stem":"(接上题)\"人不知而不愠\"中\"愠\"的意思是( )。","opts":["A. 温暖","B. 生气","C. 担心","D. 烦躁"],"ans":1,"exp":"\"愠\"意为恼怒、怨恨。人不知而不愠=别人不了解自己也不生气。"},
|
||||
{"id":"c304","src":"真题","sub":"chinese","ch":"第三赛段","topic":"文言文阅读","type":"choice","stem":"阅读《论语》选段:\n\n子曰:\"温故而知新,可以为师矣。\"\n\n\"温故而知新\"告诉我们什么道理?","opts":["A. 要复习才能记住","B. 温习旧知识能有新发现","C. 老师要教新东西","D. 过去的要忘记"],"ans":1,"exp":"\"温故而知新\"意为温习旧知识从而获得新理解。强调复习旧知与探索新知的结合。"},
|
||||
{"id":"c305","src":"真题","sub":"chinese","ch":"第三赛段","topic":"文言文阅读","type":"choice","stem":"阅读《论语》选段:\n\n子曰:\"学而不思则罔,思而不学则殆。\"\n\n这句话强调的是( )。","opts":["A. 学习比思考重要","B. 思考比学习重要","C. 学习与思考要结合","D. 学和思都不重要"],"ans":2,"exp":"\"罔\"=迷惑,\"殆\"=疑惑/疲惫。只学不思则迷惑,只思不学则危险。强调学思结合。"},
|
||||
{"id":"c306","src":"真题","sub":"chinese","ch":"第三赛段","topic":"文言文阅读","type":"choice","stem":"阅读《世说新语·咏雪》:\n\n谢太傅寒雪日内集,与儿女讲论文义。俄而雪骤,公欣然曰:\"白雪纷纷何所似?\"兄子胡儿曰:\"撒盐空中差可拟。\"兄女曰:\"未若柳絮因风起。\"\n\n对\"撒盐空中\"和\"柳絮因风起\"两个比喻,较好的一个是( ),理由是( )。","opts":["A. 撒盐空中,因为盐和雪颜色相同","B. 柳絮因风起,因为柳絮轻盈飘飞更似雪花","C. 撒盐空中,因为雪下得很大","D. 两个都不好"],"ans":1,"exp":"柳絮因风起更好:柳絮轻盈、随风飘舞,更能表现雪花纷飞的美感和动态。\"撒盐空中\"虽形似但缺乏诗意。"},
|
||||
{"id":"c307","src":"真题","sub":"chinese","ch":"第三赛段","topic":"文言文阅读","type":"choice","stem":"(接上题)\"俄而雪骤\"中\"俄而\"的意思是( )。","opts":["A. 突然","B. 过了一会儿","C. 很久","D. 马上"],"ans":1,"exp":"\"俄而\"表示时间短促,意为\"不久、一会儿\"。俄而雪骤=不一会儿雪下得急了。"},
|
||||
{"id":"c308","src":"真题","sub":"chinese","ch":"第三赛段","topic":"文言文阅读","type":"choice","stem":"阅读《世说新语·陈太丘与友期》:\n\n陈太丘与友期行,期日中。过中不至,太丘舍去,去后乃至。元方时年七岁,门外戏。客问元方:\"尊君在不?\"答曰:\"待君久不至,已去。\"友人便怒曰:\"非人哉!与人期行,相委而去。\"元方曰:\"君与家君期日中。日中不至,则是无信;对子骂父,则是无礼。\"\n\n\"期日中\"中\"期\"的意思是( )。","opts":["A. 日期","B. 期望","C. 约定","D. 期限"],"ans":2,"exp":"\"期\"在此为动词,约定。期日中=约定在正午时分。"},
|
||||
{"id":"c309","src":"真题","sub":"chinese","ch":"第三赛段","topic":"文言文阅读","type":"choice","stem":"(接上题)\"相委而去\"中\"委\"的意思是( )。","opts":["A. 委托","B. 委曲","C. 丢弃","D. 委员"],"ans":2,"exp":"\"委\"在此意为丢弃、抛弃。相委而去=丢下我走了。"},
|
||||
{"id":"c310","src":"真题","sub":"chinese","ch":"第三赛段","topic":"文言文阅读","type":"choice","stem":"(接上题)元方指出友人\"无信\"\"无礼\"的理由分别是( )。","opts":["A. 过中不至是无信,对子骂父是无礼","B. 与人约好是无信,不打招呼是无礼","C. 太丘先走是无信,元方反驳是无礼","D. 朋友迟到是无信,朋友生气是无礼"],"ans":0,"exp":"元方认为:约好正午却不到=无信;当着儿子骂父亲=无礼。七岁孩童辩驳有理有据。"},
|
||||
{"id":"c311","src":"真题","sub":"chinese","ch":"第三赛段","topic":"文言文阅读","type":"choice","stem":"阅读《诫子书》(诸葛亮):\n\n夫君子之行,静以修身,俭以养德。非淡泊无以明志,非宁静无以致远。\n\n\"静以修身\"中\"以\"的意思是( )。","opts":["A. 因为","B. 用来","C. 已经","D. 认为"],"ans":1,"exp":"\"以\"在此表目的,意为\"用来\"。静以修身=以宁静来提高自身修养。"},
|
||||
{"id":"c312","src":"真题","sub":"chinese","ch":"第三赛段","topic":"文言文阅读","type":"choice","stem":"(接上题)\"非淡泊无以明志\"的意思是( )。","opts":["A. 不清淡就不能吃饱","B. 不淡泊名利就无法明确志向","C. 不泊船就无法到岸","D. 不明白就无法立志"],"ans":1,"exp":"淡泊=恬淡不慕名利。不把名利看淡,就无法使志向明确坚定。"},
|
||||
{"id":"c313","src":"真题","sub":"chinese","ch":"第三赛段","topic":"文言文阅读","type":"choice","stem":"下列句子中\"之\"的用法与其他三项不同的是( )。","opts":["A. 学而时习之","B. 日月之行","C. 择其善者而从之","D. 默而识之"],"ans":1,"exp":"A/B/C/D中,A\"之\"代词(指知识),C\"之\"代词(指优点),D\"之\"代词(指所学)。B\"之\"助词\"的\"(日月之行=日月的运行)。B不同。"},
|
||||
{"id":"c314","src":"真题","sub":"chinese","ch":"第三赛段","topic":"文言文阅读","type":"choice","stem":"下列各句中\"而\"表示转折关系的是( )。","opts":["A. 学而时习之","B. 人不知而不愠","C. 温故而知新","D. 择其善者而从之"],"ans":1,"exp":"A\"而\"表承接(然后),B\"而\"表转折(却),C\"而\"表结果(从而),D\"而\"表承接(并且)。B为转折。"},
|
||||
{"id":"c321","src":"真题","sub":"chinese","ch":"第一赛段","topic":"成语运用","type":"choice","stem":"下列各句中加点成语使用恰当的一项是( )。","opts":["A. 桂林山水甲天下,景色美不胜收,令人流连忘返。","B. 他在赛场上相得益彰,发挥出了最高水平。","C. 春天的花园里,百花齐放,真是花团锦簇,天伦之乐。","D. 他平时成绩一般,这次居然考了第一,真是异曲同工。"],"ans":0,"exp":"A美不胜收=美好的东西太多看不过来,正确。B\"相得益彰\"指互相配合更显优点,不能单用。C\"天伦之乐\"指家人团聚的快乐,不能形容花园。D\"异曲同工\"喻不同方式达到同样效果,不合语境。"},
|
||||
{"id":"c322","src":"真题","sub":"chinese","ch":"第一赛段","topic":"成语运用","type":"choice","stem":"下面成语运用不当的是( )。","opts":["A. 钱学森为中国航天事业鞠躬尽瘁,死而后已。","B. 他慷慨激昂的演讲令人热血沸腾。","C. 他奋不顾身地跳进河里救起落水儿童。","D. 他在会议上夸夸其谈,引经据典,令人佩服。"],"ans":3,"exp":"\"夸夸其谈\"是贬义词,指说话浮夸不切实际,不能用于正面语境。应改为\"侃侃而谈\"。"},
|
||||
{"id":"c323","src":"真题","sub":"chinese","ch":"第一赛段","topic":"成语运用","type":"choice","stem":"下列成语使用正确的一项是( )。","opts":["A. 他微不足道地看了我一眼。","B. 老师语重心长地教导我们要好好学习。","C. 大街上车水马龙,川流不息,一片天伦之乐。","D. 他在这件事上首当其冲,第一个被表扬。"],"ans":1,"exp":"A\"微不足道\"指事情太小不值一提,不能修饰\"看\"。C\"天伦之乐\"只能用于家庭。D\"首当其冲\"指最先受到攻击或遭遇灾难,不是第一个被表扬。"},
|
||||
{"id":"c324","src":"真题","sub":"chinese","ch":"第一赛段","topic":"成语运用","type":"choice","stem":"填入横线处最恰当的成语是:\n\n面对敌军的围困,守城将士们( ),誓与城池共存亡。","opts":["A. 视死如归","B. 如履薄冰","C. 小心翼翼","D. 惊慌失措"],"ans":0,"exp":"\"视死如归\"把死看作像回家一样,形容不怕牺牲。符合将士誓死守城的语境。"},
|
||||
{"id":"c325","src":"真题","sub":"chinese","ch":"第一赛段","topic":"成语运用","type":"choice","stem":"下列成语使用不恰当的一项是( )。","opts":["A. 这篇小说情节跌宕起伏,引人入胜。","B. 他妙笔生花,写出的文章生动感人。","C. 大自然的鬼斧神工令人叹为观止。","D. 他别具匠心地在考试中抄了同桌的答案。"],"ans":3,"exp":"\"别具匠心\"是褒义词,指独特的艺术构思。不能用于形容作弊。应用贬义词\"投机取巧\"。"},
|
||||
{"id":"c331","src":"真题","sub":"chinese","ch":"第三赛段","topic":"古诗鉴赏","type":"choice","stem":"\"举头望明月,低头思故乡\"中\"明月\"这个意象表达了诗人怎样的情感?","opts":["A. 对月亮的喜爱","B. 对家乡的思念","C. 对宇宙的感叹","D. 对人生的思考"],"ans":1,"exp":"在中国古典诗词中,\"明月\"是经典的思乡意象。诗人望月思归,借明月寄托对故乡和亲人的思念之情。"},
|
||||
{"id":"c332","src":"真题","sub":"chinese","ch":"第三赛段","topic":"古诗鉴赏","type":"choice","stem":"\"两岸猿声啼不住,轻舟已过万重山\"主要运用了什么手法?","opts":["A. 比喻","B. 对比","C. 衬托","D. 排比"],"ans":2,"exp":"以\"猿声啼不住\"衬托\"轻舟已过\"之快,用声音的持续反衬速度之迅疾,属于以声衬静、以动衬动。"},
|
||||
{"id":"c333","src":"真题","sub":"chinese","ch":"第三赛段","topic":"古诗鉴赏","type":"choice","stem":"\"大漠孤烟直,长河落日圆\"中\"直\"和\"圆\"二字的妙处在于( )。","opts":["A. \"直\"写烟的形态,\"圆\"写日的状态,展现了塞外苍茫壮阔的景象","B. \"直\"说明没有风,\"圆\"说明是满月,都是客观描写","C. \"直\"写烟的形状奇怪,\"圆\"写太阳太大","D. \"直\"和\"圆\"都是凑字数,没有特殊含义"],"ans":0,"exp":"\"直\"字写出烽烟在无风大漠中笔直升腾的形态;\"圆\"字写出落日在地平线上的浑圆感。二字以朴素的线条勾勒出塞外辽阔苍茫的意境。"},
|
||||
{"id":"c334","src":"真题","sub":"chinese","ch":"第三赛段","topic":"古诗鉴赏","type":"choice","stem":"下列诗句中借\"柳\"表达惜别之情的是( )。","opts":["A. 碧玉妆成一树高,万条垂下绿丝绦","B. 渭城朝雨浥轻尘,客舍青青柳色新","C. 两个黄鹂鸣翠柳,一行白鹭上青天","D. 不知细叶谁裁出,二月春风似剪刀"],"ans":1,"exp":"B出自王维《送元二使安西》,\"柳\"谐音\"留\",古人折柳送别表达挽留不舍。A/D咏柳写景,C写春景,均非送别。"},
|
||||
{"id":"c335","src":"真题","sub":"chinese","ch":"第三赛段","topic":"古诗鉴赏","type":"choice","stem":"\"长风破浪会有时,直挂云帆济沧海\"表达了诗人怎样的情感?","opts":["A. 悲观失望","B. 对航海的热爱","C. 乐观自信、积极进取","D. 对大海的恐惧"],"ans":2,"exp":"出自李白《行路难》。诗人虽遭挫折但坚信终有一天能乘风破浪、实现理想,表达乐观自信、昂扬向上的精神。"},
|
||||
{"id":"c336","src":"真题","sub":"chinese","ch":"第三赛段","topic":"古诗鉴赏","type":"choice","stem":"\"采菊东篱下,悠然见南山\"中\"见\"字改用\"望\"字好不好?为什么?","opts":["A. 好,\"望\"更正式","B. 好,\"望\"看得更远","C. 不好,\"见\"是无意中看到,更符合悠然自得的意境","D. 不好,\"见\"比\"望\"字少"],"ans":2,"exp":"\"见\"妙在无意之中、偶然看到,写出诗人采菊时不经意向远处一望的闲适自然。\"望\"则有意为之,破坏了悠然意境。这是\"无我之境\"的经典范例。"},
|
||||
{"id":"c341","src":"真题","sub":"chinese","ch":"第一赛段","topic":"近义词辨析","type":"fill","stem":"选择恰当的词语填入括号中:\n\n(精密 周密 严密)\n(1)经过( )的计算,卫星成功入轨。\n(2)这次活动的计划非常( ),没有疏漏。\n(3)敌人的( )防守被我军突破了。","opts":null,"ans":"精密,周密,严密","exp":"精密=精确细密(计算/仪器),周密=周到细致(计划/考虑),严密=没有缝隙(防守/逻辑)。"},
|
||||
{"id":"c342","src":"真题","sub":"chinese","ch":"第一赛段","topic":"近义词辨析","type":"fill","stem":"选择恰当的词语填入括号中:\n\n(顽强 顽固 顽固)\n(1)红军战士以( )的意志走完了长征。\n(2)这个人思想( ),不肯接受新事物。\n(3)这个( )的敌人拒不投降。","opts":null,"ans":"顽强,顽固,顽固","exp":"顽强=褒义,指坚强不屈。顽固=贬义,指固执守旧。固执=中性偏贬,坚持己见。"},
|
||||
{"id":"c343","src":"真题","sub":"chinese","ch":"第一赛段","topic":"近义词辨析","type":"fill","stem":"选择恰当的词语填入括号中:\n\n(宽阔 广阔 辽阔)\n(1)汽车行驶在( )的马路上。\n(2)他的胸襟( ),从不斤斤计较。\n(3)我国有( )的草原和海域。","opts":null,"ans":"宽阔,广阔,辽阔","exp":"宽阔=横向宽(马路/肩膀),广阔=范围大(天地/视野/胸襟),辽阔=宽广无边(草原/国土/海洋)。"},
|
||||
{"id":"c351","src":"真题","sub":"chinese","ch":"最终圈","topic":"文学常识","type":"choice","stem":"\"赤面秉赤心,骑赤兔追风;青灯观青史,仗青龙偃月\"这副对联写的是《三国演义》中的( )。","opts":["A. 刘备","B. 张飞","C. 关羽","D. 赵云"],"ans":2,"exp":"\"赤面\"\"赤兔马\"\"青龙偃月刀\"都是关羽的标志。关羽面如重枣、骑赤兔马、使青龙偃月刀。"},
|
||||
{"id":"c352","src":"真题","sub":"chinese","ch":"最终圈","topic":"文学常识","type":"choice","stem":"\"三顾频烦天下计,两朝开济老臣心\"描写的是( )。","opts":["A. 曹操","B. 诸葛亮","C. 周瑜","D. 司马懿"],"ans":1,"exp":"出自杜甫《蜀相》。\"三顾茅庐\"=三顾频烦天下计,\"两朝\"指辅佐刘备刘禅父子。写诸葛亮。"},
|
||||
{"id":"c353","src":"真题","sub":"chinese","ch":"最终圈","topic":"文学常识","type":"choice","stem":"《西游记》中孙悟空\"大闹天宫\"后被( )压在五行山下五百年,后随( )西天取经。","opts":["A. 如来佛祖、唐僧","B. 玉皇大帝、唐僧","C. 如来佛祖、观音","D. 太上老君、唐僧"],"ans":0,"exp":"孙悟空大闹天宫后被如来佛祖压在五行山下,五百年后跟随唐僧取经,被观音菩萨点化。"},
|
||||
{"id":"c354","src":"真题","sub":"chinese","ch":"最终圈","topic":"文学常识","type":"choice","stem":"《水浒传》中以\"倒拔垂杨柳\"闻名的好汉是( )。","opts":["A. 武松","B. 林冲","C. 鲁智深","D. 李逵"],"ans":2,"exp":"鲁智深(鲁达)在相国寺菜园子倒拔垂杨柳,力大无穷。武松打虎,林冲雪夜上梁山,李逵杀四虎。"},
|
||||
{"id":"c355","src":"真题","sub":"chinese","ch":"最终圈","topic":"文学常识","type":"choice","stem":"\"满纸荒唐言,一把辛酸泪。都云作者痴,谁解其中味。\"这首诗是( )的开篇。","opts":["A. 《西游记》","B. 《水浒传》","C. 《三国演义》","D. 《红楼梦》"],"ans":3,"exp":"出自《红楼梦》第一回,作者曹雪芹以这首诗表达创作的心酸与不被理解的感慨。"},
|
||||
{"id":"c356","src":"真题","sub":"chinese","ch":"最终圈","topic":"文学常识","type":"fill","stem":"写出下列人物的绰号:\n\n《水浒传》中宋江的绰号是( ),吴用的绰号是( ),李逵的绰号是( )。","opts":null,"ans":"及时雨,智多星,黑旋风","exp":"宋江-及时雨(仗义疏财),吴用-智多星(足智多谋),李逵-黑旋风(勇猛粗鲁)。"},
|
||||
{"id":"c361","src":"真题","sub":"chinese","ch":"热身圈","topic":"字音字形","type":"fill","stem":"根据拼音写出正确的汉字:\n\nbì( )护 针biān( ) 慰jiè( ) biān( )炮\nbì( )病 告jiè( ) biān( )蝠\npì( )静 jiè( )鉴","opts":null,"ans":"庇,砭,藉,鞭,弊,诫,蝙,僻,借","exp":"庇护、针砭、慰藉、鞭炮、弊病、告诫、蝙蝠、僻静、借鉴。注意形近字辨析。"},
|
||||
{"id":"c362","src":"真题","sub":"chinese","ch":"热身圈","topic":"字音字形","type":"fill","stem":"根据拼音写出正确的汉字:\n\njùn( )工 疏jùn( ) jùn( )马\njùn( )杰 严jùn( ) 险jùn( )","opts":null,"ans":"竣,浚,骏,俊,峻,峻","exp":"竣工(完成)、疏浚(疏通)、骏马(好马)、俊杰(人才)、严峻(严厉)、险峻(险要)。六个同音字形近字。"},
|
||||
{"id":"c363","src":"真题","sub":"chinese","ch":"热身圈","topic":"字音字形","type":"choice","stem":"下列词语书写全部正确的一组是( )。","opts":["A. 按步就班 一览无余 首曲一指","B. 唉声叹气 世外桃园 不径而走","C. 迫不及待 川流不息 呕心沥血","D. 脱颖而出 不记其数 直接了当"],"ans":2,"exp":"A按部就班 首屈一指;B世外桃源 不胫而走;D不计其数 直截了当。C全对。"},
|
||||
{"id":"m301","src":"真题","sub":"math","ch":"第二赛段","topic":"平面图形","type":"choice","stem":"一个长方形的长增加20%,宽减少20%,面积( )。","opts":["A. 不变","B. 增加4%","C. 减少4%","D. 减少20%"],"ans":2,"exp":"设原长a宽b,面积ab。新长1.2a,新宽0.8b,新面积=0.96ab。比原面积减少4%。"},
|
||||
{"id":"m302","src":"真题","sub":"math","ch":"第二赛段","topic":"平面图形","type":"fill","stem":"一个三角形的底是12厘米,高是8厘米。和它等底等高的平行四边形的面积是( )平方厘米。","opts":null,"ans":"96","exp":"三角形面积=12×8÷2=48cm²。等底等高平行四边形面积=三角形面积的2倍=96cm²。"},
|
||||
{"id":"m303","src":"真题","sub":"math","ch":"第二赛段","topic":"平面图形","type":"fill","stem":"一个圆的半径是3厘米,它的周长是( )厘米,面积是( )平方厘米。(保留π)","opts":null,"ans":"6π,9π","exp":"C=2πr=6π厘米,S=πr²=9π平方厘米。"},
|
||||
{"id":"m304","src":"真题","sub":"math","ch":"第二赛段","topic":"平面图形","type":"fill","stem":"一个半圆的直径是10厘米,这个半圆的周长是( )厘米。","opts":null,"ans":"25.7","exp":"半圆周长=πd/2+d=3.14×10/2+10=15.7+10=25.7厘米。注意半圆周长包含直径。"},
|
||||
{"id":"m305","src":"真题","sub":"math","ch":"第二赛段","topic":"平面图形","type":"choice","stem":"图中阴影部分是一个直角梯形,上底4cm,下底8cm,高6cm。阴影面积是( )。","opts":["A. 36cm²","B. 24cm²","C. 18cm²","D. 12cm²"],"ans":0,"exp":"梯形面积=(4+8)×6÷2=36cm²。S梯形=(上底+下底)×高÷2。"},
|
||||
{"id":"m306","src":"真题","sub":"math","ch":"第二赛段","topic":"平面图形","type":"fill","stem":"一个正方形的边长扩大到原来的3倍,周长扩大到原来的( )倍,面积扩大到原来的( )倍。","opts":null,"ans":"3,9","exp":"边长×3,周长也与边长成正比×3;面积与边长平方成正比×9。"},
|
||||
{"id":"m307","src":"真题","sub":"math","ch":"第二赛段","topic":"平面图形","type":"choice","stem":"用一根长24厘米的铁丝围成一个正方形,面积是( )平方厘米;如果围成一个长8厘米的长方形,面积是( )平方厘米。","opts":["A. 36,32","B. 36,16","C. 24,32","D. 24,16"],"ans":0,"exp":"正方形边长=24÷4=6cm,面积=36cm²。长方形宽=24÷2-8=4cm,面积=8×4=32cm²。"},
|
||||
{"id":"m308","src":"真题","sub":"math","ch":"第二赛段","topic":"平面图形","type":"choice","stem":"在一个直径为8米的圆形花坛周围修一条2米宽的环形小路,小路的面积是( )平方米。","opts":["A. 20π","B. 12π","C. 16π","D. 8π"],"ans":0,"exp":"外圆半径=4+2=6m,内圆半径=4m。S=π×(36-16)=20πm²。环形面积=大圆-小圆。"},
|
||||
{"id":"m309","src":"真题","sub":"math","ch":"第二赛段","topic":"平面图形","type":"fill","stem":"一块梯形菜地,上底15米,下底25米,高10米。这块菜地的面积是( )平方米。","opts":null,"ans":"200","exp":"梯形面积=(15+25)×10÷2=200平方米。"},
|
||||
{"id":"m310","src":"真题","sub":"math","ch":"第二赛段","topic":"平面图形","type":"choice","stem":"两个完全一样的直角三角形可以拼成一个( ),也可以拼成一个( )。","opts":["A. 长方形,正方形","B. 平行四边形,长方形","C. 正方形,梯形","D. 平行四边形,梯形"],"ans":1,"exp":"两个完全一样的直角三角形可拼成长方形(斜边重合)或平行四边形(直角边重合)。"},
|
||||
{"id":"m311","src":"真题","sub":"math","ch":"第二赛段","topic":"平面图形","type":"fill","stem":"一个扇形的圆心角是60°,半径是6厘米,这个扇形的面积是( )平方厘米。(保留π)","opts":null,"ans":"6π","exp":"扇形面积=πr²×(60/360)=36π×1/6=6πcm²。"},
|
||||
{"id":"m312","src":"真题","sub":"math","ch":"第二赛段","topic":"平面图形","type":"choice","stem":"把一个长方形框架拉成平行四边形,周长( ),面积( )。","opts":["A. 不变,不变","B. 不变,变小","C. 变大,变小","D. 变小,变大"],"ans":1,"exp":"拉成平行四边形时,四条边长不变,周长不变;但高变小,面积=底×高,所以面积变小。"},
|
||||
{"id":"m321","src":"真题","sub":"math","ch":"第三赛段","topic":"行程问题","type":"fill","stem":"甲、乙两车同时从A、B两地相对开出,甲车每小时行56千米,乙车每小时行48千米,两车在距离中点20千米处相遇。A、B两地相距多少千米?","opts":null,"ans":"520","exp":"相遇时甲比乙多行40km。速度差=56-48=8km/h,相遇时间=40÷8=5h。距离=(56+48)×5=520km。注意\"距中点20km\"=多走40km。"},
|
||||
{"id":"m322","src":"真题","sub":"math","ch":"第三赛段","topic":"行程问题","type":"fill","stem":"一辆客车和一辆货车同时从相距540千米的两地相向而行,客车速度为每小时60千米,货车速度为每小时48千米。几小时后两车相遇?","opts":null,"ans":"5","exp":"相遇时间=总路程÷速度和=540÷(60+48)=540÷108=5小时。"},
|
||||
{"id":"m323","src":"真题","sub":"math","ch":"第三赛段","topic":"行程问题","type":"fill","stem":"小华从家到学校,如果每分钟走60米,会迟到3分钟;如果每分钟走80米,会早到2分钟。小华家到学校的路程是多少米?","opts":null,"ans":"1200","exp":"设准时到需t分钟。60(t+3)=80(t-2),60t+180=80t-160,20t=340,t=17。路程=60×20=1200m。"},
|
||||
{"id":"m324","src":"真题","sub":"math","ch":"第三赛段","topic":"行程问题","type":"choice","stem":"甲、乙两人在400米的环形跑道上跑步,同时同地同向出发,甲的速度是6米/秒,乙的速度是4米/秒。甲第一次追上乙需要多少秒?","opts":["A. 40","B. 100","C. 200","D. 400"],"ans":2,"exp":"追及时间=路程差÷速度差=400÷(6-4)=200秒。同向追及,第一次追上正好多跑一圈。"},
|
||||
{"id":"m325","src":"真题","sub":"math","ch":"第三赛段","topic":"行程问题","type":"fill","stem":"一列火车长200米,以每秒20米的速度通过一座长800米的大桥,需要多少秒?","opts":null,"ans":"50","exp":"过桥总路程=桥长+车长=800+200=1000米。时间=1000÷20=50秒。注意火车过桥问题。"},
|
||||
{"id":"m326","src":"真题","sub":"math","ch":"第三赛段","topic":"行程问题","type":"choice","stem":"一艘轮船从甲港到乙港顺流而下需要4小时,从乙港返回甲港逆流而上需要6小时。已知水流速度为2千米/时,甲乙两港相距多少千米?","opts":["A. 24","B. 36","C. 48","D. 60"],"ans":2,"exp":"设静水船速v。顺流=4(v+2)=6(v-2)=距离。4v+8=6v-12,2v=20,v=10。距离=4×12=48km。"},
|
||||
{"id":"m327","src":"真题","sub":"math","ch":"第三赛段","topic":"行程问题","type":"choice","stem":"甲、乙两人从A地到B地,甲的速度是乙的1.2倍。甲比乙提前10分钟到达B地。如果乙的速度是5千米/时,A、B两地相距多少千米?","opts":["A. 5","B. 6","C. 7","D. 8"],"ans":0,"exp":"甲速=5×1.2=6km/h。设距离x,x/5-x/6=10/60=1/6,x/30=1/6,x=5km。"},
|
||||
{"id":"m328","src":"真题","sub":"math","ch":"第三赛段","topic":"行程问题","type":"fill","stem":"小明从家到学校,先上坡后下坡,上坡速度是3千米/时,下坡速度是5千米/时。从家到学校全程4.5千米,共用1.1小时。上坡路程是多少千米?","opts":null,"ans":"1.5","exp":"设上坡x千米,下坡(4.5-x)千米。x/3+(4.5-x)/5=1.1,两边乘15:5x+3(4.5-x)=16.5,5x+13.5-3x=16.5,2x=3,x=1.5km。"},
|
||||
{"id":"m331","src":"真题","sub":"math","ch":"第三赛段","topic":"定义新运算","type":"fill","stem":"定义新运算:a※b = a×b + a - b。计算:4※5 = ( )。","opts":null,"ans":"19","exp":"4※5=4×5+4-5=20+4-5=19。按新规则直接代入计算即可。"},
|
||||
{"id":"m332","src":"真题","sub":"math","ch":"第三赛段","topic":"定义新运算","type":"choice","stem":"定义运算:a△b = (a+b)×(a-b)。那么8△6的结果是( )。","opts":["A. 28","B. 24","C. 20","D. 14"],"ans":0,"exp":"8△6=(8+6)×(8-6)=14×2=28。注意是两数和与两数差的积。"},
|
||||
{"id":"m333","src":"真题","sub":"math","ch":"第三赛段","topic":"定义新运算","type":"fill","stem":"定义:a★b = ab - a - b + 2。求:5★8 = ( )。","opts":null,"ans":"29","exp":"5★8=5×8-5-8+2=40-13+2=29。"},
|
||||
{"id":"m334","src":"真题","sub":"math","ch":"第三赛段","topic":"小数与循环小数","type":"choice","stem":"下列分数中能化成有限小数的是( )。","opts":["A. 1/6","B. 2/7","C. 3/8","D. 5/9"],"ans":2,"exp":"3/8=0.375。分母8=2³,只含质因数2,能化成有限小数。1/6分母含3,2/7分母含7,5/9分母含3。"},
|
||||
{"id":"m335","src":"真题","sub":"math","ch":"第三赛段","topic":"小数与循环小数","type":"choice","stem":"0.3888...用循环小数表示正确的是( )。","opts":["A. 0.38","B. 0.38(8)","C. 0.3(8)","D. 0.(388)"],"ans":2,"exp":"0.3888...循环节是8(从小数第二位开始循环),写作0.38(8)?通常写作0.38̇或0.388...。但标准写法是0.3888...=0.38(8)或0.38̇。最标准为0.38(8)。"},
|
||||
{"id":"m336","src":"真题","sub":"math","ch":"第三赛段","topic":"小数与循环小数","type":"fill","stem":"把3.14159精确到百分位是( ),保留三位小数是( )。","opts":null,"ans":"3.14,3.142","exp":"精确到百分位看千分位1<5,3.14;保留三位小数看万分位5≥5,3.142。注意四舍五入。"},
|
||||
{"id":"m337","src":"真题","sub":"math","ch":"第三赛段","topic":"小数与循环小数","type":"choice","stem":"0.3(3000...)、0.33(3333...)、0.333(3333...)中最大的数是( )。","opts":["A. 0.3","B. 0.33","C. 0.333","D. 一样大"],"ans":2,"exp":"0.3=0.3000,0.33=0.3333...≈1/3,0.333=0.333333...也是1/3。但严格比较,0.333的第三位是3,而0.33的第三位实际上是0(如果只保留两位),所以0.333最大。实际上0.333...=0.33...,所以若都是循环小数则相等。"},
|
||||
{"id":"m338","src":"真题","sub":"math","ch":"第三赛段","topic":"百分数","type":"fill","stem":"某小学植树500棵,成活率98%。成活了( )棵,死了( )棵。","opts":null,"ans":"490,10","exp":"成活=500×98%=490棵,死亡=500-490=10棵。"},
|
||||
{"id":"m339","src":"真题","sub":"math","ch":"第三赛段","topic":"百分数","type":"choice","stem":"一瓶油重5千克,用去20%后又用去余下的20%,还剩( )千克。","opts":["A. 3","B. 3.2","C. 3.5","D. 2.8"],"ans":1,"exp":"第一次用去5×20%=1kg,剩4kg。第二次用去4×20%=0.8kg,剩3.2kg。注意两次单位1不同。"},
|
||||
{"id":"m340","src":"真题","sub":"math","ch":"第三赛段","topic":"百分数","type":"fill","stem":"用200粒大豆做发芽试验,有15粒没发芽,发芽率是( )%。","opts":null,"ans":"92.5","exp":"发芽率=发芽数÷总数×100%=(200-15)÷200×100%=92.5%。"},
|
||||
{"id":"m341","src":"真题","sub":"math","ch":"第三赛段","topic":"百分数","type":"choice","stem":"甲数是乙数的80%,乙数是丙数的75%,甲数是丙数的( )。","opts":["A. 50%","B. 55%","C. 60%","D. 65%"],"ans":2,"exp":"甲=0.8乙,乙=0.75丙。甲=0.8×0.75丙=0.6丙=60%。"},
|
||||
{"id":"m342","src":"真题","sub":"math","ch":"第三赛段","topic":"工程问题","type":"fill","stem":"一项工程,甲队单独做12天完成,乙队单独做18天完成。两队合作多少天可以完成全部工程?","opts":null,"ans":"7.2","exp":"甲效率1/12,乙效率1/18。合作效率=1/12+1/18=5/36。时间=1÷5/36=7.2天。"},
|
||||
{"id":"m343","src":"真题","sub":"math","ch":"第三赛段","topic":"工程问题","type":"fill","stem":"一批货物,甲车单独运8次运完,乙车单独运12次运完。两车合运4次后,剩下的由甲车单独运,还需几次?","opts":null,"ans":"2","exp":"甲效率1/8,乙1/12。合作4次完成4×(1/8+1/12)=4×5/24=5/6。剩1/6,需(1/6)÷(1/8)=4/3≈1.33次,即还需2次。"},
|
||||
{"id":"m344","src":"真题","sub":"math","ch":"第三赛段","topic":"工程问题","type":"choice","stem":"一个水池装有进水管和排水管,单开进水管5小时注满,单开排水管8小时排空。两管齐开,多少小时可以注满水池?","opts":["A. 3","B. 40/3","C. 13","D. 6.5"],"ans":1,"exp":"进水效率1/5,排水效率1/8。净注水效率=1/5-1/8=3/40。时间=1÷3/40=40/3≈13.33小时。"},
|
||||
{"id":"m345","src":"真题","sub":"math","ch":"第三赛段","topic":"工程问题","type":"fill","stem":"甲、乙两人合做一批零件,甲每小时做12个,乙每小时做8个。两人合作4小时后完成了全部的一半。这批零件共有多少个?","opts":null,"ans":"160","exp":"合作效率=12+8=20个/小时。4小时做80个。80是一半,总数=160个。"},
|
||||
{"id":"m346","src":"真题","sub":"math","ch":"第二赛段","topic":"立体图形","type":"fill","stem":"一个正方体的棱长总和是48厘米,它的体积是( )立方厘米。","opts":null,"ans":"64","exp":"正方体12条棱,棱长=48÷12=4cm。体积=4³=64cm³。"},
|
||||
{"id":"m347","src":"真题","sub":"math","ch":"第二赛段","topic":"立体图形","type":"choice","stem":"一个圆柱底面半径是3厘米,高是5厘米,它的侧面积是( )平方厘米。","opts":["A. 15π","B. 24π","C. 30π","D. 45π"],"ans":2,"exp":"侧面积=底面周长×高=2π×3×5=30πcm²。S侧=2πrh。"},
|
||||
{"id":"m348","src":"真题","sub":"math","ch":"第二赛段","topic":"立体图形","type":"fill","stem":"一个圆锥的底面直径是6厘米,高是4厘米,它的体积是( )立方厘米。(保留π)","opts":null,"ans":"12π","exp":"底面半径3cm。V=1/3×π×3²×4=1/3×36π=12πcm³。圆锥体积=1/3底面积×高。"},
|
||||
{"id":"m349","src":"真题","sub":"math","ch":"最终圈","topic":"找规律","type":"fill","stem":"按规律填数:1, 4, 9, 16, 25, ( ),( )。","opts":null,"ans":"36,49","exp":"规律:第n个数是n²。1=1²,4=2²,9=3²,16=4²,25=5²,6²=36,7²=49。"},
|
||||
{"id":"m350","src":"真题","sub":"math","ch":"最终圈","topic":"找规律","type":"fill","stem":"按规律:第1个图有4个棋子,第2个图有7个,第3个图有10个。第n个图有( )个棋子。","opts":null,"ans":"3n+1","exp":"每次增加3个。第1个=4=3×1+1,第2个=7=3×2+1,第n个=3n+1。"},
|
||||
{"id":"m351","src":"真题","sub":"math","ch":"最终圈","topic":"找规律","type":"choice","stem":"一张纸对折1次有2层,对折2次有4层,对折3次有8层。对折n次后有( )层。","opts":["A. 2n","B. n²","C. 2ⁿ","D. n+2"],"ans":2,"exp":"对折1次=2¹层,2次=2²,3次=2³,n次=2ⁿ层。指数增长规律。"},
|
||||
{"id":"e301","src":"真题","sub":"english","ch":"热身圈","topic":"冠词","type":"choice","stem":"Do you like playing ___ piano? No, I like playing ___ chess.","opts":["A. a, the","B. the, /","C. /, the","D. the, the"],"ans":1,"exp":"乐器前加the(play the piano),球类/棋类前不加冠词(play chess)。"},
|
||||
{"id":"e302","src":"真题","sub":"english","ch":"热身圈","topic":"冠词","type":"choice","stem":"There is ___ apple and ___ orange on the table.","opts":["A. a, a","B. an, an","C. an, a","D. a, an"],"ans":1,"exp":"apple和orange均以元音音素开头,用an。"},
|
||||
{"id":"e303","src":"真题","sub":"english","ch":"热身圈","topic":"冠词","type":"choice","stem":"My father is ___ engineer. He works in ___ university.","opts":["A. an, a","B. a, a","C. an, an","D. a, an"],"ans":0,"exp":"engineer以元音音素开头用an,university以辅音音素/ju:/开头用a。"},
|
||||
{"id":"e304","src":"真题","sub":"english","ch":"热身圈","topic":"冠词","type":"fill","stem":"用a/an/the填空(不填的写 /):\n(1) ___ sun rises in ___ east.\n(2) I have ___ cat. ___ cat is black.\n(3) She is ___ honest girl.","opts":null,"ans":"The,the,a,The,an","exp":"(1)太阳/东方是独一无二的,用the。(2)首次提及用a,再次提及用the。(3)honest中h不发音,以元音音素开头用an。注意the sun/the east的固定用法。"},
|
||||
{"id":"e305","src":"真题","sub":"english","ch":"热身圈","topic":"冠词","type":"choice","stem":"What ___ fine weather it is! Let's go for ___ walk.","opts":["A. a, a","B. /, a","C. a, /","D. /, /"],"ans":1,"exp":"weather不可数名词,前不加冠词。go for a walk固定搭配,walk作可数名词。"},
|
||||
{"id":"e311","src":"真题","sub":"english","ch":"热身圈","topic":"名词复数","type":"choice","stem":"There are two ___ and three ___ in the room.","opts":["A. Chinese, Japanese","B. Chineses, Japanese","C. Chinese, Japanses","D. Chineses, Japanses"],"ans":0,"exp":"Chinese和Japanese单复数同形,不加-s。"},
|
||||
{"id":"e312","src":"真题","sub":"english","ch":"热身圈","topic":"名词复数","type":"fill","stem":"写出下列名词的复数形式:\n(1) child — ( )\n(2) foot — ( )\n(3) sheep — ( )\n(4) tomato — ( )\n(5) knife — ( )","opts":null,"ans":"children,feet,sheep,tomatoes,knives","exp":"child不规则变化→children;foot→feet(oo→ee);sheep单复数同形;以o结尾的加es(tomatoes);f/fe结尾变ves。"},
|
||||
{"id":"e313","src":"真题","sub":"english","ch":"热身圈","topic":"名词复数","type":"choice","stem":"How many ___ can you see in the picture?","opts":["A. deers","B. sheeps","C. fish","D. fishes"],"ans":2,"exp":"fish单复数同形(表示鱼类种类时用fishes)。deer同理单复数同形;sheep也是。"},
|
||||
{"id":"e314","src":"真题","sub":"english","ch":"热身圈","topic":"名词复数","type":"fill","stem":"Look at those ___ (woman, woman) doctors. They are very kind.","opts":null,"ans":"women","exp":"man/woman修饰复数名词时本身也要变复数:woman doctor→women doctors。"},
|
||||
{"id":"e315","src":"真题","sub":"english","ch":"热身圈","topic":"名词复数","type":"choice","stem":"We need some ___ for the salad.","opts":["A. tomatos","B. tomatoes","C. tomato","D. tomato's"],"ans":1,"exp":"some后接可数名词复数。tomato以o结尾变复数加-es→tomatoes。"},
|
||||
{"id":"e321","src":"真题","sub":"english","ch":"热身圈","topic":"现在进行时","type":"fill","stem":"用所给动词的正确形式填空:\nListen! The girl ___ (sing) in the next room.","opts":null,"ans":"is singing","exp":"Listen!提示动作正在发生,用现在进行时be doing。主语the girl是第三人称单数,用is singing。"},
|
||||
{"id":"e322","src":"真题","sub":"english","ch":"热身圈","topic":"现在进行时","type":"choice","stem":"What ___ you ___ now? I ___ my homework.","opts":["A. are, doing; am doing","B. do, do; do","C. are, do; am do","D. do, doing; am doing"],"ans":0,"exp":"now提示现在进行时。疑问句be+主语+doing,回答I am doing。"},
|
||||
{"id":"e323","src":"真题","sub":"english","ch":"热身圈","topic":"现在进行时","type":"fill","stem":"Don't make noise. The baby ___ (sleep).","opts":null,"ans":"is sleeping","exp":"Don't make noise说明宝宝正在睡觉,用现在进行时。注意sleep要双写p+ing→sleeping。"},
|
||||
{"id":"e324","src":"真题","sub":"english","ch":"热身圈","topic":"现在进行时","type":"choice","stem":"Look! The children ___ (play) football on the playground.","opts":["A. play","B. are playing","C. plays","D. is playing"],"ans":1,"exp":"Look!提示动作正在发生。children是复数,用are playing。"},
|
||||
{"id":"e325","src":"真题","sub":"english","ch":"热身圈","topic":"现在进行时","type":"fill","stem":"It's six o'clock. My family ___ (have) dinner together.","opts":null,"ans":"are having","exp":"具体时间点+现在进行时。family指全体家庭成员时视为复数,用are having。注意have→having(去e+ing)。"},
|
||||
{"id":"e326","src":"真题","sub":"english","ch":"热身圈","topic":"现在进行时","type":"choice","stem":"Tom ___ to music in his room.","opts":["A. listens","B. is listenning","C. is listening","D. listen"],"ans":2,"exp":"描述此刻正在发生的动作,用现在进行时。listen→listening(不用双写n)。"},
|
||||
{"id":"e331","src":"真题","sub":"english","ch":"热身圈","topic":"代词","type":"choice","stem":"___ is a teacher. ___ students all like ___ very much.","opts":["A. He, His, him","B. He, He, his","C. Him, His, he","D. She, Her, his"],"ans":0,"exp":"第一空主语用主格He/She。第二空\"他的学生\"用形容词性物主代词His。第三空\"喜欢他\"like后接宾格him。"},
|
||||
{"id":"e332","src":"真题","sub":"english","ch":"热身圈","topic":"代词","type":"fill","stem":"This is not ___ (I) book. ___ (I) is on the desk.","opts":null,"ans":"my,Mine","exp":"第一空修饰book用形容词性物主代词my。第二空指代\"我的书\"用名词性物主代词Mine(=my book)。"},
|
||||
{"id":"e333","src":"真题","sub":"english","ch":"热身圈","topic":"代词","type":"choice","stem":"Help ___ to some fish, boys and girls.","opts":["A. yourself","B. yourselves","C. you","D. your"],"ans":1,"exp":"help oneself to sth. 固定搭配。boys and girls是复数,用yourselves。"},
|
||||
{"id":"e334","src":"真题","sub":"english","ch":"热身圈","topic":"代词","type":"choice","stem":"___ of the students is going to take the exam.","opts":["A. Every","B. Each","C. All","D. Both"],"ans":1,"exp":"谓语is是单数,主语必须单数。each of...作主语谓语用单数。all of+复数名词谓语用复数;every不能接of。"},
|
||||
{"id":"e335","src":"真题","sub":"english","ch":"热身圈","topic":"代词","type":"fill","stem":"The two books are interesting. I like ___ (both/either) of them.","opts":null,"ans":"both","exp":"the two books明确为两本,both of them=\"两者都\"。either of them=\"两者中任一个\",但根据句意\"两本都有趣\"用both。"},
|
||||
{"id":"e336","src":"真题","sub":"english","ch":"热身圈","topic":"代词","type":"choice","stem":"Who taught ___ English last term?","opts":["A. they","B. their","C. them","D. theirs"],"ans":2,"exp":"teach sb. sth.,sb.用宾格。teach them English。teach\"教\"后接双宾语。"},
|
||||
{"id":"e341","src":"真题","sub":"english","ch":"热身圈","topic":"情态动词","type":"choice","stem":"___ I come in? Yes, you ___.","opts":["A. May, may","B. Can, can","C. Must, must","D. Should, should"],"ans":0,"exp":"May I...? 用于请求许可。肯定回答Yes, you may. 也可用Sure/Certainly等。"},
|
||||
{"id":"e342","src":"真题","sub":"english","ch":"热身圈","topic":"情态动词","type":"choice","stem":"You ___ cross the road when the light is red.","opts":["A. must","B. mustn't","C. can","D. need"],"ans":1,"exp":"红灯时禁止过马路,用mustn\"t(不准/禁止)。"},
|
||||
{"id":"e343","src":"真题","sub":"english","ch":"热身圈","topic":"情态动词","type":"fill","stem":"I ___ (can/can\"t) swim when I was five, but now I ___.","opts":null,"ans":"couldn\"t,can","exp":"描述过去能力用can的过去式could。\"五岁时不会游泳\"→couldn\"t。\"现在会\"→can。注意时态一致性。"},
|
||||
{"id":"e344","src":"真题","sub":"english","ch":"热身圈","topic":"情态动词","type":"choice","stem":"You look tired. You ___ go to bed early tonight.","opts":["A. must","B. should","C. can","D. need"],"ans":1,"exp":"should表建议=\"应该\"。must语气太强(必须),can表能力/许可,need表需要。"},
|
||||
{"id":"e345","src":"真题","sub":"english","ch":"热身圈","topic":"情态动词","type":"choice","stem":"___ you like some tea? Yes, please.","opts":["A. Do","B. Can","C. Would","D. Will"],"ans":2,"exp":"Would you like...? 固定句型用于礼貌地提供某物。肯定回答Yes, please. 否定回答No, thanks."},
|
||||
{"id":"e346","src":"真题","sub":"english","ch":"热身圈","topic":"情态动词","type":"fill","stem":"Children ___ (应该) not spend too much time playing computer games.","opts":null,"ans":"should","exp":"should表建议/应该。也可以理解为shouldn\"t spend too much...。"},
|
||||
{"id":"e351","src":"真题","sub":"english","ch":"冲刺圈","topic":"完形填空","type":"choice","stem":"完形填空:\nTom is a student. He gets up ___(1)___ 6:30 every morning. After breakfast, he goes to school ___(2)___ bike. He has four classes in the morning and two in the afternoon. He likes English very much. He ___(3)___ it is very interesting. After school, he often plays basketball ___(4)___ his friends. He ___(5)___ home at 5:30. \n\n(1)","opts":["A. at","B. in","C. on","D. for"],"ans":0,"exp":"具体时间点前用at:at 6:30。"},
|
||||
{"id":"e352","src":"真题","sub":"english","ch":"冲刺圈","topic":"完形填空","type":"choice","stem":"(续上题)(2)","opts":["A. on","B. by","C. in","D. with"],"ans":1,"exp":"by bike=\"骑自行车\"。交通工具类:by bus/train/car/bike。注意by+交通工具不加冠词。"},
|
||||
{"id":"e353","src":"真题","sub":"english","ch":"冲刺圈","topic":"完形填空","type":"choice","stem":"(续上题)(3)","opts":["A. think","B. thinks","C. thought","D. thinking"],"ans":1,"exp":"主语He是第三人称单数,一般现在时动词加-s。think→thinks。"},
|
||||
{"id":"e354","src":"真题","sub":"english","ch":"冲刺圈","topic":"完形填空","type":"choice","stem":"(续上题)(4)","opts":["A. and","B. to","C. with","D. for"],"ans":2,"exp":"play basketball with friends=\"和朋友们打篮球\"。with表\"和...一起\"。"},
|
||||
{"id":"e355","src":"真题","sub":"english","ch":"冲刺圈","topic":"完形填空","type":"choice","stem":"(续上题)(5)","opts":["A. get","B. gets","C. getting","D. got"],"ans":1,"exp":"主语He是第三人称单数。get home=\"到家\"。get→gets。"},
|
||||
{"id":"e361","src":"真题","sub":"english","ch":"冲刺圈","topic":"be动词","type":"fill","stem":"用be动词的适当形式填空:\n(1) I ___ a student.\n(2) She ___ my sister.\n(3) They ___ in the classroom.\n(4) ___ you ready? Yes, I ___.\n(5) There ___ a book and two pens on the desk.","opts":null,"ans":"am,is,are,Are,am,is","exp":"(1)I→am。(2)she→is。(3)They→are。(4)you→Are, I→am。(5)there be就近原则,a book是单数→is。"},
|
||||
{"id":"e362","src":"真题","sub":"english","ch":"冲刺圈","topic":"be动词","type":"choice","stem":"There ___ some milk in the glass.","opts":["A. is","B. are","C. have","D. has"],"ans":0,"exp":"milk不可数名词,there be结构中谓语用is。注意there be表示\"存在\",have/has表示\"拥有\",不可混淆。"},
|
||||
{"id":"e363","src":"真题","sub":"english","ch":"冲刺圈","topic":"be动词","type":"choice","stem":"Where ___ you from? I ___ from China.","opts":["A. are, am","B. is, am","C. are, is","D. is, is"],"ans":0,"exp":"you→are,I→am。be动词与主语保持一致:I-am, you-are, he/she/it-is, we/they-are。"},
|
||||
{"id":"e364","src":"真题","sub":"english","ch":"冲刺圈","topic":"be动词","type":"choice","stem":"The news ___ very exciting.","opts":["A. is","B. are","C. were","D. be"],"ans":0,"exp":"news以-s结尾但为不可数名词,作主语时视为单数,be用is。"},
|
||||
{"id":"e365","src":"真题","sub":"english","ch":"热身圈","topic":"综合填空","type":"choice","stem":"Let's ___ (go/goes/going) to the library. It's time ___ (for/to/at) read books.","opts":["A. go, for","B. goes, at","C. go, to","D. going, for"],"ans":2,"exp":"let's do sth.后接动词原形go。It's time to do sth.固定句型=\"是做某事的时候了\"。"},
|
||||
{"id":"e366","src":"真题","sub":"english","ch":"热身圈","topic":"综合填空","type":"fill","stem":"There ___ (be) a lot of rain in this area every year.","opts":null,"ans":"is","exp":"rain不可数名词,谓语用is。a lot of修饰不可数名词时谓语仍用单数。there be就近原则。"},
|
||||
{"id":"e367","src":"真题","sub":"english","ch":"冲刺圈","topic":"综合填空","type":"choice","stem":"Would you like ___ (go) shopping with me?","opts":["A. go","B. to go","C. going","D. goes"],"ans":1,"exp":"Would you like to do sth.? 固定句型=\"想要做某事\"。like后接to do或doing,在would like中只用to do。"},
|
||||
{"id":"e368","src":"真题","sub":"english","ch":"冲刺圈","topic":"综合填空","type":"choice","stem":"My mother ___ (buy) a new dress for me yesterday.","opts":["A. buy","B. buys","C. bought","D. buying"],"ans":2,"exp":"yesterday提示过去时,buy→bought(不规则变化)。"},
|
||||
{"id":"e369","src":"真题","sub":"english","ch":"冲刺圈","topic":"综合填空","type":"choice","stem":"She ___ (not like) playing the piano at all.","opts":["A. doesn't like","B. don't like","C. isn't like","D. not like"],"ans":0,"exp":"主语She是第三人称单数,否定用doesn't+动词原形。like→doesn't like。"}
|
||||
,
|
||||
{"id":"m401","src":"真题","sub":"math","ch":"第三赛段","topic":"牛吃草问题","type":"fill","stem":"一片草地每天匀速生长。如果24头牛吃,6天吃完;如果21头牛吃,8天吃完。最少多少头牛可以一直吃不完?","opts":null,"ans":"12","exp":"设每头牛每天吃1份。24*6=144份,21*8=168份。每天生长=(168-144)/(8-6)=12份。原有草=144-12*6=72份。要使草永远吃不完,牛的数量<=每天生长量,即<=12头。"},
|
||||
{"id":"m402","src":"真题","sub":"math","ch":"第三赛段","topic":"牛吃草问题","type":"fill","stem":"一个水池有一个进水管和5个排水管。单开进水管60分钟注满;同时开5个排水管,20分钟排空。先开进水管30分钟后,再开所有排水管,多少分钟后排空?","opts":null,"ans":"15","exp":"设总水量1。进水效率1/60,排水效率1/20。进水管30分钟注入1/2。设x分钟后排空:进水=排水,(1/60)*(30+x)=(1/20)*x,解得x=15。注意排水时进水管仍在进水。"},
|
||||
{"id":"m403","src":"真题","sub":"math","ch":"第三赛段","topic":"盈亏问题","type":"choice","stem":"幼儿园老师给小朋友分糖果。每人分3颗多8颗;每人分5颗少6颗。有几个小朋友?几颗糖果?","opts":["A. 6个, 26颗","B. 7个, 29颗","C. 8个, 32颗","D. 9个, 35颗"],"ans":1,"exp":"盈亏公式:(盈+亏)/两次分配差=人数。(8+6)/(5-3)=14/2=7人。糖果=7*3+8=29颗。"},
|
||||
{"id":"m404","src":"真题","sub":"math","ch":"第三赛段","topic":"盈亏问题","type":"choice","stem":"全班同学去划船。如果增加一条船,每条船正好坐6人;如果减少一条船,每条船正好坐9人。全班多少人?","opts":["A. 36","B. 32","C. 40","D. 30"],"ans":0,"exp":"设原来有x条船。6(x+1)=9(x-1)。6x+6=9x-9,3x=15,x=5。人数=6*(5+1)=36人。"},
|
||||
{"id":"m405","src":"真题","sub":"math","ch":"第一赛段","topic":"植树问题","type":"choice","stem":"在一条长240米的道路一边每隔8米种一棵树(两端都种),需要多少棵树?","opts":["A. 29","B. 30","C. 31","D. 32"],"ans":2,"exp":"两端都种:棵数=段数+1=240/8+1=30+1=31棵。"},
|
||||
{"id":"m406","src":"真题","sub":"math","ch":"第一赛段","topic":"植树问题","type":"fill","stem":"在一条长200米的道路两旁每隔5米种一棵树(两端都种),一共需要多少棵树?","opts":null,"ans":"82","exp":"单侧:200/5+1=41棵。两侧:41*2=82棵。注意是\"两旁\"。"},
|
||||
{"id":"m407","src":"真题","sub":"math","ch":"第一赛段","topic":"周期问题","type":"fill","stem":"2026年6月1日是星期一。那么2026年7月1日是星期几?","opts":null,"ans":"三","exp":"6月有30天。6月1日到7月1日过了30天。30/7=4周余2天。星期一+2=星期三。"},
|
||||
{"id":"m408","src":"真题","sub":"math","ch":"第一赛段","topic":"周期问题","type":"choice","stem":"一串彩灯按\"红、黄、蓝、绿、紫\"的顺序重复排列,第86盏灯是什么颜色?","opts":["A. 红色","B. 黄色","C. 蓝色","D. 紫色"],"ans":1,"exp":"86/5=17(组)余1(盏)。余1对应第1盏=红色。"},
|
||||
{"id":"m409","src":"真题","sub":"math","ch":"第三赛段","topic":"时钟问题","type":"choice","stem":"从3:15到3:45,分针转动了多少度?","opts":["A. 90度","B. 120度","C. 150度","D. 180度"],"ans":3,"exp":"30分钟。分针每分钟转6度,30*6=180度。"},
|
||||
{"id":"m410","src":"真题","sub":"math","ch":"第三赛段","topic":"时钟问题","type":"fill","stem":"6点整时,时针和分针的夹角是多少度?3小时后夹角是多少度?","opts":null,"ans":"180,90","exp":"6点整:分针指12,时针指6,夹角180度。3小时后是9点整,分针指12,时针指9,夹角90度。"},
|
||||
{"id":"m411","src":"真题","sub":"math","ch":"热身圈","topic":"分数计算","type":"fill","stem":"计算:1/3 + 1/6 + 1/12 + 1/24 = ( )","opts":null,"ans":"5/8","exp":"通分分母24:8/24+4/24+2/24+1/24=15/24=5/8。"},
|
||||
{"id":"m412","src":"真题","sub":"math","ch":"热身圈","topic":"分数计算","type":"choice","stem":"计算:2/5 * 3/4 / 3/5 = ( )","opts":["A. 1/2","B. 3/5","C. 2/3","D. 1"],"ans":0,"exp":"2/5*3/4/3/5=2/5*3/4*5/3=2/5*5/4=2/4=1/2。除以分数等于乘以倒数。"},
|
||||
{"id":"m413","src":"真题","sub":"math","ch":"热身圈","topic":"简算巧算","type":"fill","stem":"简便计算:25 * 32 * 125 = ( )","opts":null,"ans":"100000","exp":"25*32*125=25*4*8*125=100*1000=100000。拆分32=4*8。"},
|
||||
{"id":"m414","src":"真题","sub":"math","ch":"热身圈","topic":"简算巧算","type":"fill","stem":"简便计算:99 * 99 + 99 = ( )","opts":null,"ans":"9900","exp":"99*99+99=99*(99+1)=99*100=9900。提取公因数99。"},
|
||||
{"id":"m415","src":"真题","sub":"math","ch":"热身圈","topic":"解方程","type":"fill","stem":"解方程:3x + 5 = 20,x = ( )","opts":null,"ans":"5","exp":"3x+5=20,3x=20-5=15,x=15/3=5。"},
|
||||
{"id":"m416","src":"真题","sub":"math","ch":"热身圈","topic":"解方程","type":"fill","stem":"解方程:2(x - 3) = 14,x = ( )","opts":null,"ans":"10","exp":"2(x-3)=14,x-3=7,x=10。注意先去括号。"},
|
||||
{"id":"m417","src":"真题","sub":"math","ch":"最终圈","topic":"最值问题","type":"choice","stem":"用1,2,3,4四个数字组成两个两位数,使它们的乘积最大。这两个两位数分别是多少?","opts":["A. 41和32","B. 42和31","C. 43和21","D. 43和12"],"ans":0,"exp":"要使乘积最大,两数应尽可能接近。41*32=1312,42*31=1302,43*21=903,43*12=516。最大为1312。"},
|
||||
{"id":"m418","src":"真题","sub":"math","ch":"最终圈","topic":"最值问题","type":"choice","stem":"将9分成几个自然数的和,使它们的乘积最大,最大的乘积是多少?","opts":["A. 24","B. 27","C. 30","D. 36"],"ans":1,"exp":"尽量拆成3。9=3+3+3,乘积=3*3*3=27。规律:拆成尽量多的3,余2则加一个2,余1则把一个3+1变成2+2。"},
|
||||
{"id":"m419","src":"真题","sub":"math","ch":"第二赛段","topic":"容斥原理","type":"choice","stem":"某班有40人,喜欢语文的有28人,喜欢数学的有25人,两科都喜欢的有18人。两科都不喜欢的有多少人?","opts":["A. 3","B. 4","C. 5","D. 6"],"ans":2,"exp":"至少喜欢一科:28+25-18=35人。都不喜欢:40-35=5人。容斥公式:A并B=A+B-A交B。"},
|
||||
{"id":"m420","src":"真题","sub":"math","ch":"第二赛段","topic":"容斥原理","type":"fill","stem":"某班50人,订阅A杂志的有30人,订阅B杂志的有25人,两种都订阅的有10人。只订阅一种杂志的有多少人?","opts":null,"ans":"35","exp":"只订A:30-10=20人。只订B:25-10=15人。只订一种:20+15=35人。"},
|
||||
{"id":"m421","src":"真题","sub":"math","ch":"第二赛段","topic":"方阵问题","type":"fill","stem":"某校进行队列表演,排成一个正方形方阵。最外层每边有12人,最外层一共有多少人?","opts":null,"ans":"44","exp":"最外层人数=(12-1)*4=44人。注意四个角的人不重复计数。"},
|
||||
{"id":"m422","src":"真题","sub":"math","ch":"第二赛段","topic":"方阵问题","type":"fill","stem":"一个实心方阵,最外层每边15人,这个方阵一共有多少人?","opts":null,"ans":"225","exp":"实心方阵总人数=边长*边长=15*15=225人。"},
|
||||
{"id":"e401","src":"真题","sub":"english","ch":"第二赛段","topic":"现在完成时","type":"choice","stem":"I ___ already ___ my homework.","opts":["A. have, finish","B. has, finished","C. have, finished","D. have, finishing"],"ans":2,"exp":"现在完成时结构:have/has + 过去分词。主语I用have,finish的过去分词为finished。"},
|
||||
{"id":"e402","src":"真题","sub":"english","ch":"第二赛段","topic":"现在完成时","type":"choice","stem":"She ___ to Beijing twice.","opts":["A. have been","B. has been","C. has gone","D. have gone"],"ans":1,"exp":"have/has been to表示\"去过某地(已回来)\"。主语She用has。"},
|
||||
{"id":"e403","src":"真题","sub":"english","ch":"第二赛段","topic":"现在完成时","type":"fill","stem":"用所给词的正确形式填空:\nHe never ___ (eat) such delicious food before.","opts":null,"ans":"has eaten","exp":"never...before提示现在完成时。主语He用has,eat过去分词eaten。"},
|
||||
{"id":"e404","src":"真题","sub":"english","ch":"第二赛段","topic":"现在完成时","type":"choice","stem":"___ you ever ___ to the Great Wall?","opts":["A. Have, gone","B. Has, been","C. Have, been","D. Did, go"],"ans":2,"exp":"\"你曾经去过长城吗?\"。ever用于现在完成时疑问句。Have you ever been to...? 固定句型。"},
|
||||
{"id":"e405","src":"真题","sub":"english","ch":"第二赛段","topic":"过去进行时","type":"choice","stem":"I ___ TV when my mother came back.","opts":["A. watch","B. was watching","C. watched","D. am watching"],"ans":1,"exp":"\"当妈妈回来时我正在看电视\"。过去某一时刻正在发生的动作,用过去进行时was/were doing。"},
|
||||
{"id":"e406","src":"真题","sub":"english","ch":"第二赛段","topic":"过去进行时","type":"choice","stem":"They ___ football at 4 o'clock yesterday afternoon.","opts":["A. played","B. were playing","C. are playing","D. play"],"ans":1,"exp":"过去具体时间点正在进行的动作,用过去进行时。They用were playing。"},
|
||||
{"id":"e407","src":"真题","sub":"english","ch":"第二赛段","topic":"过去进行时","type":"fill","stem":"用所给词填空:\nWhile I ___ (walk) home, I met an old friend.","opts":null,"ans":"was walking","exp":"while引导的时间状语从句,表示\"在……过程中\",用过去进行时。"},
|
||||
{"id":"e408","src":"真题","sub":"english","ch":"第三赛段","topic":"被动语态","type":"choice","stem":"English ___ in many countries.","opts":["A. speak","B. is spoken","C. speaks","D. was spoken"],"ans":1,"exp":"英语被说(被动语态)。一般现在时的被动:am/is/are+过去分词。English是单数,用is spoken。"},
|
||||
{"id":"e409","src":"真题","sub":"english","ch":"第三赛段","topic":"被动语态","type":"choice","stem":"The bridge ___ last year.","opts":["A. built","B. was built","C. is built","D. builds"],"ans":1,"exp":"last year过去时间,桥被建造(被动语态)。过去时被动:was/were+过去分词。bridge单数用was built。注意不规则动词build→built。"},
|
||||
{"id":"e410","src":"真题","sub":"english","ch":"第三赛段","topic":"被动语态","type":"choice","stem":"This kind of machine ___ in China.","opts":["A. is made","B. was made","C. are made","D. made"],"ans":0,"exp":"\"这种机器是中国制造的\"。一般现在时被动is made。machine不可数或作单数看,用is。"},
|
||||
{"id":"e411","src":"真题","sub":"english","ch":"第三赛段","topic":"宾语从句","type":"choice","stem":"I don't know ___ she will come tomorrow.","opts":["A. that","B. if","C. what","D. which"],"ans":1,"exp":"宾语从句用if/whether表示\"是否\"。句意为\"我不知道她明天是否会来\"。"},
|
||||
{"id":"e412","src":"真题","sub":"english","ch":"第三赛段","topic":"宾语从句","type":"choice","stem":"Can you tell me ___ the hospital is?","opts":["A. what","B. where","C. who","D. whose"],"ans":1,"exp":"宾语从句疑问词的选择。句意为\"你能告诉我医院在哪里吗?\",问地点用where。"},
|
||||
{"id":"e413","src":"真题","sub":"english","ch":"热身圈","topic":"there be","type":"choice","stem":"There ___ a book and two pens on the desk.","opts":["A. is","B. are","C. have","D. has"],"ans":0,"exp":"there be就近原则:靠近be动词的主语a book是单数,用is。"},
|
||||
{"id":"e414","src":"真题","sub":"english","ch":"热身圈","topic":"there be","type":"choice","stem":"___ any milk in the fridge?","opts":["A. Is there","B. Are there","C. There is","D. There are"],"ans":0,"exp":"milk不可数,用there be单数疑问句:Is there any...?"},
|
||||
{"id":"e415","src":"真题","sub":"english","ch":"热身圈","topic":"there be","type":"fill","stem":"用所给词填空:\nThere ___ (be) some apples on the table.","opts":null,"ans":"are","exp":"some apples是复数,be用are。there be中be与后面的主语保持数的一致。"},
|
||||
{"id":"e416","src":"真题","sub":"english","ch":"热身圈","topic":"不定代词","type":"choice","stem":"I'm hungry. I want ___ to eat.","opts":["A. something","B. anything","C. nothing","D. everything"],"ans":0,"exp":"肯定句中用something。\"我饿了,想吃点东西\"。"},
|
||||
{"id":"e417","src":"真题","sub":"english","ch":"热身圈","topic":"不定代词","type":"choice","stem":"There isn't ___ wrong with my bike.","opts":["A. something","B. anything","C. nothing","D. everything"],"ans":1,"exp":"否定句用anything。there isn't anything wrong = there is nothing wrong。"},
|
||||
];// === F1 AUDIO ENGINE ===
|
||||
const AUDIO={ctx:null,muted:false,bgTimer:null,_bgNext:0,started:false,
|
||||
init(){try{this.ctx=new(window.AudioContext||window.webkitAudioContext)();this.muted=!!localStorage.getItem('f1_muted');}catch(e){}},
|
||||
ensure(){try{if(!this.ctx)this.init();if(this.ctx&&this.ctx.state==='suspended')this.ctx.resume();}catch(e){}},
|
||||
toggle(){this.muted=!this.muted;localStorage.setItem('f1_muted',this.muted?'1':'');var b=document.getElementById('muteBtn');if(b)b.textContent=this.muted?'🔇':'🔊';if(this.muted)this.stopBg();else this.startBg();},
|
||||
sfx(f,tp,d,v,dl){if(!this.ctx)return;var tn=this.ctx.currentTime+(dl||0),o=this.ctx.createOscillator(),g=this.ctx.createGain();o.type=tp||'sine';o.frequency.setValueAtTime(f,tn);g.gain.setValueAtTime(v||0.2,tn);g.gain.exponentialRampToValueAtTime(0.001,tn+d);o.connect(g).connect(this.ctx.destination);o.start(tn);o.stop(tn+d+0.01);},
|
||||
correct(){if(this.muted||!this.ctx)return;this.ensure();this.sfx(523,'sine',0.1,0.2,0);this.sfx(659,'sine',0.12,0.2,0.08);this.sfx(784,'sine',0.18,0.15,0.16);},
|
||||
wrong(){if(this.muted||!this.ctx)return;this.ensure();this.sfx(311,'sawtooth',0.12,0.12,0);this.sfx(233,'sawtooth',0.2,0.12,0.1);},
|
||||
milestone(lv){if(this.muted||!this.ctx)return;this.ensure();var ns=lv==='grand'?[523,659,784,1047,1319]:[523,659,784,1047];ns.forEach(function(f,i){this.sfx(f,'sine',0.15,0.15,i*0.08);},this);},
|
||||
engine(){if(this.muted||!this.ctx)return;this.ensure();var t=this.ctx.currentTime,o=this.ctx.createOscillator(),g=this.ctx.createGain();o.type='sawtooth';o.frequency.setValueAtTime(80,t);o.frequency.exponentialRampToValueAtTime(300,t+0.3);o.frequency.exponentialRampToValueAtTime(80,t+0.5);g.gain.setValueAtTime(0.08,t);g.gain.exponentialRampToValueAtTime(0.001,t+0.5);o.connect(g).connect(this.ctx.destination);o.start(t);o.stop(t+0.5);},
|
||||
startBg(){if(this.muted||!this.ctx||this.bgTimer)return;this.ensure();this._bgNext=this.ctx.currentTime;this._scheduleBg();},
|
||||
stopBg(){if(this.bgTimer){clearTimeout(this.bgTimer);this.bgTimer=null;}},
|
||||
_scheduleBg(){if(this.muted||!this.ctx){this.bgTimer=null;return;}var now=this.ctx.currentTime,BPM=140,beat=60/BPM;if(this._bgNext<now)this._bgNext=now;var mel=[659,0,784,880,0,988,880,784,523,0,659,784,0,880,784,659];for(var i=0;i<16;i++){var t=this._bgNext+i*beat*0.5;if(i%4===0)this._kick(t);if(i%4===2)this._snare(t);this._hihat(t,i%4===0?0.06:0.03);if(i===0||i===2||i===4||i===6)this._bass(t,82.41);if(i===8||i===10||i===12||i===14)this._bass(t,98);if(mel[i])this._lead(t,mel[i],beat*0.35);}this._bgNext+=8*beat;var _this=this;this.bgTimer=setTimeout(function(){_this._scheduleBg();},Math.max(0,(this._bgNext-this.ctx.currentTime)*1000-30));},
|
||||
_kick(t){var o=this.ctx.createOscillator(),g=this.ctx.createGain();o.frequency.setValueAtTime(120,t);o.frequency.exponentialRampToValueAtTime(30,t+0.08);g.gain.setValueAtTime(0.5,t);g.gain.exponentialRampToValueAtTime(0.001,t+0.1);o.connect(g).connect(this.ctx.destination);o.start(t);o.stop(t+0.1);},
|
||||
_snare(t){var b=this.ctx.createBuffer(1,Math.ceil(this.ctx.sampleRate*0.1),this.ctx.sampleRate),d=b.getChannelData(0);for(var i=0;i<d.length;i++)d[i]=(Math.random()*2-1)*Math.pow(1-i/d.length,0.3);var s=this.ctx.createBufferSource();s.buffer=b;var g=this.ctx.createGain();g.gain.setValueAtTime(0.2,t);g.gain.exponentialRampToValueAtTime(0.001,t+0.08);s.connect(g).connect(this.ctx.destination);s.start(t);s.stop(t+0.1);},
|
||||
_hihat(t,v){var o=this.ctx.createOscillator(),g=this.ctx.createGain();o.type='square';o.frequency.setValueAtTime(8000,t);g.gain.setValueAtTime(v||0.04,t);g.gain.exponentialRampToValueAtTime(0.001,t+0.03);o.connect(g).connect(this.ctx.destination);o.start(t);o.stop(t+0.04);},
|
||||
_bass(t,f){var o=this.ctx.createOscillator(),g=this.ctx.createGain();o.type='square';o.frequency.setValueAtTime(f,t);g.gain.setValueAtTime(0.15,t);g.gain.exponentialRampToValueAtTime(0.001,t+0.3);o.connect(g).connect(this.ctx.destination);o.start(t);o.stop(t+0.32);},
|
||||
_lead(t,f,d){var o=this.ctx.createOscillator(),g=this.ctx.createGain(),fl=this.ctx.createBiquadFilter();o.type='triangle';o.frequency.setValueAtTime(f,t);g.gain.setValueAtTime(0.1,t);g.gain.exponentialRampToValueAtTime(0.001,t+d);fl.type='lowpass';fl.frequency.setValueAtTime(3000,t);o.connect(fl).connect(g).connect(this.ctx.destination);o.start(t);o.stop(t+d+0.01);}};
|
||||
// === GEOMETRY DIAGRAMS (inline SVG) ===
|
||||
// === ESSAY PROMPTS (作文题库) ===
|
||||
const ESSAYS = [
|
||||
{id:"es01",title:"遇见你,真好!",prompt:"请以\"遇见你,真好!\"为题,写一篇400-600字的记叙文。",hint:"记叙文要求:叙事完整、情感真实、细节具体。选一个对你影响深刻的人或事物来写。"},
|
||||
{id:"es02",title:"我就是一颗会发芽的种子",prompt:"以\"我就是一颗会发芽的种子\"或\"种子发芽以后\"为题,写一篇500字左右的记叙文。",hint:"可以从\"成长\"的角度切入,写自己克服困难、不断进步的经历。"},
|
||||
{id:"es03",title:"送别",prompt:"请以\"送别\"为题,写一篇600字左右的文章,文体自选。",hint:"可以写与亲友分别的场景,也可以写对一段时光的告别。注意场景描写和情感表达。"},
|
||||
{id:"es04",title:"发现",prompt:"请以\"发现\"为话题,写一篇300字左右的记叙文。",hint:"可以写你发现的一个自然现象、一个生活道理或一个身边人的秘密。"},
|
||||
{id:"es05",title:"最美的风景",prompt:"请以\"最美的风景\"为题,写一个200字左右的片段。",hint:"这个\"风景\"可以是自然景观,也可以是人情温暖。注意细节描写。"},
|
||||
{id:"es06",title:"文学人物介绍",prompt:"请介绍一部文学作品中你最喜欢的人物,并阐述理由,150字左右。",hint:"选择你熟悉的人物,从性格特征、言行举止、给你启发等方面写。"},
|
||||
{id:"es07",title:"夏日午后续写",prompt:"以\"夏日午后,蝉声如织……\"为开头,续写一篇300字左右的文章。",hint:"续写时可以设置一个具体的事件或场景,让故事有起伏。"},
|
||||
{id:"es08",title:"XX的滋味",prompt:"请以\"XX的滋味\"为题,写一篇400字左右的记叙文(XX自行补充,如成长的滋味、成功的滋味等)。",hint:"滋味可以是口感,更可以是内心的感受。结合具体事例来写。"},
|
||||
{id:"es09",title:"那一刻,我长大了",prompt:"请以\"那一刻,我长大了\"为题,写一篇500字左右的记叙文。",hint:"选择一个人生中让你突然成长的瞬间,详细描写当时的情景和心理变化。"},
|
||||
{id:"es10",title:"我眼中的________",prompt:"请以\"我眼中的________\"为题,写一篇400字左右的文章(横线上填写一个人、一件事或一个地方)。",hint:"写出你独特的观察和感受,让读者通过你的眼睛看到不一样的世界。"}
|
||||
];
|
||||
// === READING COMPREHENSION (阅读理解题库) ===
|
||||
const READINGS = [
|
||||
{id:"r01",title:"忆冼星海(节选)",author:"茅盾",passage:"和洗星海见面的时候,已经是在听过他作品的演奏、读过了他那万余言的自传以后。那一次我所听到的《黄河大合唱》,据说是小规模的。那次演奏的指挥是一位青年音乐家,朋友告诉我,洗星海就是那位青年音乐家的老师。\n\n从歌咏队的缝隙里望见洗星海的身躯并不高大,但一副健壮而英俊的面孔却令人感到一种勇毅的力量。他的肤色被热带地区的阳光晒成了棕色。他的眼睛放射出一种沉毅的光彩,他的声音清晰而有力。\n\n我们谈了许多,他给我看他的乐谱,也给我看他写下的一些诗。从他的谈话中,我感觉到他是一个具有强烈民族自尊心的人,一个把自己的艺术与祖国的命运紧密相连的人。",
|
||||
qs:[
|
||||
{q:"阅读文章,洗星海给作者的第一印象是怎样的?",a:"身躯健壮、面孔英俊、肤色晒成棕色、眼睛放射沉毅光彩、声音清晰有力"},
|
||||
{q:"作者从哪些方面了解到洗星海?",a:"听过其作品演奏、读过其自传、见面交谈、看过乐谱和诗"},
|
||||
{q:"从文中能看出洗星海是一个怎样的人?",a:"具有强烈民族自尊心、将艺术与祖国命运相连、勇毅而充满力量的人"}
|
||||
]},
|
||||
{id:"r02",title:"一件毛衣的温度(节选)",author:"佚名",passage:"那年冬天特别冷,母亲决定给我织一件毛衣。她从柜子里翻出珍藏多年的毛线,那是深蓝色的,在灯光下泛着柔和的光。\n\n每天晚上,我写完作业上床睡觉时,母亲就坐在床边,一针一针地织着。有时候我半夜醒来,还能看见灯下的身影,听见针与针碰撞的清脆声响。\n\n毛衣织好的那天,母亲让我试穿。毛衣很暖,暖得让我鼻子发酸。那不只是毛线的温度,更是母亲手心的温度。后来我才知道,母亲为了赶在寒流来之前织好,每天晚上都织到很晚,手上的茧子厚了一层。",
|
||||
qs:[
|
||||
{q:"请概括这篇文章的主要内容。",a:"母亲在寒冬深夜为\"我\"织毛衣,毛衣织好后\"我\"感受到不仅是毛线的温度,更是母爱的温暖。"},
|
||||
{q:"文中\"毛衣很暖,暖得让我鼻子发酸\"一句表现了\"我\"怎样的心情?",a:"表现了\"我\"被母亲无私的爱深深感动,内心温暖又有些心疼母亲的心情。"},
|
||||
{q:"\"手上的茧子厚了一层\"这句话有什么深意?",a:"通过细节描写表现母亲日夜操劳的辛苦,茧子象征着母亲对\"我\"深沉无私的爱。"}
|
||||
]},
|
||||
{id:"r03",title:"父爱如山(节选)",author:"佚名",passage:"父亲是个沉默寡言的人。从小到大,他很少对我说\"爱\"这个字,但他的爱,却藏在每一个细微的动作里。\n\n上初中那年,我要到镇上去读书。开学那天,父亲挑着行李走在前面,我跟在后面。三十里的山路,他一声不吭地走着,肩膀被扁担压出一道深深的印痕。到了学校,他帮我铺好床铺,又从口袋里掏出皱巴巴的几百块钱塞给我,只说了一句:\"好好读书。\"\n\n转身离开时,我看见他粗糙的手在眼角抹了一下。那一刻,我忽然明白,父爱如山,不言不语,却撑起了我整片天空。",
|
||||
qs:[
|
||||
{q:"文中父亲\"很少对我说'爱'这个字\",但\"他的爱藏在哪里?",a:"藏在为儿子挑行李走三十里山路、铺床铺、塞钱、转身抹眼角等细微动作里。"},
|
||||
{q:"为什么说父爱\"不言不语,却撑起了整片天空\"?",a:"父亲用行动而非语言表达爱,他默默的付出支撑起了孩子的成长和未来。"},
|
||||
{q:"文中\"皱巴巴的几百块钱\"这个细节有什么作用?",a:"表现了父亲挣钱的不易和对孩子无私的付出,\"皱巴巴\"暗示了这些钱是父亲辛苦积攒的。"}
|
||||
]},
|
||||
{id:"r04",title:"春(节选)",author:"朱自清",passage:"盼望着,盼望着,东风来了,春天的脚步近了。\n\n一切都像刚睡醒的样子,欣欣然张开了眼。山朗润起来了,水涨起来了,太阳的脸红起来了。\n\n小草偷偷地从土里钻出来,嫩嫩的,绿绿的。园子里,田野里,瞧去,一大片一大片满是的。坐着,躺着,打两个滚,踢几脚球,赛几趟跑,捉几回迷藏。风轻悄悄的,草软绵绵的。\n\n桃树、杏树、梨树,你不让我,我不让你,都开满了花赶趟儿。红的像火,粉的像霞,白的像雪。花里带着甜味儿;闭了眼,树上仿佛已经满是桃儿、杏儿、梨儿。",
|
||||
qs:[
|
||||
{q:"文中运用了哪些修辞手法?请举例说明。",a:"拟人(\"春天脚步近了\"\"你不让我我不让你\")、比喻(\"红的像火,粉的像霞,白的像雪\")、排比(\"山朗润起来了,水涨起来了,太阳的脸红起来了\")。"},
|
||||
{q:"\"小草偷偷地从土里钻出来\"中\"偷偷\"一词好在哪里?",a:"\"偷偷\"用拟人手法生动地写出了小草在不知不觉中悄然生长、充满生机的样子,富有情趣。"},
|
||||
{q:"这段文字表达了作者怎样的思想感情?",a:"表达了对春天的热爱和赞美之情,以及对大自然勃勃生机的欣喜之情。"}
|
||||
]}
|
||||
];
|
||||
const DIAGRAMS={
|
||||
f1:'<svg viewBox="0 0 130 85" style="max-width:260px;display:block;margin:8px auto;background:#0f0f23;border-radius:4px"><rect x="10" y="40" width="30" height="30" fill="none" stroke="#666" stroke-width="1.5"/><rect x="40" y="20" width="45" height="45" fill="none" stroke="#666" stroke-width="1.5"/><polygon points="25,55 40,65 62,42" fill="rgba(230,57,70,0.2)" stroke="#e63946" stroke-width="1"/><circle cx="25" cy="55" r="2" fill="#e63946"/><circle cx="62" cy="42" r="2" fill="#e63946"/><text x="7" y="38" fill="#aaa" font-size="9">A</text><text x="38" y="38" fill="#aaa" font-size="9">B</text><text x="38" y="78" fill="#aaa" font-size="9">C</text><text x="7" y="78" fill="#aaa" font-size="9">D</text><text x="38" y="18" fill="#aaa" font-size="9">G</text><text x="87" y="18" fill="#aaa" font-size="9">F</text><text x="87" y="70" fill="#aaa" font-size="9">E</text><text x="20" y="50" fill="#e63946" font-size="8">O1</text><text x="58" y="38" fill="#e63946" font-size="8">O2</text></svg>',
|
||||
f2:'<svg viewBox="0 0 120 80" style="max-width:200px;display:block;margin:8px auto;background:#0f0f23;border-radius:4px"><polygon points="10,10 10,70 110,70" fill="none" stroke="#555" stroke-width="1.5"/><polygon points="10,10 10,70 60,70" fill="rgba(230,57,70,0.2)" stroke="#e63946" stroke-width="1"><animate attributeName="opacity" values="0.15;0.25;0.15" dur="2s" repeatCount="indefinite"/></polygon><circle cx="60" cy="70" r="2.5" fill="#e63946"/><circle cx="10" cy="40" r="2.5" fill="#e63946"/><text x="7" y="8" fill="#aaa" font-size="10">A</text><text x="112" y="74" fill="#aaa" font-size="10">B</text><text x="7" y="74" fill="#aaa" font-size="10">C</text><text x="62" y="65" fill="#e63946" font-size="9">D</text><text x="7" y="38" fill="#e63946" font-size="9">E</text><text x="35" y="62" fill="#888" font-size="8">4cm</text><text x="55" y="45" fill="#888" font-size="8">6cm</text></svg>',
|
||||
f3:'<svg viewBox="0 0 130 80" style="max-width:220px;display:block;margin:8px auto;background:#0f0f23;border-radius:4px"><path d="M10,65 Q65,5 120,65" fill="none" stroke="#e63946" stroke-width="1.5" stroke-dasharray="4,2"/><polygon points="10,65 120,65 10,15" fill="rgba(230,57,70,0.12)" stroke="#555" stroke-width="1.5"/><text x="7" y="13" fill="#aaa" font-size="10">A</text><text x="122" y="69" fill="#aaa" font-size="10">B</text><text x="7" y="70" fill="#aaa" font-size="10">C</text><text x="55" y="38" fill="#888" font-size="8">3</text><text x="60" y="70" fill="#888" font-size="8">4</text><text x="60" y="18" fill="#e63946" font-size="8">半圆</text></svg>',
|
||||
f4:'<svg viewBox="0 0 100 75" style="max-width:200px;display:block;margin:8px auto;background:#0f0f23;border-radius:4px"><rect x="10" y="10" width="80" height="55" fill="none" stroke="#555" stroke-width="1.5"/><polygon points="10,37.5 90,37.5 10,65" fill="rgba(230,57,70,0.2)" stroke="#e63946" stroke-width="1"/><circle cx="10" cy="37.5" r="2" fill="#e63946"/><circle cx="90" cy="37.5" r="2" fill="#e63946"/><text x="5" y="35" fill="#e63946" font-size="9">A</text><text x="92" y="35" fill="#e63946" font-size="9">B</text><text x="8" y="73" fill="#aaa" font-size="9">D</text><text x="88" y="73" fill="#aaa" font-size="9">C</text><text x="45" y="73" fill="#888" font-size="8">8</text></svg>',
|
||||
f5:'<svg viewBox="0 0 130 130" style="max-width:200px;display:block;margin:8px auto;background:#0f0f23;border-radius:4px"><polygon points="65,5 120,40 105,95 25,95 10,40" fill="none" stroke="#666" stroke-width="1.5"/><polygon points="65,5 120,40 105,95 25,95 10,40 65,5" fill="rgba(230,57,70,0.1)" stroke="#e63946" stroke-width="1"/><circle cx="65" cy="5" r="2" fill="#e63946"/><text x="63" y="3" fill="#e63946" font-size="9">A</text><text x="60" y="60" fill="#e63946" font-size="18">★</text></svg>',
|
||||
f6:'<svg viewBox="0 0 120 95" style="max-width:180px;display:block;margin:8px auto;background:#0f0f23;border-radius:4px"><text x="55" y="15" fill="#aaa" font-size="10">1</text><text x="55" y="15" fill="#aaa" font-size="7">←第一排</text><text x="25" y="35" fill="#aaa" font-size="10">3</text><text x="45" y="35" fill="#aaa" font-size="10">2</text><text x="65" y="35" fill="#aaa" font-size="7">←第二排</text><text x="15" y="55" fill="#aaa" font-size="10">4</text><text x="35" y="55" fill="#aaa" font-size="10">5</text><text x="55" y="55" fill="#aaa" font-size="10">6</text><text x="75" y="55" fill="#aaa" font-size="7">←第三排</text><text x="25" y="75" fill="#aaa" font-size="10">10</text><text x="40" y="75" fill="#aaa" font-size="10">9</text><text x="55" y="75" fill="#aaa" font-size="10">8</text><text x="70" y="75" fill="#aaa" font-size="10">7</text><text x="85" y="75" fill="#aaa" font-size="7">←第四排</text></svg>'
|
||||
};
|
||||
const SI={"热身圈":"🟡","第一赛段":"🟢","第二赛段":"🔵","第三赛段":"🟠","最终圈":"🔴"};
|
||||
const stages=['热身圈','第一赛段','第二赛段','第三赛段','最终圈'];
|
||||
const TRACK_NODES=[{x:40,name:'发车区',emoji:'🏁'},{x:120,name:'第一弯',emoji:'💨'},{x:200,name:'大直道',emoji:'🏎'},{x:280,name:'维修区',emoji:'🔧'},{x:360,name:'急转弯',emoji:'⚠'},{x:440,name:'隧道',emoji:'🌪'},{x:520,name:'连续弯',emoji:'🔄'},{x:600,name:'冲刺区',emoji:'⚡'},{x:680,name:'终点线',emoji:'🏆'},{x:740,name:'领奖台',emoji:'🥇'}];
|
||||
let sub='math',conv={},meta={},daily={},selCh={},lastMilestone=-1,mode='normal',lastDate='',streak=0,goal=20,examQid=[],examIdx=0,examScore=0,examTimer=null,topicsBySub={};
|
||||
function $(id){return document.getElementById(id)}
|
||||
// === DATA LAYER ===
|
||||
function initData(){
|
||||
try{
|
||||
let d=localStorage.getItem('f1_data');
|
||||
if(d){d=JSON.parse(d);conv=d.conv||{};meta=d.meta||{};daily=d.daily||{};goal=d.goal||20;streak=d.streak||0;lastDate=d.lastDate||'';}
|
||||
else{let o=localStorage.getItem('f1_conv');if(o)conv=JSON.parse(o);}
|
||||
}catch(e){}
|
||||
Q.forEach(q=>{if(!topicsBySub[q.sub])topicsBySub[q.sub]={};if(!topicsBySub[q.sub][q.topic])topicsBySub[q.sub][q.topic]=[];topicsBySub[q.sub][q.topic].push(q);});
|
||||
}
|
||||
function save(){
|
||||
try{localStorage.setItem('f1_data',JSON.stringify({v:3,conv,meta,daily,goal,streak,lastDate}))}catch(e){}
|
||||
}
|
||||
// === SRS: 艾宾浩斯间隔重复 ===
|
||||
function srsInt(cc){return cc>=5?30:cc>=4?15:cc>=3?7:cc>=2?3:1}
|
||||
function recAns(id,ok){
|
||||
let m=meta[id]||{a:0,c:0,cc:0,l:'',n:'',h:0};
|
||||
m.a++;ok?(m.c++,m.cc++):m.cc=0;
|
||||
let t=new Date().toISOString().slice(0,10);m.l=t;
|
||||
let d=new Date();d.setDate(d.getDate()+srsInt(m.cc));m.n=d.toISOString().slice(0,10);
|
||||
meta[id]=m;
|
||||
daily[t]=(daily[t]||0)+1;
|
||||
if(t!==lastDate){
|
||||
let y=new Date();y.setDate(y.getDate()-1);
|
||||
if(lastDate===y.toISOString().slice(0,10)&&(daily[lastDate]||0)>=goal)streak++;else if(lastDate!==t)streak=1;
|
||||
lastDate=t;
|
||||
}
|
||||
save();
|
||||
}
|
||||
function dueQ(id){let m=meta[id];return m&&m.n?m.n<=new Date().toISOString().slice(0,10):false}
|
||||
// === 掌握度星级 ===
|
||||
function mast(sub,tp){
|
||||
let qs=topicsBySub[sub]?.[tp];if(!qs||!qs.length)return{l:0,s:'☆☆☆',lb:'未知',p:0};
|
||||
let t=0,c=0;qs.forEach(q=>{let m=meta[q.id];if(m&&m.a){t+=m.a;c+=m.c;}});
|
||||
if(!t)return{l:0,s:'☆☆☆',lb:'未练习',p:0};
|
||||
let p=c/t,le=0,s='☆☆☆',lb='薄弱';
|
||||
if(p>=.9){le=3;s='★★★';lb='精通';}else if(p>=.75){le=2;s='★★☆';lb='良好';}else if(p>=.5){le=1;s='★☆☆';lb='合格';}
|
||||
return{l:le,s,lb,p:Math.round(p*100)};
|
||||
}
|
||||
function ovrM(){
|
||||
let tps=Object.keys(topicsBySub[sub]||{});if(!tps.length)return 0;
|
||||
let s=0;tps.forEach(t=>s+=mast(sub,t).l);return Math.round(s/tps.length*100/3);
|
||||
}
|
||||
function getWrongIds(){
|
||||
let w=[];Object.keys(conv).forEach(k=>{let q=Q.find(x=>x.id===k);if(!q||conv[k]==='__s__')return;if(conv[k]!==q.ans)w.push(k);});return w;
|
||||
}
|
||||
function getSimQuestions(q,limit){
|
||||
let same=Q.filter(x=>x.sub===q.sub&&x.topic===q.topic&&x.id!==q.id&&conv[x.id]===undefined);
|
||||
if(same.length<limit)same=same.concat(Q.filter(x=>x.sub===q.sub&&x.ch===q.ch&&x.id!==q.id&&conv[x.id]===undefined&&!same.includes(x)));
|
||||
return same.slice(0,limit);
|
||||
}
|
||||
// === 分层提示 ===
|
||||
function getHintText(q){
|
||||
let hints={
|
||||
'整数读写':'看数位:亿位、万位、个位分别读数','比较大小':'先比位数,再逐位比','四则运算':'先乘除后加减,有括号先算括号',
|
||||
'简便运算':'交换律/结合律/分配律巧用','分数计算':'通分后运算','分数比大小':'分母同比分子,分子同比分母',
|
||||
'小数计算':'对齐小数点','百分数':'百分数→小数→分数转化','比和比例':'内项积=外项积',
|
||||
'方程':'移项变号','解方程':'等式两边同加减乘除','列方程':'设未知数→列等量→解',
|
||||
'行程问题':'速度×时间=距离','工程问题':'效率×时间=总量','分数应用题':'找准单位"1"',
|
||||
'百分数应用题':'百分数×整体=部分','比例应用题':'设比例系数','鸡兔同笼':'假设法或方程法',
|
||||
'周期问题':'找周期→余数对应','植树问题':'段数=棵数±1','年龄问题':'年龄差不变',
|
||||
'定义新运算':'按新规则代入','平面图形':'面积/周长公式','立体图形':'体积/表面积公式',
|
||||
'单位换算':'大→小×进率,小→大÷进率','统计与概率':'总数×概率=频数',
|
||||
'拼音':'注意声韵母和声调','汉字字形':'偏旁部首+笔画','词语理解':'结合语境',
|
||||
'成语':'记住含义和用法','病句修改':'看主谓宾是否搭配','修辞手法':'比喻/拟人/排比/夸张',
|
||||
'古诗文默写':'注意上下句对应','古诗文鉴赏':'意象+手法+情感','文言文实词':'结合上下文推断',
|
||||
'文言文虚词':'之乎者也等虚词含义','文言文翻译':'逐字翻译,调整语序','阅读理解':'通读→定位→归纳',
|
||||
'写作手法':'记叙/描写/抒情/议论','文学常识':'作者+朝代+作品','近义词辨析':'轻重/搭配区分',
|
||||
'口语交际':'注意语境和身份','名词复数':'规则+s/es,不规则单独记',"名词所有格":"有生命's,无生命of",
|
||||
'代词':'主格/宾格/形代/名代','冠词':'a/an泛指,the特指','介词':'in/on/at时间地点',
|
||||
'连词':'and并列,but转折,or选择','形容词':'形修名,系V后接形','副词':'副修动/形/副',
|
||||
'比较级':'than提示比较级','最高级':'三者以上用最高级','动词时态':'找时间词定',
|
||||
'一般现在时':'经常/习惯,三单加s','现在进行时':'be+doing','过去时':'V过去式',
|
||||
'将来时':'will+do或be going to','现在完成时':'have/has+过去分词','进行时':'be+doing',
|
||||
'被动语态':'be+过去分词','情态动词':'can/may/must+动原','动词不定式':'to+动原',
|
||||
'动名词':'V-ing作名词','句型转换':'变疑问找助V,变否定加not','反意疑问句':'前肯后否,前否后肯',
|
||||
'There be':'be就近原则','主谓一致':'主语定谓语','量词':'可数many/few,不可数much/little',
|
||||
'时间介词':'in年on日at时刻','疑问词':'what/where/when/who/why/how','祈使句':'V原开头',
|
||||
'感叹句':'What(+形)+名(+主谓)! / How+形/副!'
|
||||
};
|
||||
return hints[q.topic]||'再想想这个知识点的关键点';
|
||||
}
|
||||
// === CARD RENDER ===
|
||||
function renderCard(q,i,hintMode){
|
||||
let d=conv[q.id];let em=i+1;let st=q.stem.replace(/\n/g,'<br>').replace(/\[FIG:(\d+)\]/g,function(m,id){return '<div class="fig-wrap">'+DIAGRAMS['f'+id]+'</div>';});
|
||||
let isWrong=d!==undefined&&d!==q.ans&&d!=='__s__';
|
||||
let due=dueQ(q.id);
|
||||
let h='<div class="cd"><span class="stage-tag">'+q.ch+'</span>';
|
||||
h+='<div><span class="rn">'+em+'</span><span class="tp">'+SI[q.ch]+' '+q.topic+'</span><span class="src-tag '+(q.src==='真题'?'src-real':'src-prac')+'">'+q.src+'</span>'+(due?'<span class="rvg">📅待复习</span>':'')+'</span>';
|
||||
if(isWrong)h+='<span class="wrong-tag">❌ 错题</span>';
|
||||
if(d!==undefined)h+='<span class="retry" data-id="'+q.id+'" onclick="resetQ(\''+q.id+'\')">🔄 重做</span>';
|
||||
h+='</div><div class="st">'+st+'</div>';
|
||||
if(q.type==='choice'){
|
||||
h+='<div class="opts">';
|
||||
q.opts.forEach((o,j)=>{let c='op';if(d!==undefined){c+=' di';if(j===q.ans)c+=' ok';else if(j===d)c+=' no';}h+='<button class="'+c+'" onclick="cli(\''+q.id+'\','+j+')" id="oc'+q.id+'_'+j+'">'+o+'</button>';});
|
||||
h+='</div>';
|
||||
}else{
|
||||
h+='<input class="inp" id="ip'+q.id+'" placeholder="输入答案冲线..."'+(d!==undefined?' disabled':'')+'>';
|
||||
if(d===undefined)h+='<div class="br"><button class="cf" onclick="cfil(\''+q.id+'\')">🏎 冲线确认</button><button class="sh" onclick="skip(\''+q.id+'\')">👀 看解析</button></div>';
|
||||
}
|
||||
if(d!==undefined){
|
||||
let kor=(d===q.ans||d===true);
|
||||
h+='<div class="fb sh '+(kor?'go':'bd')+'">'+(kor?'✅ PERFECT! 完美通过!':'❌ MISS! 再练练!')+'<br><strong>🔧 维修站解析:</strong>'+q.exp+'</div>';
|
||||
if(!kor&&d!=='__s__'){
|
||||
let sims=getSimQuestions(q,3);
|
||||
if(sims.length){
|
||||
h+='<div class="sim sh"><span class="tp2">🏎 关联练习(同题型巩固)</span>';
|
||||
sims.forEach((sq,si)=>{
|
||||
h+='<div class="st">'+(si+1)+'. '+sq.stem.replace(/\n/g,'<br>')+'</div>';
|
||||
if(sq.type==='choice'){h+='<div class="opts">';sq.opts.forEach((o,j)=>{let c='op';h+='<button class="'+c+'" onclick="cli(\''+sq.id+'\','+j+')" id="oc'+sq.id+'_'+j+'">'+o+'</button>';});h+='</div>';}
|
||||
else{h+='<input class="inp" id="ip'+sq.id+'" placeholder="输入答案..."><div class="br"><button class="cf" onclick="cfil(\''+sq.id+'\')">🏎 确认</button><button class="sh" onclick="skip(\''+sq.id+'\')">👀 解析</button></div>';}
|
||||
});
|
||||
h+='</div>';
|
||||
}
|
||||
}
|
||||
}else if(hintMode){
|
||||
let m=meta[q.id];
|
||||
if(m&&m.h>0)h+='<div class="ht sh">💡 提示: '+getHintText(q)+'</div>';
|
||||
}
|
||||
h+='</div>';
|
||||
return h;
|
||||
}
|
||||
function stageStatus(qs){
|
||||
let st={};stages.forEach(s=>st[s]={total:0,done:0,correct:0});
|
||||
qs.forEach(q=>{if(st[q.ch]){st[q.ch].total++;if(conv[q.id]!==undefined){st[q.ch].done++;if(conv[q.id]===q.ans||conv[q.id]==='__s__')st[q.ch].correct++;}}});
|
||||
return st;
|
||||
}
|
||||
// === BUILD TRACK ===
|
||||
function buildTrack(total,done){
|
||||
let svg=$('trackSvg');if(!svg)return;
|
||||
let pct=total?done/total:0;
|
||||
let activeIdx=Math.min(Math.floor(pct*TRACK_NODES.length),TRACK_NODES.length-1);
|
||||
let h='<path d="M10,25 Q100,5 200,25 T400,25 T600,25 T740,25" fill="none" stroke="#333" stroke-width="3"/>';
|
||||
h+='<path d="M10,25 Q100,5 200,25 T400,25 T600,25 T740,25" fill="none" stroke="#e63946" stroke-width="3" stroke-dasharray="'+(pct*730)+' 730" stroke-linecap="round"/>';
|
||||
TRACK_NODES.forEach((n,i)=>{
|
||||
let cls=i<activeIdx?'passed':i==activeIdx?'active':'future';
|
||||
let y=n.x<100?18:n.x<200?10:n.x<400?15:n.x<600?20:18;
|
||||
h+='<circle class="node-circle '+cls+'" cx="'+n.x+'" cy="'+y+'" r="8"/>';
|
||||
h+='<text class="node-label '+(i<=activeIdx?'passed':'')+'" x="'+n.x+'" y="'+(y-14)+'">'+n.name+'</text>';
|
||||
if(i==activeIdx){h+='<g class="car-group" transform="translate('+(n.x-12)+','+(y-10)+')">';h+='<text class="car-body" font-size="18">🌪️</text>';h+='<text x="20" y="-4" font-size="9">P'+(done+1)+'/'+total+'</text></g>';}
|
||||
});
|
||||
h+='<text x="6" y="20" font-size="12">🏁</text><text x="748" y="20" font-size="14">🏁</text>';
|
||||
svg.innerHTML=h;
|
||||
}
|
||||
// === UPDATE ===
|
||||
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++;});
|
||||
$('pt').textContent=done+'/'+total;
|
||||
$('pf').style.width=(done/total*100)+'%';
|
||||
$('st').textContent=done?'正确率:'+Math.round(cor/done*100)+'%':'正确率:--%';
|
||||
save();
|
||||
buildTrack(total,done);
|
||||
let newMs=Math.floor(done/total*100/10);
|
||||
if(newMs>lastMilestone&&done>0){lastMilestone=newMs;if(newMs==1||newMs==3||newMs==5||newMs==8||newMs==10)startConfetti(newMs>=10?'grand':'normal');}
|
||||
let wrLen=wr.length, dueN=Q.filter(q=>conv[q.id]!==undefined&&dueQ(q.id)).length;
|
||||
$('mb2').innerHTML=
|
||||
'<button class="'+(mode==='normal'?'on':'')+'" onclick="swMode(\'normal\')">🏁 自由练习</button>'+
|
||||
'<button class="'+(mode==='wrong'?'on':'')+'" onclick="swMode(\'wrong\')">? 错题本'+(wrLen?' <span class="badge">'+wrLen+'</span>':'')+'</button>'+
|
||||
'<button class="'+(mode==='retry'?'on':'')+'" onclick="swMode(\'retry\')">🔄 全部重做</button>'+
|
||||
'<button class="'+(mode==='review'?'on':'')+'" onclick="swMode(\'review\')">📅 待复习'+(dueN?' <span class="badge">'+dueN+'</span>':'')+'</button>'+
|
||||
'<button class="'+(mode==='topic'?'on':'')+'" onclick="swMode(\'topic\')">📚 专项</button>'+
|
||||
'<button class="'+(mode==='exam'?'on':'')+'" onclick="swMode(\'exam\')">🏎 考场</button>'+
|
||||
'<button class="'+(mode==='report'?'on':'')+'" onclick="swMode(\'report\')">📊 报告</button>'+
|
||||
'<button onclick="resetAll()">🗑️ 重置</button>';
|
||||
let t=new Date().toISOString().slice(0,10);
|
||||
let todayDone=daily[t]||0;
|
||||
let pct=Math.min(100,todayDone/goal*100);
|
||||
$('mb3').innerHTML='<span class="gl">🎯 今日 <b>'+(todayDone>goal?goal:todayDone)+'/'+goal+'</b></span><div class="gp"><div class="gf" style="width:'+pct+'%"></div></div><span class="gl">🔥 '+streak+'天</span>';
|
||||
}
|
||||
// === RENDER ===
|
||||
function r(){
|
||||
let qs=Q.filter(q=>q.sub===sub);
|
||||
$('tb').innerHTML=[{k:'math',l:'MATH'},{k:'chinese',l:'中文'},{k:'english',l:'ENGLISH'},{k:'essay',l:'✍️ 作文'},{k:'reading',l:'📖 阅读'}].map(s=>{if(s.k==='essay'||s.k==='reading')return '<button class="'+(s.k===sub?'on':'')+'" onclick="sw(\''+s.k+'\')">'+s.l+'</button>';return '<button class="'+(s.k===sub?'on':'')+'" onclick="sw(\''+s.k+'\')">'+s.l+' '+Q.filter(q=>q.sub===s.k).length+'题</button>';}).join('');
|
||||
let curCh=selCh[sub]||'';
|
||||
let ss=stageStatus(qs);
|
||||
$('ch').innerHTML=stages.map(s=>{let st=ss[s];let c=s===curCh?'on':'';return '<button class="'+c+'" onclick="sch(\''+s+'\')"><span class="ico">'+SI[s]+'</span>'+s+' <small>'+st.correct+'/'+st.total+'</small></button>';}).join('');
|
||||
$('ep').className='exam-picker';$('eh').className='exam-hdr';$('mg').className='mg';
|
||||
let f=curCh?qs.filter(q=>q.ch===curCh):qs;
|
||||
if(mode==='wrong'){let w=getWrongIds();f=f.filter(q=>w.includes(q.id));}
|
||||
else if(mode==='retry'){f=f.filter(q=>conv[q.id]!==undefined);}
|
||||
else if(mode==='review'){f=f.filter(q=>conv[q.id]!==undefined&&dueQ(q.id));}
|
||||
else if(mode==='topic'){renderTopicGrid();return;}
|
||||
else if(mode==='exam'){renderExamPicker();return;}
|
||||
else if(mode==='report'){renderReport();return;}
|
||||
if(!f.length){
|
||||
let msgs={wrong:'🎉 没有错题!继续加油!',review:'🎉 没有待复习的题目!',retry:'没有已答题目',normal:'选择赛段开始 🏎'};
|
||||
$('mn').innerHTML='<div class="ni">'+(msgs[mode]||'选择赛段开始 🏎')+'</div>';upd();return;
|
||||
}
|
||||
let h='';
|
||||
if(mode==='wrong'){
|
||||
let wIds=getWrongIds();let totalW=wIds.length;
|
||||
let doneW=f.filter(q=>conv[q.id]!==undefined&&conv[q.id]!=='__s__'&&conv[q.id]===Q.find(x=>x.id===q.id).ans).length;
|
||||
h+='<div class="stat-panel sh"><div class="row"><span>? 当前错题</span><span class="v red">'+f.length+' 题</span></div><div class="row"><span>总错题数</span><span class="v red">'+totalW+' 题</span></div><div class="row"><span>已纠正</span><span class="v">'+doneW+'/'+f.length+'</span></div></div>';
|
||||
}
|
||||
if(mode==='review')h+='<div class="stat-panel sh"><div class="row"><span>📅 待复习</span><span class="v y">'+f.length+' 题</span></div><div class="row"><small style="color:#666">基于艾宾浩斯遗忘曲线智能安排</small></div></div>';
|
||||
let totalPages=Math.ceil(f.length/PAGE_SIZE)||1;
|
||||
if(pg>=totalPages)pg=0;
|
||||
let start=pg*PAGE_SIZE,end=Math.min(start+PAGE_SIZE,f.length);
|
||||
f.slice(start,end).forEach((q,i)=>{h+=renderCard(q,start+i,true);});
|
||||
if(f.length>PAGE_SIZE){
|
||||
h+='<div class="pg">';
|
||||
h+='<button class="'+(pg<=0?'di':'')+'" onclick="'+(pg>0?'goPage('+(pg-1)+')':'')+'">? 上一页</button>';
|
||||
let maxVis=9,side=Math.min(pg,totalPages-maxVis);
|
||||
for(let i=0;i<totalPages;i++){
|
||||
if(totalPages>maxVis&&i>1&&i<side){i=side-1;continue;}
|
||||
if(totalPages>maxVis&&i>side+maxVis-2&&i<totalPages-2){i=totalPages-3;}
|
||||
let d='';
|
||||
if(i>0&&i===side&&totalPages>maxVis&&side>1)d='…';
|
||||
h+='<button class="'+(i===pg?'on':'')+'" onclick="goPage('+i+')">'+d+(d?'':(i+1))+'</button>';
|
||||
}
|
||||
h+='<button class="'+(pg>=totalPages-1?'di':'')+'" onclick="'+(pg<totalPages-1?'goPage('+(pg+1)+')':'')+'">下一页 ?</button>';
|
||||
h+='<span class="info">'+(start+1)+'-'+end+' / '+f.length+'</span>';
|
||||
h+='</div>';
|
||||
}
|
||||
$('mn').innerHTML=h;
|
||||
upd();
|
||||
}
|
||||
let pg=0;
|
||||
const PAGE_SIZE=15;
|
||||
function sw(s){sub=s;mode='normal';pg=0;if(s==='essay'){$('ch').style.display='none';renderEssays();return;}if(s==='reading'){$('ch').style.display='none';renderReadings();return;}$('ch').style.display='';r();}
|
||||
function sch(c){selCh[sub]=c;pg=0;r();}
|
||||
function swMode(m){
|
||||
if(m==='exam'){mode=m;renderExamPicker();return;}
|
||||
if(m==='topic'){mode='topic';renderTopicGrid();return;}
|
||||
if(m==='report'){mode='report';renderReport();return;}
|
||||
if(m==='normal')selCh[sub]='';
|
||||
mode=m;pg=0;r();
|
||||
}
|
||||
function goPage(p){pg=p;r();}
|
||||
// === TOPIC GRID (专项练习) ===
|
||||
function renderTopicGrid(){
|
||||
$('ep').className='exam-picker';$('eh').className='exam-hdr';
|
||||
let tps=Object.keys(topicsBySub[sub]||{});
|
||||
let h='<h3 style="padding:8px 12px;font-size:13px;color:#ffd166;font-family:Orbitron,sans-serif">📚 专项练习 · 选择知识点</h3><div class="mg sh">';
|
||||
tps.sort().forEach(tp=>{
|
||||
let m=mast(sub,tp);let qs=topicsBySub[sub][tp];
|
||||
let todo=qs.filter(q=>conv[q.id]===undefined).length;
|
||||
h+='<div class="mg-item" onclick="startTopic(\''+tp+'\')"><span class="tp">'+tp+'</span><span class="stars">'+m.s+'</span><span class="pct">'+m.lb+(m.p>0?' '+m.p+'%':'')+'</span><span class="sz">'+todo+'/'+qs.length+'</span></div>';
|
||||
});
|
||||
h+='</div>';
|
||||
$('mg').className='mg sh';$('mn').innerHTML=h;upd();
|
||||
}
|
||||
function startTopic(tp){
|
||||
selCh[sub]='';let qs=Q.filter(q=>q.sub===sub&&q.topic===tp&&conv[q.id]===undefined);
|
||||
if(!qs.length){$('mn').innerHTML='<div class="ni">🎉 该知识点已全部掌握!</div>';upd();return;}
|
||||
let h='<button class="cf" style="margin:8px 12px;padding:5px 14px;border:none;border-radius:4px;background:#e63946;color:#fff;cursor:pointer;font-size:11px;font-family:Orbitron,sans-serif" onclick="swMode(\'topic\')">← 返回知识点列表</button>';
|
||||
qs.forEach((q,i)=>{h+=renderCard(q,i,true);});
|
||||
$('mg').className='mg';$('mn').innerHTML=h;upd();
|
||||
}
|
||||
// === EXAM MODE (模拟考场) ===
|
||||
function renderExamPicker(){
|
||||
$('ep').className='exam-picker sh';$('eh').className='exam-hdr';$('mg').className='mg';
|
||||
$('ep').innerHTML='<button onclick="startExam(5)">🏁 5题</button><button onclick="startExam(10)">🏁 10题</button><button onclick="startExam(20)">🏁 20题</button><button onclick="startExam(40)">🏁 40题</button>';
|
||||
$('mn').innerHTML='<div class="exam-result" style="padding-top:20px"><h2>🏎 模拟考场</h2><p style="font-size:13px;color:#888">选择题目数量开始计时模拟考试</p></div>';upd();
|
||||
}
|
||||
function formatTime(s){let m=Math.floor(s/60);let sec=s%60;return m+':'+(sec<10?'0':'')+sec;}
|
||||
function startExam(count){
|
||||
let qs=Q.filter(q=>q.sub===sub);if(!qs.length)return;
|
||||
let shuffled=[...qs].sort(()=>Math.random()-0.5);
|
||||
examQid=shuffled.slice(0,Math.min(count,shuffled.length)).map(q=>q.id);
|
||||
examIdx=0;examScore=0;
|
||||
$('ep').className='exam-picker';
|
||||
let totalSec=count*90;
|
||||
$('eh').className='exam-hdr sh';$('et').textContent=formatTime(totalSec);
|
||||
if(examTimer)clearInterval(examTimer);
|
||||
examTimer=setInterval(()=>{totalSec--;$('et').textContent=formatTime(totalSec);if(totalSec<=0){clearInterval(examTimer);examTimer=null;finishExam();}},1000);
|
||||
AUDIO.engine();showExamQ();
|
||||
}
|
||||
function showExamQ(){
|
||||
if(examIdx>=examQid.length){finishExam();return;}
|
||||
let q=Q.find(x=>x.id===examQid[examIdx]);if(!q)return;
|
||||
$('eqc').textContent=(examIdx+1)+'/'+examQid.length;
|
||||
let st=q.stem.replace(/\n/g,'<br>').replace(/\[FIG:(\d+)\]/g,function(m,id){return '<div class="fig-wrap">'+DIAGRAMS['f'+id]+'</div>';});
|
||||
let h='<div class="cd"><span class="stage-tag">'+q.ch+'</span>';
|
||||
h+='<div><span class="rn">'+(examIdx+1)+'</span><span class="tp">'+SI[q.ch]+' '+q.topic+'</span></div>';
|
||||
h+='<div class="st">'+st+'</div>';
|
||||
if(q.type==='choice'){h+='<div class="opts">';q.opts.forEach((o,j)=>{h+='<button class="op" onclick="examCli('+j+')" id="eoc'+j+'">'+o+'</button>';});h+='</div>';}
|
||||
else{h+='<input class="inp" id="eip" placeholder="输入答案..." autofocus>';h+='<div class="br"><button class="cf" onclick="examCfil()">🏎 确认</button></div>';}
|
||||
h+='</div>';$('mn').innerHTML=h;
|
||||
}
|
||||
function examCli(j){
|
||||
let q=Q.find(x=>x.id===examQid[examIdx]);if(!q)return;
|
||||
let kor=j===q.ans;
|
||||
document.querySelectorAll('#eoc'+j)[0].className='op di '+(kor?'ok':'no');
|
||||
document.querySelectorAll('#eoc'+q.ans)[0].className='op di ok';
|
||||
if(kor)examScore++;examIdx++;setTimeout(showExamQ,400);
|
||||
}
|
||||
function examCfil(){
|
||||
let q=Q.find(x=>x.id===examQid[examIdx]);if(!q)return;
|
||||
let v=$('eip')?$('eip').value.trim():'';if(!v)return;
|
||||
let kor=v===q.ans;
|
||||
let inp=$('eip');inp.disabled=true;inp.className='inp '+(kor?'ok':'no');
|
||||
if(kor)examScore++;examIdx++;setTimeout(showExamQ,600);
|
||||
}
|
||||
function finishExam(){
|
||||
if(examTimer){clearInterval(examTimer);examTimer=null;}
|
||||
$('eh').className='exam-hdr';
|
||||
let pct=examQid.length?Math.round(examScore/examQid.length*100):0;
|
||||
if(pct>=80)startConfetti('grand');else if(pct>=50)startConfetti('normal');
|
||||
$('mn').innerHTML='<div class="exam-result"><h2>🏎 模拟考场 · 成绩单</h2><p style="font-size:24px;color:#ffd166">'+examScore+'/'+examQid.length+'</p><p style="font-size:14px;color:'+(pct>=80?'#52b788':pct>=60?'#ffd166':'#ff6b6b')+'">正确率 '+pct+'%'+(pct>=80?' 🏆 优秀!':pct>=60?' 👍 不错!':' 💪 继续加油!')+'</p>'+
|
||||
'<div style="margin:16px 0;display:flex;gap:8px;justify-content:center">'+
|
||||
'<button class="cf" onclick="exitExam()">返回</button>'+
|
||||
'<button class="cf" style="background:#52b788" onclick="startExam('+examQid.length+')">🔄 重新模考</button></div></div>';
|
||||
}
|
||||
function exitExam(){if(examTimer){clearInterval(examTimer);examTimer=null;}mode='normal';r();}
|
||||
// === ESSAY MODE (作文练习) ===
|
||||
function renderEssays(){
|
||||
$('ep').className='exam-picker';$('eh').className='exam-hdr';$('mg').className='mg';$('rp').className='rp';
|
||||
let h='<div style="padding:8px 12px"><h3 style="font-size:14px;color:#ffd166;margin-bottom:4px;font-family:Orbitron,sans-serif">✍️ 作文练习</h3><p style="font-size:11px;color:#888">以下写作题目来自历年分班考试真题。选择一题,在方框中写作。完成后可自行对照评分标准检查。</p></div>';
|
||||
let total=ESSAYS.length;
|
||||
h+='<div class="cd" style="border-left-color:#ffd166"><div class="st" style="font-size:11px;color:#888">共 <b style="color:#ffd166">'+total+'</b> 道作文题</div></div>';
|
||||
ESSAYS.forEach((es,i)=>{
|
||||
h+='<div class="es"><div class="es-title">'+(i+1)+'. '+es.title+'</div>';
|
||||
h+='<div class="es-prompt">'+es.prompt.replace(/\n/g,'<br>')+'</div>';
|
||||
h+='<textarea class="es-area" id="es_'+es.id+'" placeholder="在此写作文...(纯本地,不会上传)"></textarea>';
|
||||
h+='<div class="es-hint">💡 提示:'+es.hint+'</div>';
|
||||
h+='<div class="br" style="margin-top:8px"><button class="cf" onclick="clearEssay(\''+es.id+'\')">🗑️ 清空</button><button class="sh" onclick="saveEssay(\''+es.id+'\')">💾 保存</button></div>';
|
||||
h+='</div>';
|
||||
});
|
||||
$('mn').innerHTML=h;upd();
|
||||
// Restore saved essays
|
||||
try{ESSENTIALS=JSON.parse(localStorage.getItem('f1_essays')||'{}');}catch(e){ESSENTIALS={};}
|
||||
Object.keys(ESSENTIALS).forEach(k=>{let ta=$('es_'+k);if(ta)ta.value=ESSENTIALS[k];});
|
||||
}
|
||||
let ESSENTIALS={};
|
||||
function clearEssay(id){let ta=$('es_'+id);if(ta)ta.value='';}
|
||||
function saveEssay(id){let ta=$('es_'+id);if(!ta||!ta.value.trim())return;ESSENTIALS[id]=ta.value;try{localStorage.setItem('f1_essays',JSON.stringify(ESSENTIALS));}catch(e){}}
|
||||
// === READING MODE (阅读理解) ===
|
||||
function renderReadings(){
|
||||
$('ep').className='exam-picker';$('eh').className='exam-hdr';$('mg').className='mg';$('rp').className='rp';
|
||||
let h='<div style="padding:8px 12px"><h3 style="font-size:14px;color:#ffd166;margin-bottom:4px;font-family:Orbitron,sans-serif">📖 阅读理解</h3><p style="font-size:11px;color:#888">以下阅读文章选自历年分班考试真题。请阅读文章后回答相关问题。</p></div>';
|
||||
h+='<div class="cd" style="border-left-color:#ffd166"><div class="st" style="font-size:11px;color:#888">共 <b style="color:#ffd166">'+READINGS.length+'</b> 篇阅读文章</div></div>';
|
||||
READINGS.forEach((rd,i)=>{
|
||||
h+='<div class="rc"><div class="es-title">'+(i+1)+'. '+rd.title+'<span style="color:#666;font-size:11px;margin-left:8px">—— '+rd.author+'</span></div>';
|
||||
h+='<div class="rc-passage">'+rd.passage.replace(/\n/g,'<br>')+'</div>';
|
||||
h+='<div style="margin-top:8px;padding:8px;background:#0f0f23;border-radius:4px;border-left:3px solid #52b788"><div style="font-size:11px;color:#52b788;margin-bottom:6px;font-weight:600">📝 问题</div>';
|
||||
rd.qs.forEach((q,qi)=>{
|
||||
h+='<div style="margin-bottom:10px"><div class="st" style="font-size:13px;margin-bottom:4px">'+(qi+1)+'. '+q.q+'</div>';
|
||||
h+='<textarea class="es-area" id="ra_'+rd.id+'_'+qi+'" placeholder="写下你的答案..." style="min-height:50px"></textarea>';
|
||||
h+='<div style="margin-top:4px"><button class="sh" onclick="showReadingAns(\''+rd.id+'\','+qi+')" style="padding:2px 10px;font-size:10px">👀 参考答案</button>';
|
||||
h+='<span class="fb" id="rafb_'+rd.id+'_'+qi+'" style="display:none;margin-top:4px;background:#1a1a3e;color:#52b788;border-color:#2d6a4f">'+q.a+'</span></div></div>';
|
||||
});
|
||||
h+='</div></div>';
|
||||
});
|
||||
$('mn').innerHTML=h;upd();
|
||||
}
|
||||
function showReadingAns(id,qi){
|
||||
let fb=$('rafb_'+id+'_'+qi);
|
||||
if(fb)fb.style.display='block';
|
||||
}
|
||||
// === REPORT (学习报告) ===
|
||||
function renderReport(){
|
||||
$('ep').className='exam-picker';$('eh').className='exam-hdr';$('mg').className='mg';
|
||||
let qs=Q.filter(q=>q.sub===sub);let total=qs.length,done=0,cor=0;
|
||||
qs.forEach(q=>{let d=conv[q.id];if(d!==undefined){done++;if(d===q.ans)cor++;}});
|
||||
let wr=getWrongIds().filter(id=>qs.find(q=>q.id===id)).length;
|
||||
let tps=Object.keys(topicsBySub[sub]||{});
|
||||
let days=[];for(let i=6;i>=0;i--){let d=new Date();d.setDate(d.getDate()-i);days.push(d.toISOString().slice(0,10));}
|
||||
let h='<div class="rp sh"><h3 style="font-size:14px;color:#ffd166;margin-bottom:10px;font-family:Orbitron,sans-serif">📊 学习报告 · '+sub+'</h3>';
|
||||
h+='<div class="rw"><span class="lb">已答题数</span><span class="vl">'+done+'/'+total+'</span></div>';
|
||||
h+='<div class="rw"><span class="lb">正确率</span><span class="vl '+(done?(cor/done>=.7?'g':'r'):'')+'">'+(done?Math.round(cor/done*100)+'%':'--')+'</span></div>';
|
||||
h+='<div class="rw"><span class="lb">错题数</span><span class="vl r">'+wr+'</span></div>';
|
||||
h+='<div class="rw"><span class="lb">知识点掌握度</span><span class="vl y">'+ovrM()+'%</span></div>';
|
||||
h+='<div class="rw"><span class="lb">学习天数</span><span class="vl">'+Object.keys(daily).length+'天</span></div>';
|
||||
h+='<div class="rw"><span class="lb">连续学习</span><span class="vl y">'+streak+'天🔥</span></div>';
|
||||
h+='<div class="rw"><span class="lb">每日目标</span><span class="vl">'+goal+'题/天 <span class="rt" onclick="setGoal()" style="font-size:9px;margin-left:4px">✏️修改</span></span></div>';
|
||||
h+='<div class="stitle">📈 近7天做题量</div><div class="dw">';
|
||||
let maxDay=0;days.forEach(d=>{let c=daily[d]||0;if(c>maxDay)maxDay=c;});
|
||||
days.forEach(d=>{
|
||||
let c=daily[d]||0;let ht=maxDay?Math.round(c/maxDay*38)+2:2;
|
||||
h+='<div class="day"><div class="b" style="height:'+ht+'px;background:'+(c>=goal?'#52b788':'#e63946')+'"></div><span>'+d.slice(5)+'</span></div>';
|
||||
});
|
||||
h+='</div><div class="stitle">📚 知识点掌握度</div>';
|
||||
tps.sort().forEach(tp=>{
|
||||
let m=mast(sub,tp);let barColor=m.p>=90?'#52b788':m.p>=75?'#ffd166':m.p>=50?'#ff9f43':'#e63946';
|
||||
h+='<div class="topic-bar"><span class="nm">'+tp+'</span><div class="bar"><div class="fill" style="width:'+m.p+'%;background:'+barColor+'"></div></div><span class="stars">'+m.s+'</span></div>';
|
||||
});
|
||||
h+='<div style="margin-top:14px;display:flex;gap:6px"><button class="cf" onclick="swMode(\'normal\')" style="flex:1;padding:8px;border:none;border-radius:4px;background:#e63946;color:#fff;cursor:pointer;font-size:11px;font-family:Orbitron,sans-serif">← 返回练习</button></div></div>';
|
||||
$('rp').className='rp sh';$('mn').innerHTML=h;upd();
|
||||
}
|
||||
function setGoal(){let n=prompt('设置每日目标题数:',goal);if(n&&!isNaN(n)&&n>0){goal=parseInt(n);save();renderReport();}}
|
||||
// === ANSWER HANDLERS ===
|
||||
function cli(id,j){
|
||||
if(conv[id]!==undefined)return;
|
||||
let q=Q.find(x=>x.id===id);if(!q)return;
|
||||
let kor=j===q.ans;
|
||||
conv[id]=j;recAns(id,kor);if(kor)AUDIO.correct();else AUDIO.wrong();
|
||||
document.querySelectorAll('#oc'+id+'_'+j)[0].className='op di '+(kor?'ok':'no');
|
||||
document.querySelectorAll('#oc'+id+'_'+q.ans)[0].className='op di ok';
|
||||
q.opts.forEach((o,k)=>{if(k!==j&&k!==q.ans){let el=document.querySelectorAll('#oc'+id+'_'+k)[0];if(el)el.className='op di'}});
|
||||
let cd=document.querySelectorAll('#oc'+id+'_0')[0].closest('.cd');
|
||||
if(!kor){
|
||||
let m=meta[id];
|
||||
if(m&&m.h===0){
|
||||
m.h=1;
|
||||
let ht=document.createElement('div');ht.className='ht sh';
|
||||
ht.innerHTML='💡 提示: '+getHintText(q)+'<br><span class="rt" onclick="retryChoice(\''+id+'\')">🔄 再试一次</span><span style="margin-left:8px" class="rt" onclick="showFullExp(\''+id+'\')">👀 看解析</span>';
|
||||
cd.appendChild(ht);
|
||||
let fb=cd.querySelector('.fb');if(fb)fb.remove();return;
|
||||
}
|
||||
}
|
||||
let fb=document.createElement('div');
|
||||
fb.className='fb sh '+(kor?'go':'bd');
|
||||
fb.innerHTML=(kor?'✅ PERFECT! 完美通过!':'❌ MISS! 再练练!')+'<br><strong>🔧 维修站解析:</strong>'+q.exp;
|
||||
cd.appendChild(fb);
|
||||
if(!kor){
|
||||
let sims=getSimQuestions(q,3);
|
||||
if(sims.length){
|
||||
let sdiv=document.createElement('div');sdiv.className='sim sh';
|
||||
let shtml='<span class="tp2">🏎 关联练习(同题型巩固)</span>';
|
||||
sims.forEach((sq,si)=>{
|
||||
shtml+='<div class="st">'+(si+1)+'. '+sq.stem.replace(/\n/g,'<br>')+'</div>';
|
||||
if(sq.type==='choice'){shtml+='<div class="opts">';sq.opts.forEach((o,j2)=>{let c='op';shtml+='<button class="'+c+'" onclick="cli(\''+sq.id+'\','+j2+')" id="oc'+sq.id+'_'+j2+'">'+o+'</button>';});shtml+='</div>';}
|
||||
else{shtml+='<input class="inp" id="ip'+sq.id+'" placeholder="输入答案..."><div class="br"><button class="cf" onclick="cfil(\''+sq.id+'\')">🏎 确认</button><button class="sh" onclick="skip(\''+sq.id+'\')">👀 解析</button></div>';}
|
||||
});
|
||||
sdiv.innerHTML=shtml;cd.appendChild(sdiv);
|
||||
}
|
||||
}
|
||||
upd();
|
||||
}
|
||||
function retryChoice(id){
|
||||
delete conv[id];
|
||||
let el=document.querySelector('.cd:has(.ht)');
|
||||
if(el){let q=Q.find(x=>x.id===id);if(q)el.outerHTML=renderCard(q,0,true);}
|
||||
upd();
|
||||
}
|
||||
function showFullExp(id){
|
||||
let q=Q.find(x=>x.id===id);if(!q)return;
|
||||
let cds=document.querySelectorAll('.cd');let cd=cds[cds.length-1];
|
||||
let ht=cd.querySelector('.ht');if(ht)ht.remove();
|
||||
let fb=document.createElement('div');fb.className='fb sh bd';
|
||||
fb.innerHTML='❌ MISS! 再练练!<br><strong>🔧 维修站解析:</strong>'+q.exp;
|
||||
cd.appendChild(fb);upd();
|
||||
}
|
||||
function cfil(id){
|
||||
let q=Q.find(x=>x.id===id);if(!q)return;
|
||||
let v=$('ip'+id)?$('ip'+id).value.trim():'';if(!v)return;
|
||||
let kor=(v===q.ans);
|
||||
conv[id]=kor?q.ans:'__w__';recAns(id,kor);if(kor)AUDIO.correct();else AUDIO.wrong();
|
||||
let inp=$('ip'+id);inp.disabled=true;inp.className='inp '+(kor?'ok':'no');
|
||||
let br=inp.parentElement.querySelector('.br');if(br)br.remove();
|
||||
if(!kor){
|
||||
let m=meta[id];
|
||||
if(m&&m.h===0){
|
||||
m.h=1;let cd=inp.closest('.cd');
|
||||
let ht=document.createElement('div');ht.className='ht sh';
|
||||
ht.innerHTML='💡 提示: '+getHintText(q)+'<br><span class="rt" onclick="retryFill(\''+id+'\')">🔄 再试一次</span><span style="margin-left:8px" class="rt" onclick="showFullExp(\''+id+'\')">👀 看解析</span>';
|
||||
cd.appendChild(ht);return;
|
||||
}
|
||||
}
|
||||
let fb=document.createElement('div');
|
||||
fb.className='fb sh '+(kor?'go':'bd');
|
||||
fb.innerHTML=(kor?'✅ PERFECT! 完美通过!':'❌ MISS! 再练练!')+'<br><strong>🔧 维修站解析:</strong>'+q.exp;
|
||||
if(!kor)fb.innerHTML+='<br><strong>正确赛道路线:</strong>'+q.ans;
|
||||
inp.parentElement.appendChild(fb);
|
||||
if(!kor){
|
||||
let sims=getSimQuestions(q,3);
|
||||
if(sims.length){
|
||||
let cd=inp.closest('.cd');let sdiv=document.createElement('div');sdiv.className='sim sh';
|
||||
let shtml='<span class="tp2">🏎 关联练习(同题型巩固)</span>';
|
||||
sims.forEach((sq,si)=>{
|
||||
shtml+='<div class="st">'+(si+1)+'. '+sq.stem.replace(/\n/g,'<br>')+'</div>';
|
||||
if(sq.type==='choice'){shtml+='<div class="opts">';sq.opts.forEach((o,j)=>{let c='op';shtml+='<button class="'+c+'" onclick="cli(\''+sq.id+'\','+j+')" id="oc'+sq.id+'_'+j+'">'+o+'</button>';});shtml+='</div>';}
|
||||
else{shtml+='<input class="inp" id="ip'+sq.id+'" placeholder="输入答案..."><div class="br"><button class="cf" onclick="cfil(\''+sq.id+'\')">🏎 确认</button><button class="sh" onclick="skip(\''+sq.id+'\')">👀 解析</button></div>';}
|
||||
});
|
||||
sdiv.innerHTML=shtml;cd.appendChild(sdiv);
|
||||
}
|
||||
}
|
||||
upd();
|
||||
}
|
||||
function retryFill(id){
|
||||
delete conv[id];let el=document.querySelector('.cd:has(.ht)');
|
||||
if(el){let q=Q.find(x=>x.id===id);if(q)el.outerHTML=renderCard(q,0,true);}
|
||||
upd();
|
||||
}
|
||||
function skip(id){
|
||||
conv[id]='__s__';recAns(id,false);
|
||||
let inp=$('ip'+id);if(inp){inp.disabled=true;inp.className='inp no';inp.value='正确路线: '+Q.find(x=>x.id===id).ans;}
|
||||
let br=document.querySelector('#ip'+id)?.parentElement?.querySelector('.br');if(br)br.remove();
|
||||
let fb=document.createElement('div');fb.className='fb sh inf';
|
||||
fb.innerHTML='<strong>🔧 维修站解析:</strong>'+Q.find(x=>x.id===id).exp;
|
||||
let inp2=$('ip'+id);if(inp2)inp2.parentElement.appendChild(fb);
|
||||
upd();
|
||||
}
|
||||
function resetQ(id){
|
||||
delete conv[id];
|
||||
if(mode==='wrong'||mode==='review'){r();return}
|
||||
let q=Q.find(x=>x.id===id);if(!q)return;
|
||||
let el=document.querySelector('.cd:has(.retry[data-id="'+id+'"])');
|
||||
if(el)el.outerHTML=renderCard(q,0);
|
||||
upd();
|
||||
}
|
||||
function resetAll(){
|
||||
if(!confirm('确定清除所有学习进度(含SRS数据和每日统计)?'))return;
|
||||
conv={};meta={};daily={};lastMilestone=-1;streak=0;lastDate='';
|
||||
try{localStorage.removeItem('f1_data');localStorage.removeItem('f1_conv');}catch(e){}
|
||||
r();
|
||||
}
|
||||
// === PIT STOP ===
|
||||
function ckin(){
|
||||
let done=Object.keys(conv).length,total=Q.length,cor=0;
|
||||
Object.keys(conv).forEach(k=>{let q=Q.find(x=>x.id===k);if(!q)return;if(conv[k]===q.ans)cor++;});
|
||||
let wr=getWrongIds().length;
|
||||
let t=new Date().toISOString().slice(0,10);let todayDone=daily[t]||0;
|
||||
let allDone=done===total;let mastery=ovrM();
|
||||
let msg=allDone?'🎉 恭喜你完成所有赛段!<br>总正确率 '+Math.round(cor/total*100)+'%<br>知识点掌握度 '+mastery+'%<br>🏆 你已经是F1知识冠军了!':
|
||||
'已完成 '+done+'/'+total+' 题<br>正确 '+cor+'/'+done+' 题<br>错题 '+wr+' 题<br>今日已完成 '+todayDone+' 题<br>🔥 连续学习 '+streak+' 天<br>🎯 目标 '+goal+'题/天<br>继续冲刺!🏎';
|
||||
$('mb').textContent=allDone?'🏆':'🏎';
|
||||
$('mt').textContent=allDone?'冠军冲线!':'PIT STOP';
|
||||
$('mbd').innerHTML=msg;
|
||||
$('mo').className='mo sh';
|
||||
if(allDone)startConfetti('grand');
|
||||
}
|
||||
function cm(){$('mo').className='mo';}
|
||||
// ===== CONFETTI =====
|
||||
let particles=[],confettiAnimId=null;
|
||||
function startConfetti(level){
|
||||
AUDIO.milestone(level);
|
||||
let canvas=$('confetti-canvas');if(!canvas)return;
|
||||
let ctx=canvas.getContext('2d');
|
||||
canvas.width=window.innerWidth;canvas.height=window.innerHeight;
|
||||
let count=level==='grand'?200:80;
|
||||
let colors=['#e63946','#ffd166','#52b788','#ff6b6b','#ff9f43','#54a0ff','#5f27cd','#01a3a4'];
|
||||
for(let i=0;i<count;i++){particles.push({x:Math.random()*canvas.width,y:Math.random()*canvas.height-canvas.height,w:Math.random()*10+5,h:Math.random()*6+3,vx:(Math.random()-0.5)*3,vy:Math.random()*3+2,rot:Math.random()*360,rotSpeed:(Math.random()-0.5)*10,color:colors[Math.floor(Math.random()*colors.length)],life:1});}
|
||||
if(!confettiAnimId)animateConfetti();
|
||||
}
|
||||
function animateConfetti(){
|
||||
let canvas=$('confetti-canvas');if(!canvas)return;
|
||||
let ctx=canvas.getContext('2d');ctx.clearRect(0,0,canvas.width,canvas.height);
|
||||
let alive=false;
|
||||
particles.forEach(p=>{p.x+=p.vx;p.y+=p.vy;p.vy+=0.05;p.rot+=p.rotSpeed;p.life-=0.003;if(p.life<=0||p.y>canvas.height+20)return;alive=true;ctx.save();ctx.translate(p.x,p.y);ctx.rotate(p.rot*Math.PI/180);ctx.globalAlpha=Math.max(0,p.life);ctx.fillStyle=p.color;ctx.fillRect(-p.w/2,-p.h/2,p.w,p.h);ctx.restore();});
|
||||
if(alive){confettiAnimId=requestAnimationFrame(animateConfetti);}else{confettiAnimId=null;particles=[];ctx.clearRect(0,0,canvas.width,canvas.height);}
|
||||
}
|
||||
window.addEventListener('resize',()=>{let canvas=$('confetti-canvas');if(canvas){canvas.width=window.innerWidth;canvas.height=window.innerHeight;}});
|
||||
window.onload=function(){
|
||||
initData();
|
||||
lastMilestone=Math.floor(Object.keys(conv).length/Q.length*100/10);
|
||||
AUDIO.init();
|
||||
var mb=document.getElementById('muteBtn');
|
||||
if(mb)mb.textContent=AUDIO.muted?'🔇':'🔊';
|
||||
r();
|
||||
}
|
||||
document.addEventListener('click',function _fs(){if(!AUDIO.started){AUDIO.started=true;AUDIO.ensure();if(!AUDIO.muted)AUDIO.startBg();}},{once:true});
|
||||
|
||||
|
||||
// === FEATURE PACK: 知识图谱 + 诊断 + 知识卡 + 自适应 + 模考 ===
|
||||
(function(){
|
||||
if(window.__featurePackLoaded)return;
|
||||
window.__featurePackLoaded=true;
|
||||
|
||||
// ========== 1. 知识图谱 ==========
|
||||
const KG_NODES = {
|
||||
math_num:{id:"math_num",name:"数与计算",sub:"math",level:1,children:["math_calFrac","math_calDec","math_calSimp","math_eq"]},
|
||||
math_calFrac:{id:"math_calFrac",name:"分数计算",sub:"math",level:2,parent:"math_num"},
|
||||
math_calDec:{id:"math_calDec",name:"小数计算",sub:"math",level:2,parent:"math_num"},
|
||||
math_calSimp:{id:"math_calSimp",name:"简算巧算",sub:"math",level:2,parent:"math_num"},
|
||||
math_eq:{id:"math_eq",name:"解方程",sub:"math",level:2,parent:"math_num"},
|
||||
math_app:{id:"math_app",name:"应用题",sub:"math",level:1,children:["math_travel","math_eng","math_niucao","math_yingkui","math_conc","math_jitu","math_nr","math_percent","math_age","math_zhouqi","math_clock","math_zhiwei","math_rongchi","math_fangzhen"]},
|
||||
math_travel:{id:"math_travel",name:"行程问题",sub:"math",level:2,parent:"math_app"},
|
||||
math_eng:{id:"math_eng",name:"工程问题",sub:"math",level:2,parent:"math_app"},
|
||||
math_niucao:{id:"math_niucao",name:"牛吃草问题",sub:"math",level:2,parent:"math_app"},
|
||||
math_yingkui:{id:"math_yingkui",name:"盈亏问题",sub:"math",level:2,parent:"math_app"},
|
||||
math_conc:{id:"math_conc",name:"浓度问题",sub:"math",level:2,parent:"math_app"},
|
||||
math_jitu:{id:"math_jitu",name:"鸡兔同笼",sub:"math",level:2,parent:"math_app"},
|
||||
math_nr:{id:"math_nr",name:"利润/折扣",sub:"math",level:2,parent:"math_app"},
|
||||
math_percent:{id:"math_percent",name:"百分数",sub:"math",level:2,parent:"math_app"},
|
||||
math_age:{id:"math_age",name:"年龄/逻辑",sub:"math",level:2,parent:"math_app"},
|
||||
math_zhouqi:{id:"math_zhouqi",name:"周期问题",sub:"math",level:2,parent:"math_app"},
|
||||
math_clock:{id:"math_clock",name:"时钟问题",sub:"math",level:2,parent:"math_app"},
|
||||
math_zhiwei:{id:"math_zhiwei",name:"最值问题",sub:"math",level:2,parent:"math_app"},
|
||||
math_rongchi:{id:"math_rongchi",name:"容斥原理",sub:"math",level:2,parent:"math_app"},
|
||||
math_fangzhen:{id:"math_fangzhen",name:"方阵问题",sub:"math",level:2,parent:"math_app"},
|
||||
math_geo:{id:"math_geo",name:"图形几何",sub:"math",level:1,children:["math_plane","math_solid","math_angle","math_comb","math_ratio"]},
|
||||
math_plane:{id:"math_plane",name:"平面图形",sub:"math",level:2,parent:"math_geo"},
|
||||
math_solid:{id:"math_solid",name:"立体图形",sub:"math",level:2,parent:"math_geo"},
|
||||
math_angle:{id:"math_angle",name:"角度计算",sub:"math",level:2,parent:"math_geo"},
|
||||
math_comb:{id:"math_comb",name:"组合图形",sub:"math",level:2,parent:"math_geo"},
|
||||
math_ratio:{id:"math_ratio",name:"比与比例",sub:"math",level:2,parent:"math_geo"},
|
||||
math_other:{id:"math_other",name:"其他",sub:"math",level:1,children:["math_pattern","math_stat"]},
|
||||
math_pattern:{id:"math_pattern",name:"找规律",sub:"math",level:2,parent:"math_other"},
|
||||
math_stat:{id:"math_stat",name:"统计与概率",sub:"math",level:2,parent:"math_other"},
|
||||
chi_basic:{id:"chi_basic",name:"字词基础",sub:"chinese",level:1,children:["chi_pinyin","chi_error","chi_idiom","chi_syno"]},
|
||||
chi_pinyin:{id:"chi_pinyin",name:"拼音字音",sub:"chinese",level:2,parent:"chi_basic"},
|
||||
chi_error:{id:"chi_error",name:"错别字",sub:"chinese",level:2,parent:"chi_basic"},
|
||||
chi_idiom:{id:"chi_idiom",name:"成语运用",sub:"chinese",level:2,parent:"chi_basic"},
|
||||
chi_syno:{id:"chi_syno",name:"近反义词",sub:"chinese",level:2,parent:"chi_basic"},
|
||||
chi_sent:{id:"chi_sent",name:"句子表达",sub:"chinese",level:1,children:["chi_bingju","chi_xiuci","chi_paixu"]},
|
||||
chi_bingju:{id:"chi_bingju",name:"修改病句",sub:"chinese",level:2,parent:"chi_sent"},
|
||||
chi_xiuci:{id:"chi_xiuci",name:"修辞手法",sub:"chinese",level:2,parent:"chi_sent"},
|
||||
chi_paixu:{id:"chi_paixu",name:"句子排序",sub:"chinese",level:2,parent:"chi_sent"},
|
||||
chi_lit:{id:"chi_lit",name:"文学文化",sub:"chinese",level:1,children:["chi_poem","chi_classic","chi_liter","chi_modern"]},
|
||||
chi_poem:{id:"chi_poem",name:"古诗文",sub:"chinese",level:2,parent:"chi_lit"},
|
||||
chi_classic:{id:"chi_classic",name:"文言文阅读",sub:"chinese",level:2,parent:"chi_lit"},
|
||||
chi_liter:{id:"chi_liter",name:"文学常识",sub:"chinese",level:2,parent:"chi_lit"},
|
||||
chi_modern:{id:"chi_modern",name:"现代文阅读",sub:"chinese",level:2,parent:"chi_lit"},
|
||||
eng_grammar:{id:"eng_grammar",name:"语法",sub:"english",level:1,children:["eng_tense","eng_voice","eng_modal","eng_noun","eng_art","eng_pron","eng_prep","eng_adj","eng_there"]},
|
||||
eng_tense:{id:"eng_tense",name:"时态",sub:"english",level:2,parent:"eng_grammar",children:["eng_pres","eng_past","eng_fut","eng_perf","eng_prog"]},
|
||||
eng_pres:{id:"eng_pres",name:"一般现在时",sub:"english",level:3,parent:"eng_tense"},
|
||||
eng_past:{id:"eng_past",name:"一般过去时",sub:"english",level:3,parent:"eng_tense"},
|
||||
eng_fut:{id:"eng_fut",name:"一般将来时",sub:"english",level:3,parent:"eng_tense"},
|
||||
eng_perf:{id:"eng_perf",name:"现在完成时",sub:"english",level:3,parent:"eng_tense"},
|
||||
eng_prog:{id:"eng_prog",name:"进行时",sub:"english",level:3,parent:"eng_tense"},
|
||||
eng_voice:{id:"eng_voice",name:"被动语态",sub:"english",level:2,parent:"eng_grammar"},
|
||||
eng_modal:{id:"eng_modal",name:"情态动词",sub:"english",level:2,parent:"eng_grammar"},
|
||||
eng_noun:{id:"eng_noun",name:"名词复数",sub:"english",level:2,parent:"eng_grammar"},
|
||||
eng_art:{id:"eng_art",name:"冠词",sub:"english",level:2,parent:"eng_grammar"},
|
||||
eng_pron:{id:"eng_pron",name:"代词",sub:"english",level:2,parent:"eng_grammar"},
|
||||
eng_prep:{id:"eng_prep",name:"介词疑问词",sub:"english",level:2,parent:"eng_grammar"},
|
||||
eng_adj:{id:"eng_adj",name:"比较级",sub:"english",level:2,parent:"eng_grammar"},
|
||||
eng_there:{id:"eng_there",name:"There be",sub:"english",level:2,parent:"eng_grammar"},
|
||||
eng_other:{id:"eng_other",name:"词汇阅读",sub:"english",level:1,children:["eng_phonics","eng_cloze","eng_read","eng_sentpat"]},
|
||||
eng_phonics:{id:"eng_phonics",name:"语音",sub:"english",level:2,parent:"eng_other"},
|
||||
eng_cloze:{id:"eng_cloze",name:"完形填空",sub:"english",level:2,parent:"eng_other"},
|
||||
eng_read:{id:"eng_read",name:"阅读理解",sub:"english",level:2,parent:"eng_other"},
|
||||
eng_sentpat:{id:"eng_sentpat",name:"句型转换",sub:"english",level:2,parent:"eng_other"}
|
||||
};
|
||||
const TOPIC_KG = {
|
||||
"分数计算":"math_calFrac","简算巧算":"math_calSimp","解方程":"math_eq","分数化小数":"math_calFrac",
|
||||
"行程问题":"math_travel","工程问题":"math_eng","牛吃草问题":"math_niucao","盈亏问题":"math_yingkui",
|
||||
"浓度问题":"math_conc","利润与折扣":"math_nr","百分数":"math_percent",
|
||||
"年龄问题":"math_age","逻辑推理":"math_age","鸡兔同笼":"math_jitu","列方程":"math_eq",
|
||||
"平面图形":"math_plane","立体图形":"math_solid","组合图形":"math_comb","角度计算":"math_angle",
|
||||
"圆柱与圆锥":"math_solid","比与比例":"math_ratio","比例尺":"math_ratio","按比例分配":"math_ratio","化简比":"math_ratio",
|
||||
"找规律":"math_pattern","数列规律":"math_pattern","周期问题":"math_zhouqi",
|
||||
"时钟问题":"math_clock","最值问题":"math_zhiwei","容斥原理":"math_rongchi","方阵问题":"math_fangzhen",
|
||||
"概率":"math_stat","统计图":"math_stat",
|
||||
"整数读写":"math_calDec","小数点移动":"math_calDec","小数与循环小数":"math_calDec","整数与小数读写":"math_calDec",
|
||||
"分数":"math_calFrac","最大公因数与最小公倍数":"math_calFrac","整除":"math_calFrac","质数与因数":"math_calFrac","质数":"math_calFrac",
|
||||
"看拼音写汉字":"chi_pinyin","字音":"chi_pinyin","字音辨析":"chi_pinyin","字音字形":"chi_pinyin",
|
||||
"错别字":"chi_error","成语运用":"chi_idiom","成语故事人物":"chi_idiom",
|
||||
"近义词辨析":"chi_syno","近义词反义词":"chi_syno","反义词":"chi_syno",
|
||||
"修改病句":"chi_bingju","病句修改":"chi_bingju","修辞手法":"chi_xiuci","句子排序":"chi_paixu",
|
||||
"古诗文默写":"chi_poem","古诗鉴赏":"chi_poem","文言文阅读":"chi_classic","文学常识":"chi_liter","现代文阅读":"chi_modern",
|
||||
"一般现在时":"eng_pres","一般过去时":"eng_past","一般将来时":"eng_fut","将来时":"eng_fut","过去时":"eng_past",
|
||||
"现在进行时":"eng_prog","进行时":"eng_prog","过去进行时":"eng_prog","现在完成时":"eng_perf",
|
||||
"被动语态":"eng_voice","情态动词":"eng_modal","名词复数":"eng_noun",
|
||||
"冠词":"eng_art","代词":"eng_pron","介词":"eng_prep","疑问词":"eng_prep","特殊疑问句":"eng_prep","不定代词":"eng_pron",
|
||||
"比较级":"eng_adj","比较级最高级":"eng_adj","there be":"eng_there",
|
||||
"语音":"eng_phonics","完形填空":"eng_cloze","阅读理解":"eng_read","句型转换":"eng_sentpat",
|
||||
"be动词":"eng_grammar","综合填空":"eng_grammar","宾语从句":"eng_grammar"
|
||||
};
|
||||
Q.forEach(function(q){q.kgId=TOPIC_KG[q.topic]||q.sub+"_other";});
|
||||
|
||||
// ========== 2. 弱点诊断 ==========
|
||||
const DIAG_KEY="f1_diag";
|
||||
function getDiag(){try{return JSON.parse(localStorage.getItem(DIAG_KEY))||{};}catch(e){return {};}}
|
||||
function saveDiag(d){localStorage.setItem(DIAG_KEY,JSON.stringify(d));}
|
||||
function trackWrong(q){
|
||||
if(!q||!q.kgId)return;
|
||||
var d=getDiag();if(!d[q.kgId])d[q.kgId]={w:0,t:0};
|
||||
d[q.kgId].w=(d[q.kgId].w||0)+1;d[q.kgId].t=(d[q.kgId].t||0)+1;saveDiag(d);
|
||||
}
|
||||
function trackRight(q){
|
||||
if(!q||!q.kgId)return;
|
||||
var d=getDiag();if(!d[q.kgId])d[q.kgId]={w:0,t:0};
|
||||
d[q.kgId].t=(d[q.kgId].t||0)+1;saveDiag(d);
|
||||
}
|
||||
function getWeakness(kgId){
|
||||
var d=getDiag()[kgId];if(!d||d.t<2)return -1;return d.w/d.t;
|
||||
}
|
||||
function getChildrenWeakness(pid){
|
||||
var n=KG_NODES[pid];if(!n||!n.children)return[];
|
||||
return n.children.map(function(cid){
|
||||
var cn=KG_NODES[cid];if(!cn)return null;
|
||||
var d=getDiag()[cid];var s=(d&&d.t>=2)?(d.w/d.t):-1;
|
||||
return {id:cid,name:cn.name,score:s,total:d?d.t:0};
|
||||
}).filter(function(x){return x!==null;}).sort(function(a,b){return b.score-a.score;});
|
||||
}
|
||||
|
||||
// ========== 3. 知识卡片 ==========
|
||||
const KNOWLEDGE_CARDS={
|
||||
math_travel:{title:"行程问题",c:"相遇:路程和=速度和×时间\\n追及:路程差=速度差×时间\\n流水:顺速=船速+水速 逆速相反\\n过桥:总路程=桥长+车长",col:"#e63946"},
|
||||
math_niucao:{title:"牛吃草",c:"生长=(多总量-少总量)÷(天数差)\\n原有=总量-生长×天数\\n吃不完≤每天生长量",col:"#e63946"},
|
||||
math_yingkui:{title:"盈亏",c:"人数=(盈+亏)÷分配差\\n注意:大盈-小盈、大亏-小亏也是变种",col:"#e63946"},
|
||||
math_plane:{title:"面积公式",c:"S正方形=a² S长方形=ab\\nS三角形=ah÷2 S梯形=(a+b)h÷2\\nS圆=πr² S扇形=πr²×θ/360\\n等底等高:三角形=½平行四边形",col:"#e63946"},
|
||||
math_solid:{title:"体积公式",c:"V正方=a³ V长方=abc\\nV圆柱=πr²h V圆锥=⅓πr²h\\n等底等高:V锥=⅓V柱",col:"#e63946"},
|
||||
math_conc:{title:"浓度",c:"浓度=溶质÷溶液×100%\\n十字交叉法:高-目标:目标-低=低质量:高质量",col:"#e63946"},
|
||||
math_nr:{title:"利润折扣",c:"利润=售价-成本 利润率=利润÷成本\\n折扣=现价÷原价",col:"#e63946"},
|
||||
math_jitu:{title:"鸡兔同笼",c:"假设法:\\n全鸡→多出脚÷(4-2)=兔数\\n全兔→少了脚÷(4-2)=鸡数",col:"#e63946"},
|
||||
math_clock:{title:"时钟问题",c:"分针6°/分 时针0.5°/分\\n追及速度差=5.5°/分\\n夹角=|30h-5.5m|(绝对值)",col:"#e63946"},
|
||||
math_zhouqi:{title:"周期问题",c:"余数法:\\n位置÷周期=组数…余数\\n余数对应周期中的位置",col:"#e63946"},
|
||||
math_rongchi:{title:"容斥原理",c:"两集合:A∪B=A+B-A∩B\\n三集合:A+B+C-(两两交)+三交",col:"#e63946"},
|
||||
math_fangzhen:{title:"方阵",c:"最外层=(边长-1)×4\\n实心=边长²\\n空心=外边长²-内边长²",col:"#e63946"},
|
||||
math_zhiwei:{title:"最值",c:"和定差小积大\\n拆数:尽量拆3,余2加2,余1变2+2",col:"#e63946"},
|
||||
chi_classic:{title:"文言文",c:"三步法:\\n1.通读猜大意\\n2.看注释结合上下文\\n3.字字落实翻译\\n重点:通假字/古今异义/词类活用",col:"#ffd166"},
|
||||
chi_xiuci:{title:"修辞",c:"比喻(像/如) 拟人(赋予物人性)\\n排比(三句以上) 夸张(夸大缩小)\\n对偶(工整) 设问(自问自答)",col:"#ffd166"},
|
||||
chi_poem:{title:"古诗鉴赏",c:"1.看题目+作者→定基调\\n2.抓意象→明含义\\n3.品手法→析效果\\n常见:借景抒情/托物言志/用典",col:"#ffd166"},
|
||||
eng_tense:{title:"时态判断",c:"经常习惯→一般现在\\n过去发生→一般过去\\n计划将来→一般将来\\n此刻进行→现在进行\\n持续到今→现在完成\\n过去某刻在做→过去进行",col:"#52b788"},
|
||||
eng_perf:{title:"现在完成时",c:"have/has+过去分词\\n关键词:already, yet, ever, never, just, since, for\\nbeen to(去过回来) vs gone to(去了没回)",col:"#52b788"},
|
||||
eng_voice:{title:"被动语态",c:"be+过去分词\\n一般现在:am/is/are+done\\n一般过去:was/were+done\\n情态:can/must+be+done",col:"#52b788"},
|
||||
eng_modal:{title:"情态动词",c:"can能力/许可 must必须\\nmay允许/可能 should应该\\nneed需要(needn't不必)\\nmustn't禁止 don't have to不必",col:"#52b788"},
|
||||
eng_art:{title:"冠词",c:"a/an泛指(元音前用an)\\nthe特指/独一无二\\n不用:球类棋类三餐学科\\nby+交通工具不加the",col:"#52b788"},
|
||||
eng_pron:{title:"代词",c:"主I you he she it we they\\n宾me you him her it us them\\n形代my your his her its our their\\n名代mine yours his hers its ours theirs",col:"#52b788"},
|
||||
eng_prep:{title:"介词",c:"at+点 in+月年/早上下 on+具体天/日期\\n方位:in在里面 on接触 above上方 below下方\\n时间:for+段 since+点",col:"#52b788"},
|
||||
eng_adj:{title:"比较级",c:"单音节+er:tall→taller\\n多音节+more:beautiful→more beautiful\\n不规则:good→better→best\\nas+原级+as 和...一样",col:"#52b788"}
|
||||
};
|
||||
function showKnowledgeCard(kgId){
|
||||
var card=KNOWLEDGE_CARDS[kgId];if(!card)return;
|
||||
var existing=document.getElementById("kcModal");if(existing)existing.remove();
|
||||
var modal=document.createElement("div");
|
||||
modal.id="kcModal";
|
||||
modal.style.cssText="position:fixed;z-index:300;inset:0;background:rgba(0,0,0,.7);display:flex;align-items:center;justify-content:center";
|
||||
modal.onclick=function(){modal.remove();};
|
||||
var inner=document.createElement("div");
|
||||
inner.style.cssText="background:linear-gradient(145deg,#16213e,#1a1a3e);border-radius:12px;padding:24px;max-width:380px;width:90%;border:2px solid "+card.col+";position:relative";
|
||||
inner.onclick=function(e){e.stopPropagation();};
|
||||
var t=document.createElement("h3");
|
||||
t.textContent=card.title;
|
||||
t.style.cssText="color:"+card.col+";font-size:16px;margin-bottom:12px;font-family:Orbitron,sans-serif";
|
||||
var c=document.createElement("pre");
|
||||
c.textContent=card.c;
|
||||
c.style.cssText="color:#ddd;font-size:13px;line-height:1.7;white-space:pre-wrap;font-family:inherit";
|
||||
var cb=document.createElement("button");
|
||||
cb.textContent="✕";
|
||||
cb.style.cssText="position:absolute;top:8px;right:12px;background:none;border:none;color:#888;font-size:18px;cursor:pointer";
|
||||
cb.onclick=function(){modal.remove();};
|
||||
inner.appendChild(cb);inner.appendChild(t);inner.appendChild(c);modal.appendChild(inner);
|
||||
document.body.appendChild(modal);
|
||||
}
|
||||
|
||||
// ========== 4. 自适应 ==========
|
||||
function scoreDifficulty(q){
|
||||
var ss={"热身圈":1,"第一赛段":2,"第二赛段":3,"第三赛段":4,"最终圈":5};
|
||||
var base=ss[q.ch]||3;var d=getDiag()[q.kgId];
|
||||
var w=(d&&d.t>=2)?Math.min(d.w/d.t,1):0.5;
|
||||
return base+w*3;
|
||||
}
|
||||
function getAdaptiveQuestions(sub,count){
|
||||
var subset=Q.filter(function(q){return q.sub===sub;});
|
||||
subset.forEach(function(q){q._ad=scoreDifficulty(q);});
|
||||
subset.sort(function(a,b){return b._ad-a._ad;});
|
||||
var top=subset.slice(0,Math.min(count||20,subset.length));
|
||||
for(var i=top.length-1;i>0;i--){var j=Math.floor(Math.random()*(i+1));var t=top[i];top[i]=top[j];top[j]=t;}
|
||||
return top;
|
||||
}
|
||||
|
||||
// ========== 5. 限时模考 ==========
|
||||
var EXAM={active:false,timer:null,timeLeft:0,questions:[],idx:0,score:0,total:0,sub:"math",startTime:0};
|
||||
function startExam(sub,questionCount,minutes){
|
||||
if(EXAM.active)return;
|
||||
EXAM.sub=sub;EXAM.score=0;EXAM.total=0;EXAM.idx=0;EXAM.timeLeft=minutes*60;EXAM.startTime=Date.now();EXAM.active=true;
|
||||
var pool=Q.filter(function(q){return q.sub===sub;});
|
||||
for(var i=pool.length-1;i>0;i--){var j=Math.floor(Math.random()*(i+1));var t=pool[i];pool[i]=pool[j];pool[j]=t;}
|
||||
EXAM.questions=pool.slice(0,Math.min(questionCount||30,pool.length));
|
||||
EXAM.idx=0;
|
||||
showExamUI();showExamQuestion();
|
||||
EXAM.timer=setInterval(examTick,1000);
|
||||
}
|
||||
function examTick(){
|
||||
EXAM.timeLeft--;if(EXAM.timeLeft<=0){clearInterval(EXAM.timer);EXAM.active=false;finishExam();return;}
|
||||
var m=Math.floor(EXAM.timeLeft/60),s=EXAM.timeLeft%60;
|
||||
var el=document.getElementById("examTimer");if(el)el.textContent=m+":"+(s<10?"0":"")+s;
|
||||
}
|
||||
function showExamUI(){
|
||||
var existing=document.getElementById("examOverlay");if(existing)existing.remove();
|
||||
var overlay=document.createElement("div");overlay.id="examOverlay";
|
||||
overlay.style.cssText="position:fixed;z-index:250;inset:0;background:#0f0f23;display:flex;flex-direction:column";
|
||||
var header=document.createElement("div");
|
||||
header.style.cssText="background:linear-gradient(135deg,#0f0f23,#1a1a3e);border-bottom:3px solid #e63946;padding:12px 16px;display:flex;justify-content:space-between;align-items:center";
|
||||
var title=document.createElement("span");
|
||||
title.textContent="🏁 "+{math:"数学",chinese:"语文",english:"英语"}[EXAM.sub]+"模考";
|
||||
title.style.cssText="color:#fff;font-size:16px;font-family:Orbitron,sans-serif";
|
||||
var timer=document.createElement("span");timer.id="examTimer";
|
||||
var m=Math.floor(EXAM.timeLeft/60),s=EXAM.timeLeft%60;
|
||||
timer.textContent=m+":"+(s<10?"0":"")+s;
|
||||
timer.style.cssText="color:#ffd166;font-size:16px;font-family:Orbitron,sans-serif";
|
||||
var progress=document.createElement("span");progress.id="examProgress";
|
||||
progress.textContent=(EXAM.idx+1)+"/"+EXAM.questions.length;
|
||||
progress.style.cssText="color:#888;font-size:12px;font-family:Orbitron,sans-serif";
|
||||
var closeBtn=document.createElement("button");
|
||||
closeBtn.textContent="✕ 结束";
|
||||
closeBtn.style.cssText="padding:4px 12px;border:1px solid #e63946;border-radius:4px;background:transparent;color:#e63946;cursor:pointer;font-family:Orbitron,sans-serif;font-size:10px";
|
||||
closeBtn.onclick=function(){clearInterval(EXAM.timer);EXAM.active=false;document.getElementById("examOverlay").remove();};
|
||||
header.appendChild(title);header.appendChild(progress);header.appendChild(timer);header.appendChild(closeBtn);
|
||||
var body=document.createElement("div");body.id="examBody";
|
||||
body.style.cssText="flex:1;overflow-y:auto;padding:12px;max-width:760px;margin:0 auto;width:100%";
|
||||
overlay.appendChild(header);overlay.appendChild(body);document.body.appendChild(overlay);
|
||||
}
|
||||
function showExamQuestion(){
|
||||
var body=document.getElementById("examBody");if(!body)return;
|
||||
if(EXAM.idx>=EXAM.questions.length){finishExam();return;}
|
||||
var q=EXAM.questions[EXAM.idx];
|
||||
var p=document.getElementById("examProgress");if(p)p.textContent=(EXAM.idx+1)+"/"+EXAM.questions.length;
|
||||
body.innerHTML="";
|
||||
var card=document.createElement("div");
|
||||
card.style.cssText="background:linear-gradient(145deg,#16213e,#1a1a3e);border-radius:8px;padding:16px;border-left:4px solid #e63946";
|
||||
var topic=document.createElement("div");
|
||||
topic.style.cssText="font-size:10px;color:#ffd166;background:rgba(255,209,102,.15);padding:2px 10px;border-radius:2px;display:inline-block";
|
||||
topic.textContent="#"+(EXAM.idx+1)+" "+q.topic;
|
||||
card.appendChild(topic);
|
||||
var stem=document.createElement("div");
|
||||
stem.style.cssText="font-size:15px;line-height:1.7;margin:10px 0;color:#eee;white-space:pre-line";
|
||||
stem.textContent=q.stem;
|
||||
card.appendChild(stem);
|
||||
if(q.type==="choice"&&q.opts){
|
||||
q.opts.forEach(function(opt,i){
|
||||
var btn=document.createElement("button");
|
||||
btn.textContent=opt;
|
||||
btn.style.cssText="display:block;width:100%;text-align:left;padding:10px 14px;margin-bottom:4px;border:2px solid #333;border-radius:4px;background:#1a1a3e;color:#ccc;font-size:14px;cursor:pointer;font-family:inherit";
|
||||
btn.onmouseover=function(){if(this.style.borderColor!=="#2d6a4f"&&this.style.borderColor!=="#e63946"){this.style.borderColor="#e63946";this.style.background="#1f1f45";}};
|
||||
btn.onmouseout=function(){if(this.style.borderColor!=="#2d6a4f"&&this.style.borderColor!=="#e63946"){this.style.borderColor="#333";this.style.background="#1a1a3e";}};
|
||||
btn.onclick=function(){
|
||||
EXAM.total++;
|
||||
if(i===q.ans){EXAM.score++;btn.style.borderColor="#2d6a4f";btn.style.background="#1b4332";btn.style.color="#52b788";trackRight(q);}
|
||||
else{btn.style.borderColor="#e63946";btn.style.background="#4a1c1c";btn.style.color="#ff6b6b";trackWrong(q);var cb=card.querySelectorAll("button")[q.ans];if(cb){cb.style.borderColor="#2d6a4f";cb.style.background="#1b4332";cb.style.color="#52b788";}}
|
||||
card.querySelectorAll("button").forEach(function(b){b.style.pointerEvents="none";});
|
||||
setTimeout(function(){EXAM.idx++;showExamQuestion();},1200);
|
||||
};
|
||||
card.appendChild(btn);
|
||||
});
|
||||
}
|
||||
body.appendChild(card);
|
||||
}
|
||||
function finishExam(){
|
||||
clearInterval(EXAM.timer);EXAM.active=false;
|
||||
var body=document.getElementById("examBody");if(!body)return;
|
||||
var pct=EXAM.total>0?Math.round(EXAM.score/EXAM.total*100):0;
|
||||
body.innerHTML="<div style='text-align:center;padding:40px 20px'>"+
|
||||
"<div style='font-size:50px;margin-bottom:10px'>"+(pct>=80?"🏆":pct>=50?"👍":"💪")+"</div>"+
|
||||
"<h3 style='color:#ffd166;font-size:18px;font-family:Orbitron,sans-serif'>模考完成!</h3>"+
|
||||
"<p style='color:#eee;font-size:16px'>得分:"+EXAM.score+"/"+EXAM.total+"("+pct+"%)</p>"+
|
||||
"<p style='color:#888;font-size:12px'>用时:"+Math.round((Date.now()-EXAM.startTime)/1000)+"秒</p>"+
|
||||
"<button onclick='document.getElementById(\"examOverlay\").remove()' style='margin-top:20px;padding:10px 30px;border:none;border-radius:4px;background:#e63946;color:#fff;font-size:14px;cursor:pointer;font-family:inherit'>返回</button></div>";
|
||||
}
|
||||
|
||||
// ========== 6. 诊断面板 ==========
|
||||
function injectDiagnosisPanel(){
|
||||
var rp=document.getElementById("rp");if(!rp)return;
|
||||
var panel=document.createElement("div");
|
||||
panel.style.cssText="margin-top:16px;border-top:1px solid #333;padding-top:12px";
|
||||
var title=document.createElement("div");
|
||||
title.textContent="📊 薄弱知识点诊断";
|
||||
title.style.cssText="color:#ffd166;font-size:14px;margin-bottom:10px;font-weight:600";
|
||||
panel.appendChild(title);
|
||||
var subs=["math","chinese","english"],sn={"math":"数学","chinese":"语文","english":"英语"},sc={"math":"#e63946","chinese":"#ffd166","english":"#52b788"};
|
||||
subs.forEach(function(s){
|
||||
var h=document.createElement("div");
|
||||
h.textContent=sn[s];
|
||||
h.style.cssText="color:"+sc[s]+";font-size:12px;margin:8px 0 4px;font-weight:600";
|
||||
panel.appendChild(h);
|
||||
var l1=Object.values(KG_NODES).filter(function(n){return n.sub===s&&n.level===1;});
|
||||
l1.forEach(function(node){
|
||||
if(!node.children)return;
|
||||
var children=getChildrenWeakness(node.id);
|
||||
var wc=children.filter(function(c){return c.score>=0;}).slice(0,3);
|
||||
if(wc.length===0)return;
|
||||
var row=document.createElement("div");
|
||||
row.style.cssText="font-size:11px;color:#aaa;padding:2px 0;display:flex;align-items:center;gap:6px";
|
||||
var ns=document.createElement("span");
|
||||
ns.textContent=node.name+":";ns.style.cssText="width:65px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#888";
|
||||
var bw=document.createElement("div");bw.style.cssText="flex:1;height:6px;background:#333;border-radius:3px;overflow:hidden";
|
||||
var wk=wc[0];var fill=document.createElement("div");
|
||||
fill.style.cssText="height:100%;border-radius:3px;width:"+Math.round(wk.score*100)+"%;background:"+(wk.score>0.5?"#e63946":"#ffd166")+";transition:width .5s";
|
||||
bw.appendChild(fill);
|
||||
var lb=document.createElement("span");
|
||||
lb.textContent=wk.name+" "+Math.round(wk.score*100)+"%";
|
||||
lb.style.cssText="width:90px;text-align:right;color:#888;font-size:10px";
|
||||
var kb=document.createElement("button");
|
||||
kb.textContent="📖";kb.style.cssText="border:none;background:none;cursor:pointer;font-size:12px;padding:0";
|
||||
kb.onclick=function(){showKnowledgeCard(wk.id);};
|
||||
row.appendChild(ns);row.appendChild(bw);row.appendChild(lb);row.appendChild(kb);
|
||||
panel.appendChild(row);
|
||||
});
|
||||
});
|
||||
rp.appendChild(panel);
|
||||
}
|
||||
|
||||
// ========== 7. 注入Exam按钮 ==========
|
||||
function createExamPicker(){
|
||||
var ep=document.getElementById("ep");if(!ep||ep.querySelector(".exam-custom"))return;
|
||||
var t=document.createElement("div");
|
||||
t.style.cssText="color:#888;font-size:10px;width:100%;margin-bottom:4px;font-family:Orbitron,sans-serif";
|
||||
t.textContent="🏎 智能模考 20题/10分钟";
|
||||
ep.appendChild(t);
|
||||
["math","chinese","english"].forEach(function(s){
|
||||
var btn=document.createElement("button");btn.className="exam-custom";
|
||||
btn.textContent={math:"数学",chinese:"语文",english:"英语"}[s];
|
||||
btn.style.cssText="flex:1;padding:6px;border:1px solid #e63946;border-radius:4px;font-size:10px;cursor:pointer;background:transparent;color:#fff;font-family:Orbitron,sans-serif";
|
||||
btn.onmouseover=function(){this.style.background="rgba(230,57,70,.2)";};
|
||||
btn.onmouseout=function(){this.style.background="transparent";};
|
||||
btn.onclick=function(){if(EXAM.active){alert("考试进行中");return;}startExam(s,20,10);};
|
||||
ep.appendChild(btn);
|
||||
});
|
||||
}
|
||||
|
||||
// ========== 8. 增强题目卡片 ==========
|
||||
function enhanceQuestionCards(){
|
||||
document.querySelectorAll(".cd").forEach(function(card){
|
||||
if(card.querySelector(".kc-btn"))return;
|
||||
var tp=card.querySelector(".tp");if(!tp)return;
|
||||
var topic=tp.textContent.replace(/^.+?([\u4e00-\u9fff]+).*$/,"$1").trim();
|
||||
var kgId=TOPIC_KG[topic];if(!kgId||!KNOWLEDGE_CARDS[kgId])return;
|
||||
var btn=document.createElement("button");btn.className="kc-btn";
|
||||
btn.textContent="📖";btn.title="查看"+topic+"知识点";
|
||||
btn.style.cssText="display:inline-block;padding:1px 8px;margin-left:6px;border:1px solid #555;border-radius:10px;font-size:9px;cursor:pointer;background:transparent;color:#888;font-family:Orbitron,sans-serif;vertical-align:middle";
|
||||
btn.onmouseover=function(){this.style.borderColor="#ffd166";this.style.color="#ffd166";};
|
||||
btn.onmouseout=function(){this.style.borderColor="#555";this.style.color="#888";};
|
||||
btn.onclick=function(){showKnowledgeCard(kgId);};
|
||||
tp.appendChild(btn);
|
||||
});
|
||||
}
|
||||
|
||||
// ========== 9. 初始化 ==========
|
||||
window.addEventListener("load",function(){
|
||||
setTimeout(function(){
|
||||
createExamPicker();enhanceQuestionCards();injectDiagnosisPanel();
|
||||
var mb2=document.getElementById("mb2");
|
||||
if(mb2&&!document.getElementById("examStartBtn")){
|
||||
var eb=document.createElement("button");eb.id="examStartBtn";
|
||||
eb.textContent="🏎 模考";
|
||||
eb.style.cssText="flex:0 0 auto;padding:5px 12px;border:1px solid #ff6b6b;border-radius:14px;font-size:10px;cursor:pointer;background:transparent;color:#ff6b6b;white-space:nowrap;font-family:Orbitron,sans-serif;font-weight:600";
|
||||
eb.onmouseover=function(){this.style.background="rgba(230,57,70,.15)";};
|
||||
eb.onmouseout=function(){this.style.background="transparent";};
|
||||
eb.onclick=function(){var sub=window.__currentSub||"math";if(EXAM.active){alert("考试进行中");return;}startExam(sub,20,10);};
|
||||
mb2.appendChild(eb);
|
||||
}
|
||||
},500);
|
||||
});
|
||||
})();
|
||||
|
||||
// === F1 情绪价值引擎:分站赛体验 ===
|
||||
|
||||
// Auto-enhance on question render
|
||||
var _renderObserver = new MutationObserver(function() { setTimeout(function() { try { enhanceQuestionCards(); } catch(e) {} }, 50); });
|
||||
var _target = document.getElementById("mn") || document.body;
|
||||
_renderObserver.observe(_target, { childList: true, subtree: true });
|
||||
setTimeout(function() { try { enhanceQuestionCards(); } catch(e) {} }, 200);(function() {
|
||||
if (window.__f1EmotionLoaded) return;
|
||||
window.__f1EmotionLoaded = true;
|
||||
|
||||
// ========== 1. Team Radio 系统 ==========
|
||||
const TEAM_RADIO = {
|
||||
correct: [
|
||||
"Box box box — great answer! Keep pushing! 🏁",
|
||||
"Max, you're P1! Fantastic pace! ⚡",
|
||||
"That's P1 material! 🏆",
|
||||
"Simply lovely, simply lovely! 🎯",
|
||||
"You're on fire! 🔥",
|
||||
"DRS enabled — you're flying! 🚀",
|
||||
"Purple sector! Stunning! 💜",
|
||||
"Through goes Hamilton! No wait, that's YOU! 🤩",
|
||||
"No mistakes, perfect lap! ✨",
|
||||
"You're pulling away from the pack! 💪",
|
||||
"Fastest lap of the race so far! ⏱️",
|
||||
"Great strat call — that answer was bold! 🧠",
|
||||
"You've got the pace, keep it clean! 🏎️",
|
||||
"That was inch-perfect! 🎯",
|
||||
"P1 for you, champ! 👑"
|
||||
],
|
||||
streak3: [
|
||||
"Three in a row — you're on for a Grand Slam! 🏁",
|
||||
"Hat-trick! The crowd is on their feet! 🎪",
|
||||
"Triple purple sectors! Unstoppable! 💜💜💜"
|
||||
],
|
||||
streak5: [
|
||||
"FIVE IN A ROW — DOMINATION! 🏆",
|
||||
"This is champion-level consistency! 👑",
|
||||
"You're lapping the field! 🔥🔥🔥"
|
||||
],
|
||||
wrong: [
|
||||
"Box box, we need a strategy adjustment... 📋",
|
||||
"Not your sector, keep pushing! 💪",
|
||||
"Tricky conditions out there, stay focused! 🧠",
|
||||
"That was a gamble, onto the next one! 🎲",
|
||||
"Pit wall here — we'll get 'em next lap! 🏁"
|
||||
]
|
||||
};
|
||||
|
||||
function showTeamRadio(type) {
|
||||
const el = document.getElementById("f1TeamRadio");
|
||||
if (!el) return;
|
||||
let msgs;
|
||||
if (type === "streak5") msgs = TEAM_RADIO.streak5;
|
||||
else if (type === "streak3") msgs = TEAM_RADIO.streak3;
|
||||
else if (type === "correct") msgs = TEAM_RADIO.correct;
|
||||
else msgs = TEAM_RADIO.wrong;
|
||||
const msg = msgs[Math.floor(Math.random() * msgs.length)];
|
||||
el.textContent = "🔊 " + msg;
|
||||
el.className = "f1-radio-show";
|
||||
el.style.color = type === "wrong" ? "#ff6b6b" : "#52b788";
|
||||
clearTimeout(el._timer);
|
||||
el._timer = setTimeout(function() {
|
||||
el.className = "f1-radio-hide";
|
||||
}, 3500);
|
||||
}
|
||||
|
||||
// ========== 2. Sector Timing ==========
|
||||
let sectorTimer = {start:0, qid:null};
|
||||
const fastLap = {math:null, chinese:null, english:null};
|
||||
|
||||
function startSectorTimer(qid) {
|
||||
sectorTimer.start = performance.now();
|
||||
sectorTimer.qid = qid;
|
||||
}
|
||||
|
||||
function getSectorTime() {
|
||||
if (!sectorTimer.start) return null;
|
||||
return Math.round((performance.now() - sectorTimer.start) * 10) / 10;
|
||||
}
|
||||
|
||||
function recordFastLap(sub, timeMs) {
|
||||
if (!fastLap[sub] || timeMs < fastLap[sub]) {
|
||||
fastLap[sub] = timeMs;
|
||||
try { localStorage.setItem("f1_fastlap", JSON.stringify(fastLap)); } catch(e) {}
|
||||
}
|
||||
}
|
||||
|
||||
function renderSectors(containerEl, timeMs) {
|
||||
if (!containerEl) return;
|
||||
const total = timeMs;
|
||||
const s1 = total * 0.3; // 读题
|
||||
const s2 = total * 0.4; // 思考
|
||||
const s3 = total * 0.3; // 作答
|
||||
const maxTime = 30000; // 30秒基准
|
||||
|
||||
function sectorColor(t, threshold) {
|
||||
if (t < threshold * 0.5) return "#9147ff"; // 紫(最快)
|
||||
if (t < threshold * 0.8) return "#2d6a4f"; // 绿
|
||||
return "#e6a817"; // 黄
|
||||
}
|
||||
|
||||
containerEl.innerHTML =
|
||||
'<div class="f1-sectors">' +
|
||||
'<div class="f1-sector" style="background:' + sectorColor(s1, maxTime * 0.3) + ';width:30%">' +
|
||||
'<span>S1</span><span>' + (s1 / 1000).toFixed(1) + 's</span>' +
|
||||
'</div>' +
|
||||
'<div class="f1-sector" style="background:' + sectorColor(s2, maxTime * 0.4) + ';width:40%">' +
|
||||
'<span>S2</span><span>' + (s2 / 1000).toFixed(1) + 's</span>' +
|
||||
'</div>' +
|
||||
'<div class="f1-sector" style="background:' + sectorColor(s3, maxTime * 0.3) + ';width:30%">' +
|
||||
'<span>S3</span><span>' + (s3 / 1000).toFixed(1) + 's</span>' +
|
||||
'</div>' +
|
||||
'</div>';
|
||||
}
|
||||
|
||||
// ========== 3. 锦标赛积分系统 ==========
|
||||
let champPoints = 0;
|
||||
function getChampPoints(streak) {
|
||||
const pts = [25,18,15,12,10,8,6,4,2,1];
|
||||
return pts[Math.min(streak, 9)] || 0;
|
||||
}
|
||||
|
||||
function updateChampionshipDisplay() {
|
||||
const el = document.getElementById("f1Champ");
|
||||
if (!el) return;
|
||||
el.textContent = "🏆 " + champPoints + " PTS";
|
||||
}
|
||||
|
||||
// ========== 4. 领奖台动画 ==========
|
||||
function showPodium(level) {
|
||||
// level: 1=练习赛, 2=排位赛, 3=冲刺赛, 4=正赛
|
||||
const levels = ["", "🥉 练习赛完成", "🥈 排位赛晋级", "🥇 冲刺赛取胜", "🏆 分站赛冠军!"];
|
||||
const label = levels[level] || "🏆 恭喜!";
|
||||
|
||||
const mo = document.getElementById("mo");
|
||||
const mb = document.getElementById("mb");
|
||||
const mt = document.getElementById("mt");
|
||||
const mbd = document.getElementById("mbd");
|
||||
if (!mo || !mb || !mt || !mbd) return;
|
||||
|
||||
mt.textContent = label;
|
||||
const pts = level * 25;
|
||||
champPoints += pts;
|
||||
updateChampionshipDisplay();
|
||||
|
||||
const msgs = [
|
||||
"",
|
||||
"完成了练习赛!积累经验,为排位赛做准备! 🏎️",
|
||||
"排位赛晋级!正赛从P1发车! ⚡",
|
||||
"冲刺赛取胜!正赛策略已就位! 🚀",
|
||||
"🏆 分站赛冠军!你是真正的F1知识冠军!香槟时间! 🍾"
|
||||
];
|
||||
mbd.innerHTML = msgs[level] + "<br>+" + pts + " 锦标赛积分!";
|
||||
mb.textContent = level >= 4 ? "🏆 捧杯!" : "下一站 →";
|
||||
|
||||
mo.className = "mo sh";
|
||||
if (level >= 3) startConfetti(level);
|
||||
|
||||
// Save points
|
||||
try { localStorage.setItem("f1_champ", JSON.stringify({pts:champPoints, levels:level})); } catch(e) {}
|
||||
}
|
||||
|
||||
// ========== 5. 奖杯柜(赛道完成状态)=========
|
||||
function renderTrophyCabinet() {
|
||||
const container = document.getElementById("f1Trophies");
|
||||
if (!container) return;
|
||||
|
||||
const stages = ["热身圈","第一赛段","第二赛段","第三赛段","最终圈"];
|
||||
const emojis = ["","🥉","🥈","🥇","🏆"];
|
||||
const stageKeys = ["warmup","q1","q2","q3","race"];
|
||||
|
||||
// Check completion per stage per subject
|
||||
for (const s of ["math","chinese","english"]) {
|
||||
const subQs = Q.filter(function(q) { return q.sub === s; });
|
||||
const subConv = Object.keys(conv).filter(function(id) { return subQs.some(function(q) { return q.id === id; }); });
|
||||
const subCorrect = subConv.filter(function(id) { return conv[id] && Q.find(function(q) { return q.id === id; }) && conv[id] === Q.find(function(q) { return q.id === id; }).ans; }).length;
|
||||
const pct = subQs.length > 0 ? Math.round(subCorrect / subQs.length * 100) : 0;
|
||||
|
||||
const row = document.createElement("div");
|
||||
row.style.cssText = "display:flex;align-items:center;gap:4px;padding:3px 0;font-size:10px";
|
||||
|
||||
const nameSpan = document.createElement("span");
|
||||
nameSpan.textContent = {math:"🏎 MATH",chinese:"📖 CHN",english:"🔤 ENG"}[s];
|
||||
nameSpan.style.cssText = "width:50px;color:#888;font-family:Orbitron,sans-serif;font-size:8px";
|
||||
|
||||
for (let i = 0; i < stages.length; i++) {
|
||||
const stageQs = subQs.filter(function(q) { return q.ch === stages[i]; });
|
||||
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.title = stages[i] + (done ? " ✅" : "");
|
||||
row.appendChild(icon);
|
||||
}
|
||||
|
||||
const pctSpan = document.createElement("span");
|
||||
pctSpan.textContent = pct + "%";
|
||||
pctSpan.style.cssText = "color:" + (pct >= 80 ? "#52b788" : pct >= 50 ? "#ffd166" : "#888") + ";font-family:Orbitron,sans-serif;font-size:8px;width:30px;text-align:right";
|
||||
row.appendChild(pctSpan);
|
||||
|
||||
container.appendChild(row);
|
||||
}
|
||||
}
|
||||
|
||||
// ========== 6. CSS 注入 ==========
|
||||
(function() {
|
||||
const style = document.createElement("style");
|
||||
style.textContent = `
|
||||
/* Team Radio */
|
||||
#f1TeamRadio {
|
||||
position: fixed; bottom: 52px; left: 50%; transform: translateX(-50%);
|
||||
background: rgba(15,15,35,.92); border: 2px solid #e63946;
|
||||
border-radius: 20px; padding: 8px 18px; font-size: 12px;
|
||||
color: #52b788; z-index: 300; white-space: nowrap;
|
||||
font-family: 'Orbitron', sans-serif; letter-spacing: .5px;
|
||||
transition: all .4s cubic-bezier(.25,.46,.45,.94);
|
||||
pointer-events: none;
|
||||
}
|
||||
.f1-radio-show { opacity: 1; transform: translateX(-50%) translateY(0); }
|
||||
.f1-radio-hide { opacity: 0; transform: translateX(-50%) translateY(20px); }
|
||||
|
||||
/* Sector Timing */
|
||||
.f1-sectors { display: flex; gap: 2px; height: 16px; margin: 4px 0; border-radius: 2px; overflow: hidden; }
|
||||
.f1-sector { display: flex; align-items: center; justify-content: center; font-size: 7px; color: #fff; font-family: 'Orbitron',sans-serif; gap: 2px; opacity: 0.9; }
|
||||
.f1-sector span { text-shadow: 0 0 2px rgba(0,0,0,.8); }
|
||||
|
||||
/* Fastest Lap */
|
||||
#f1FastLap { font-size: 9px; color: #9147ff; font-family: 'Orbitron',sans-serif; letter-spacing: .5px; }
|
||||
|
||||
/* Championship */
|
||||
#f1Champ { font-size: 10px; color: #ffd166; font-family: 'Orbitron',sans-serif; }
|
||||
|
||||
/* Trophies */
|
||||
#f1Trophies { padding: 6px 0; }
|
||||
|
||||
/* Flag effect for podium */
|
||||
.f1-flag { position: fixed; top: 0; left: 0; right: 0; bottom: 0;
|
||||
background: repeating-linear-gradient(90deg,
|
||||
rgba(230,57,70,.08) 0, rgba(230,57,70,.08) 20px,
|
||||
rgba(255,255,255,.05) 20px, rgba(255,255,255,.05) 40px);
|
||||
pointer-events: none; z-index: -1; animation: f1-flag-wave 3s ease-in-out infinite; }
|
||||
@keyframes f1-flag-wave {
|
||||
0%,100% { transform: skewX(0); }
|
||||
50% { transform: skewX(2deg); }
|
||||
}
|
||||
`;
|
||||
document.head.appendChild(style);
|
||||
})();
|
||||
|
||||
// ========== 7. UI 注入 ==========
|
||||
(function() {
|
||||
// Team Radio element
|
||||
const radio = document.createElement("div");
|
||||
radio.id = "f1TeamRadio";
|
||||
radio.className = "f1-radio-hide";
|
||||
radio.textContent = "🔊 Starting your engine...";
|
||||
document.body.appendChild(radio);
|
||||
|
||||
// Fastest Lap + Championship in progress bar
|
||||
const pb = document.getElementById("pb") || document.querySelector(".pb");
|
||||
if (pb) {
|
||||
const fl = document.createElement("span");
|
||||
fl.id = "f1FastLap";
|
||||
fl.style.cssText = "margin-left:auto;font-size:9px;color:#9147ff;font-family:Orbitron,sans-serif;letter-spacing:.5px";
|
||||
pb.appendChild(fl);
|
||||
const cp = document.createElement("span");
|
||||
cp.id = "f1Champ";
|
||||
cp.style.cssText = "margin-left:8px;font-size:10px;color:#ffd166;font-family:Orbitron,sans-serif";
|
||||
pb.appendChild(cp);
|
||||
}
|
||||
|
||||
// Trophy cabinet in report
|
||||
const rp = document.getElementById("rp");
|
||||
if (rp) {
|
||||
const title = document.createElement("div");
|
||||
title.style.cssText = "color:#e63946;font-size:13px;margin-top:12px;margin-bottom:4px;font-weight:600;font-family:Orbitron,sans-serif";
|
||||
title.textContent = "🏆 奖杯柜";
|
||||
rp.appendChild(title);
|
||||
const cabinet = document.createElement("div");
|
||||
cabinet.id = "f1Trophies";
|
||||
rp.appendChild(cabinet);
|
||||
}
|
||||
})();
|
||||
|
||||
// ========== 8. Hooks ==========
|
||||
// Hook into recAns (save original reference)
|
||||
const origRecAns = window.recAns || function(){};
|
||||
window.recAns = function(id, ok) {
|
||||
origRecAns(id, ok);
|
||||
|
||||
// Find the question
|
||||
const q = Q.find(function(x) { return x.id === id; });
|
||||
if (!q) return;
|
||||
|
||||
// Sector timing
|
||||
const elapsed = getSectorTime();
|
||||
if (elapsed) {
|
||||
recordFastLap(q.sub, elapsed);
|
||||
const card = document.querySelector('.op.ok,.op.no')?.closest('.cd') || document.querySelector('.cd');
|
||||
if (card) {
|
||||
const existing = card.querySelector(".f1-sectors");
|
||||
if (existing) existing.remove();
|
||||
const sectorEl = document.createElement("div");
|
||||
renderSectors(sectorEl, elapsed);
|
||||
card.appendChild(sectorEl);
|
||||
}
|
||||
}
|
||||
|
||||
// Team Radio
|
||||
if (ok) {
|
||||
const m = meta[id];
|
||||
const cc = m ? m.cc : 0;
|
||||
if (cc >= 5) showTeamRadio("streak5");
|
||||
else if (cc >= 3) showTeamRadio("streak3");
|
||||
else showTeamRadio("correct");
|
||||
|
||||
// Championship points
|
||||
const pts = getChampPoints(cc);
|
||||
champPoints += pts;
|
||||
updateChampionshipDisplay();
|
||||
try { localStorage.setItem("f1_champ", JSON.stringify({pts:champPoints})); } catch(e) {}
|
||||
|
||||
// Check stage completion for podium
|
||||
if (q.ch) {
|
||||
const stageQs = Q.filter(function(x) { return x.sub === q.sub && x.ch === q.ch; });
|
||||
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");
|
||||
setTimeout(function() { showPodium(stageLevel[q.ch] || 1); }, 500);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
showTeamRadio("wrong");
|
||||
}
|
||||
};
|
||||
|
||||
// Hook into render to add sector timer
|
||||
const origR = window.r || function(){};
|
||||
window.r = function() {
|
||||
origR();
|
||||
setTimeout(function() {
|
||||
startSectorTimer(Date.now().toString());
|
||||
var flEl = document.getElementById("f1FastLap");
|
||||
var subFL = fastLap[window.__currentSub] || fastLap.math;
|
||||
if (flEl && subFL) flEl.textContent = "🏁 " + (subFL/1000).toFixed(1) + "s";
|
||||
try {
|
||||
var saved = JSON.parse(localStorage.getItem("f1_champ"));
|
||||
if (saved && saved.pts) { champPoints = saved.pts; updateChampionshipDisplay(); }
|
||||
} catch(e) {}
|
||||
renderTrophyCabinet();
|
||||
}, 100);
|
||||
};// Initial load: restore saved data
|
||||
try {
|
||||
const saved = JSON.parse(localStorage.getItem("f1_fastlap"));
|
||||
if (saved) { Object.assign(fastLap, saved); }
|
||||
} catch(e) {}
|
||||
try {
|
||||
const saved = JSON.parse(localStorage.getItem("f1_champ"));
|
||||
if (saved) { champPoints = saved.pts || 0; }
|
||||
} catch(e) {}
|
||||
|
||||
console.log("🏁 F1 Emotion Engine loaded");
|
||||
})();
|
||||
|
||||
// === F1 情绪价值引擎:分站赛体验 ===
|
||||
(function() {
|
||||
if (window.__f1EmotionLoaded) return;
|
||||
window.__f1EmotionLoaded = true;
|
||||
|
||||
// ========== 1. Team Radio 系统 ==========
|
||||
const TEAM_RADIO = {
|
||||
correct: [
|
||||
"Box box box — great answer! Keep pushing! 🏁",
|
||||
"Max, you're P1! Fantastic pace! ⚡",
|
||||
"That's P1 material! 🏆",
|
||||
"Simply lovely, simply lovely! 🎯",
|
||||
"You're on fire! 🔥",
|
||||
"DRS enabled — you're flying! 🚀",
|
||||
"Purple sector! Stunning! 💜",
|
||||
"Through goes Hamilton! No wait, that's YOU! 🤩",
|
||||
"No mistakes, perfect lap! ✨",
|
||||
"You're pulling away from the pack! 💪",
|
||||
"Fastest lap of the race so far! ⏱️",
|
||||
"Great strat call — that answer was bold! 🧠",
|
||||
"You've got the pace, keep it clean! 🏎️",
|
||||
"That was inch-perfect! 🎯",
|
||||
"P1 for you, champ! 👑"
|
||||
],
|
||||
streak3: [
|
||||
"Three in a row — you're on for a Grand Slam! 🏁",
|
||||
"Hat-trick! The crowd is on their feet! 🎪",
|
||||
"Triple purple sectors! Unstoppable! 💜💜💜"
|
||||
],
|
||||
streak5: [
|
||||
"FIVE IN A ROW — DOMINATION! 🏆",
|
||||
"This is champion-level consistency! 👑",
|
||||
"You're lapping the field! 🔥🔥🔥"
|
||||
],
|
||||
wrong: [
|
||||
"Box box, we need a strategy adjustment... 📋",
|
||||
"Not your sector, keep pushing! 💪",
|
||||
"Tricky conditions out there, stay focused! 🧠",
|
||||
"That was a gamble, onto the next one! 🎲",
|
||||
"Pit wall here — we'll get 'em next lap! 🏁"
|
||||
]
|
||||
};
|
||||
|
||||
function showTeamRadio(type) {
|
||||
const el = document.getElementById("f1TeamRadio");
|
||||
if (!el) return;
|
||||
let msgs;
|
||||
if (type === "streak5") msgs = TEAM_RADIO.streak5;
|
||||
else if (type === "streak3") msgs = TEAM_RADIO.streak3;
|
||||
else if (type === "correct") msgs = TEAM_RADIO.correct;
|
||||
else msgs = TEAM_RADIO.wrong;
|
||||
const msg = msgs[Math.floor(Math.random() * msgs.length)];
|
||||
el.textContent = "🔊 " + msg;
|
||||
el.className = "f1-radio-show";
|
||||
el.style.color = type === "wrong" ? "#ff6b6b" : "#52b788";
|
||||
clearTimeout(el._timer);
|
||||
el._timer = setTimeout(function() {
|
||||
el.className = "f1-radio-hide";
|
||||
}, 3500);
|
||||
}
|
||||
|
||||
// ========== 2. Sector Timing ==========
|
||||
let sectorTimer = {start:0, qid:null};
|
||||
const fastLap = {math:null, chinese:null, english:null};
|
||||
|
||||
function startSectorTimer(qid) {
|
||||
sectorTimer.start = performance.now();
|
||||
sectorTimer.qid = qid;
|
||||
}
|
||||
|
||||
function getSectorTime() {
|
||||
if (!sectorTimer.start) return null;
|
||||
return Math.round((performance.now() - sectorTimer.start) * 10) / 10;
|
||||
}
|
||||
|
||||
function recordFastLap(sub, timeMs) {
|
||||
if (!fastLap[sub] || timeMs < fastLap[sub]) {
|
||||
fastLap[sub] = timeMs;
|
||||
try { localStorage.setItem("f1_fastlap", JSON.stringify(fastLap)); } catch(e) {}
|
||||
}
|
||||
}
|
||||
|
||||
function renderSectors(containerEl, timeMs) {
|
||||
if (!containerEl) return;
|
||||
const total = timeMs;
|
||||
const s1 = total * 0.3; // 读题
|
||||
const s2 = total * 0.4; // 思考
|
||||
const s3 = total * 0.3; // 作答
|
||||
const maxTime = 30000; // 30秒基准
|
||||
|
||||
function sectorColor(t, threshold) {
|
||||
if (t < threshold * 0.5) return "#9147ff"; // 紫(最快)
|
||||
if (t < threshold * 0.8) return "#2d6a4f"; // 绿
|
||||
return "#e6a817"; // 黄
|
||||
}
|
||||
|
||||
containerEl.innerHTML =
|
||||
'<div class="f1-sectors">' +
|
||||
'<div class="f1-sector" style="background:' + sectorColor(s1, maxTime * 0.3) + ';width:30%">' +
|
||||
'<span>S1</span><span>' + (s1 / 1000).toFixed(1) + 's</span>' +
|
||||
'</div>' +
|
||||
'<div class="f1-sector" style="background:' + sectorColor(s2, maxTime * 0.4) + ';width:40%">' +
|
||||
'<span>S2</span><span>' + (s2 / 1000).toFixed(1) + 's</span>' +
|
||||
'</div>' +
|
||||
'<div class="f1-sector" style="background:' + sectorColor(s3, maxTime * 0.3) + ';width:30%">' +
|
||||
'<span>S3</span><span>' + (s3 / 1000).toFixed(1) + 's</span>' +
|
||||
'</div>' +
|
||||
'</div>';
|
||||
}
|
||||
|
||||
// ========== 3. 锦标赛积分系统 ==========
|
||||
let champPoints = 0;
|
||||
function getChampPoints(streak) {
|
||||
const pts = [25,18,15,12,10,8,6,4,2,1];
|
||||
return pts[Math.min(streak, 9)] || 0;
|
||||
}
|
||||
|
||||
function updateChampionshipDisplay() {
|
||||
const el = document.getElementById("f1Champ");
|
||||
if (!el) return;
|
||||
el.textContent = "🏆 " + champPoints + " PTS";
|
||||
}
|
||||
|
||||
// ========== 4. 领奖台动画 ==========
|
||||
function showPodium(level) {
|
||||
// level: 1=练习赛, 2=排位赛, 3=冲刺赛, 4=正赛
|
||||
const levels = ["", "🥉 练习赛完成", "🥈 排位赛晋级", "🥇 冲刺赛取胜", "🏆 分站赛冠军!"];
|
||||
const label = levels[level] || "🏆 恭喜!";
|
||||
|
||||
const mo = document.getElementById("mo");
|
||||
const mb = document.getElementById("mb");
|
||||
const mt = document.getElementById("mt");
|
||||
const mbd = document.getElementById("mbd");
|
||||
if (!mo || !mb || !mt || !mbd) return;
|
||||
|
||||
mt.textContent = label;
|
||||
const pts = level * 25;
|
||||
champPoints += pts;
|
||||
updateChampionshipDisplay();
|
||||
|
||||
const msgs = [
|
||||
"",
|
||||
"完成了练习赛!积累经验,为排位赛做准备! 🏎️",
|
||||
"排位赛晋级!正赛从P1发车! ⚡",
|
||||
"冲刺赛取胜!正赛策略已就位! 🚀",
|
||||
"🏆 分站赛冠军!你是真正的F1知识冠军!香槟时间! 🍾"
|
||||
];
|
||||
mbd.innerHTML = msgs[level] + "<br>+" + pts + " 锦标赛积分!";
|
||||
mb.textContent = level >= 4 ? "🏆 捧杯!" : "下一站 →";
|
||||
|
||||
mo.className = "mo sh";
|
||||
if (level >= 3) startConfetti(level);
|
||||
|
||||
// Save points
|
||||
try { localStorage.setItem("f1_champ", JSON.stringify({pts:champPoints, levels:level})); } catch(e) {}
|
||||
}
|
||||
|
||||
// ========== 5. 奖杯柜(赛道完成状态)=========
|
||||
function renderTrophyCabinet() {
|
||||
const container = document.getElementById("f1Trophies");
|
||||
if (!container) return;
|
||||
|
||||
const stages = ["热身圈","第一赛段","第二赛段","第三赛段","最终圈"];
|
||||
const emojis = ["","🥉","🥈","🥇","🏆"];
|
||||
const stageKeys = ["warmup","q1","q2","q3","race"];
|
||||
|
||||
// Check completion per stage per subject
|
||||
for (const s of ["math","chinese","english"]) {
|
||||
const subQs = Q.filter(function(q) { return q.sub === s; });
|
||||
const subConv = Object.keys(conv).filter(function(id) { return subQs.some(function(q) { return q.id === id; }); });
|
||||
const subCorrect = subConv.filter(function(id) { return conv[id] && Q.find(function(q) { return q.id === id; }) && conv[id] === Q.find(function(q) { return q.id === id; }).ans; }).length;
|
||||
const pct = subQs.length > 0 ? Math.round(subCorrect / subQs.length * 100) : 0;
|
||||
|
||||
const row = document.createElement("div");
|
||||
row.style.cssText = "display:flex;align-items:center;gap:4px;padding:3px 0;font-size:10px";
|
||||
|
||||
const nameSpan = document.createElement("span");
|
||||
nameSpan.textContent = {math:"🏎 MATH",chinese:"📖 CHN",english:"🔤 ENG"}[s];
|
||||
nameSpan.style.cssText = "width:50px;color:#888;font-family:Orbitron,sans-serif;font-size:8px";
|
||||
|
||||
for (let i = 0; i < stages.length; i++) {
|
||||
const stageQs = subQs.filter(function(q) { return q.ch === stages[i]; });
|
||||
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.title = stages[i] + (done ? " ✅" : "");
|
||||
row.appendChild(icon);
|
||||
}
|
||||
|
||||
const pctSpan = document.createElement("span");
|
||||
pctSpan.textContent = pct + "%";
|
||||
pctSpan.style.cssText = "color:" + (pct >= 80 ? "#52b788" : pct >= 50 ? "#ffd166" : "#888") + ";font-family:Orbitron,sans-serif;font-size:8px;width:30px;text-align:right";
|
||||
row.appendChild(pctSpan);
|
||||
|
||||
container.appendChild(row);
|
||||
}
|
||||
}
|
||||
|
||||
// ========== 6. CSS 注入 ==========
|
||||
(function() {
|
||||
const style = document.createElement("style");
|
||||
style.textContent = `
|
||||
/* Team Radio */
|
||||
#f1TeamRadio {
|
||||
position: fixed; bottom: 52px; left: 50%; transform: translateX(-50%);
|
||||
background: rgba(15,15,35,.92); border: 2px solid #e63946;
|
||||
border-radius: 20px; padding: 8px 18px; font-size: 12px;
|
||||
color: #52b788; z-index: 300; white-space: nowrap;
|
||||
font-family: 'Orbitron', sans-serif; letter-spacing: .5px;
|
||||
transition: all .4s cubic-bezier(.25,.46,.45,.94);
|
||||
pointer-events: none;
|
||||
}
|
||||
.f1-radio-show { opacity: 1; transform: translateX(-50%) translateY(0); }
|
||||
.f1-radio-hide { opacity: 0; transform: translateX(-50%) translateY(20px); }
|
||||
|
||||
/* Sector Timing */
|
||||
.f1-sectors { display: flex; gap: 2px; height: 16px; margin: 4px 0; border-radius: 2px; overflow: hidden; }
|
||||
.f1-sector { display: flex; align-items: center; justify-content: center; font-size: 7px; color: #fff; font-family: 'Orbitron',sans-serif; gap: 2px; opacity: 0.9; }
|
||||
.f1-sector span { text-shadow: 0 0 2px rgba(0,0,0,.8); }
|
||||
|
||||
/* Fastest Lap */
|
||||
#f1FastLap { font-size: 9px; color: #9147ff; font-family: 'Orbitron',sans-serif; letter-spacing: .5px; }
|
||||
|
||||
/* Championship */
|
||||
#f1Champ { font-size: 10px; color: #ffd166; font-family: 'Orbitron',sans-serif; }
|
||||
|
||||
/* Trophies */
|
||||
#f1Trophies { padding: 6px 0; }
|
||||
|
||||
/* Flag effect for podium */
|
||||
.f1-flag { position: fixed; top: 0; left: 0; right: 0; bottom: 0;
|
||||
background: repeating-linear-gradient(90deg,
|
||||
rgba(230,57,70,.08) 0, rgba(230,57,70,.08) 20px,
|
||||
rgba(255,255,255,.05) 20px, rgba(255,255,255,.05) 40px);
|
||||
pointer-events: none; z-index: -1; animation: f1-flag-wave 3s ease-in-out infinite; }
|
||||
@keyframes f1-flag-wave {
|
||||
0%,100% { transform: skewX(0); }
|
||||
50% { transform: skewX(2deg); }
|
||||
}
|
||||
`;
|
||||
document.head.appendChild(style);
|
||||
})();
|
||||
|
||||
// ========== 7. UI 注入 ==========
|
||||
(function() {
|
||||
// Team Radio element
|
||||
const radio = document.createElement("div");
|
||||
radio.id = "f1TeamRadio";
|
||||
radio.className = "f1-radio-hide";
|
||||
radio.textContent = "🔊 Starting your engine...";
|
||||
document.body.appendChild(radio);
|
||||
|
||||
// Fastest Lap + Championship in progress bar
|
||||
const pb = document.getElementById("pb") || document.querySelector(".pb");
|
||||
if (pb) {
|
||||
const fl = document.createElement("span");
|
||||
fl.id = "f1FastLap";
|
||||
fl.style.cssText = "margin-left:auto;font-size:9px;color:#9147ff;font-family:Orbitron,sans-serif;letter-spacing:.5px";
|
||||
pb.appendChild(fl);
|
||||
const cp = document.createElement("span");
|
||||
cp.id = "f1Champ";
|
||||
cp.style.cssText = "margin-left:8px;font-size:10px;color:#ffd166;font-family:Orbitron,sans-serif";
|
||||
pb.appendChild(cp);
|
||||
}
|
||||
|
||||
// Trophy cabinet in report
|
||||
const rp = document.getElementById("rp");
|
||||
if (rp) {
|
||||
const title = document.createElement("div");
|
||||
title.style.cssText = "color:#e63946;font-size:13px;margin-top:12px;margin-bottom:4px;font-weight:600;font-family:Orbitron,sans-serif";
|
||||
title.textContent = "🏆 奖杯柜";
|
||||
rp.appendChild(title);
|
||||
const cabinet = document.createElement("div");
|
||||
cabinet.id = "f1Trophies";
|
||||
rp.appendChild(cabinet);
|
||||
}
|
||||
})();
|
||||
|
||||
// ========== 8. Hooks ==========
|
||||
// Hook into recAns (save original reference)
|
||||
const origRecAns = window.recAns || function(){};
|
||||
window.recAns = function(id, ok) {
|
||||
origRecAns(id, ok);
|
||||
|
||||
// Find the question
|
||||
const q = Q.find(function(x) { return x.id === id; });
|
||||
if (!q) return;
|
||||
|
||||
// Sector timing
|
||||
const elapsed = getSectorTime();
|
||||
if (elapsed) {
|
||||
recordFastLap(q.sub, elapsed);
|
||||
const card = document.querySelector('.cd .op.ok,.cd .op.no')?.closest('.cd') || document.querySelector('.cd');
|
||||
if (card) {
|
||||
const existing = card.querySelector(".f1-sectors");
|
||||
if (existing) existing.remove();
|
||||
const sectorEl = document.createElement("div");
|
||||
renderSectors(sectorEl, elapsed);
|
||||
card.appendChild(sectorEl);
|
||||
}
|
||||
}
|
||||
|
||||
// Team Radio
|
||||
if (ok) {
|
||||
const m = meta[id];
|
||||
const cc = m ? m.cc : 0;
|
||||
if (cc >= 5) showTeamRadio("streak5");
|
||||
else if (cc >= 3) showTeamRadio("streak3");
|
||||
else showTeamRadio("correct");
|
||||
|
||||
// Championship points
|
||||
const pts = getChampPoints(cc);
|
||||
champPoints += pts;
|
||||
updateChampionshipDisplay();
|
||||
try { localStorage.setItem("f1_champ", JSON.stringify({pts:champPoints})); } catch(e) {}
|
||||
|
||||
// Check stage completion for podium
|
||||
if (q.ch) {
|
||||
const stageQs = Q.filter(function(x) { return x.sub === q.sub && x.ch === q.ch; });
|
||||
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");
|
||||
setTimeout(function() { showPodium(stageLevel[q.ch] || 1); }, 500);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
showTeamRadio("wrong");
|
||||
}
|
||||
};
|
||||
|
||||
// Hook into render to add sector timer
|
||||
const origR = window.r || function(){};
|
||||
window.r = function() {
|
||||
origR();
|
||||
// Start sector timer for the current question
|
||||
setTimeout(function() {
|
||||
const currentQ = document.querySelector(".cd .st");
|
||||
if (currentQ) {
|
||||
// Find the current question ID from the card
|
||||
const cards = document.querySelectorAll(".cd");
|
||||
for (let i = 0; i < cards.length; i++) {
|
||||
const card = cards[i];
|
||||
const btn = card.querySelector("[data-qid]");
|
||||
if (btn) {
|
||||
startSectorTimer(btn.dataset.qid);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
// Update fastest lap display
|
||||
const subFastLap = fastLap[window.__currentSub] || fastLap.math;
|
||||
const flEl = document.getElementById("f1FastLap");
|
||||
if (flEl && subFastLap) {
|
||||
flEl.textContent = "🏁 " + (subFastLap / 1000).toFixed(1) + "s";
|
||||
}
|
||||
// Restore championship points
|
||||
try {
|
||||
const saved = JSON.parse(localStorage.getItem("f1_champ"));
|
||||
if (saved && saved.pts) {
|
||||
champPoints = saved.pts;
|
||||
updateChampionshipDisplay();
|
||||
}
|
||||
} catch(e) {}
|
||||
// Render trophy cabinet
|
||||
renderTrophyCabinet();
|
||||
}, 100);
|
||||
};
|
||||
|
||||
// Initial load: restore saved data
|
||||
try {
|
||||
const saved = JSON.parse(localStorage.getItem("f1_fastlap"));
|
||||
if (saved) { Object.assign(fastLap, saved); }
|
||||
} catch(e) {}
|
||||
try {
|
||||
const saved = JSON.parse(localStorage.getItem("f1_champ"));
|
||||
if (saved) { champPoints = saved.pts || 0; }
|
||||
} catch(e) {}
|
||||
|
||||
console.log("🏁 F1 Emotion Engine loaded");
|
||||
})();
|
||||
|
||||
|
||||
// === F1 情绪价值引擎:分站赛体验 ===
|
||||
(function() {
|
||||
if (window.__f1EmotionLoaded) return;
|
||||
window.__f1EmotionLoaded = true;
|
||||
|
||||
// ========== 1. Team Radio 系统 ==========
|
||||
const TEAM_RADIO = {
|
||||
correct: [
|
||||
"Box box box — great answer! Keep pushing! 🏁",
|
||||
"Max, you're P1! Fantastic pace! ⚡",
|
||||
"That's P1 material! 🏆",
|
||||
"Simply lovely, simply lovely! 🎯",
|
||||
"You're on fire! 🔥",
|
||||
"DRS enabled — you're flying! 🚀",
|
||||
"Purple sector! Stunning! 💜",
|
||||
"Through goes Hamilton! No wait, that's YOU! 🤩",
|
||||
"No mistakes, perfect lap! ✨",
|
||||
"You're pulling away from the pack! 💪",
|
||||
"Fastest lap of the race so far! ⏱️",
|
||||
"Great strat call — that answer was bold! 🧠",
|
||||
"You've got the pace, keep it clean! 🏎️",
|
||||
"That was inch-perfect! 🎯",
|
||||
"P1 for you, champ! 👑"
|
||||
],
|
||||
streak3: [
|
||||
"Three in a row — you're on for a Grand Slam! 🏁",
|
||||
"Hat-trick! The crowd is on their feet! 🎪",
|
||||
"Triple purple sectors! Unstoppable! 💜💜💜"
|
||||
],
|
||||
streak5: [
|
||||
"FIVE IN A ROW — DOMINATION! 🏆",
|
||||
"This is champion-level consistency! 👑",
|
||||
"You're lapping the field! 🔥🔥🔥"
|
||||
],
|
||||
wrong: [
|
||||
"Box box, we need a strategy adjustment... 📋",
|
||||
"Not your sector, keep pushing! 💪",
|
||||
"Tricky conditions out there, stay focused! 🧠",
|
||||
"That was a gamble, onto the next one! 🎲",
|
||||
"Pit wall here — we'll get 'em next lap! 🏁"
|
||||
]
|
||||
};
|
||||
|
||||
function showTeamRadio(type) {
|
||||
const el = document.getElementById("f1TeamRadio");
|
||||
if (!el) return;
|
||||
let msgs;
|
||||
if (type === "streak5") msgs = TEAM_RADIO.streak5;
|
||||
else if (type === "streak3") msgs = TEAM_RADIO.streak3;
|
||||
else if (type === "correct") msgs = TEAM_RADIO.correct;
|
||||
else msgs = TEAM_RADIO.wrong;
|
||||
const msg = msgs[Math.floor(Math.random() * msgs.length)];
|
||||
el.textContent = "🔊 " + msg;
|
||||
el.className = "f1-radio-show";
|
||||
el.style.color = type === "wrong" ? "#ff6b6b" : "#52b788";
|
||||
clearTimeout(el._timer);
|
||||
el._timer = setTimeout(function() {
|
||||
el.className = "f1-radio-hide";
|
||||
}, 3500);
|
||||
}
|
||||
|
||||
// ========== 2. Sector Timing ==========
|
||||
let sectorTimer = {start:0, qid:null};
|
||||
const fastLap = {math:null, chinese:null, english:null};
|
||||
|
||||
function startSectorTimer(qid) {
|
||||
sectorTimer.start = performance.now();
|
||||
sectorTimer.qid = qid;
|
||||
}
|
||||
|
||||
function getSectorTime() {
|
||||
if (!sectorTimer.start) return null;
|
||||
return Math.round((performance.now() - sectorTimer.start) * 10) / 10;
|
||||
}
|
||||
|
||||
function recordFastLap(sub, timeMs) {
|
||||
if (!fastLap[sub] || timeMs < fastLap[sub]) {
|
||||
fastLap[sub] = timeMs;
|
||||
try { localStorage.setItem("f1_fastlap", JSON.stringify(fastLap)); } catch(e) {}
|
||||
}
|
||||
}
|
||||
|
||||
function renderSectors(containerEl, timeMs) {
|
||||
if (!containerEl) return;
|
||||
const total = timeMs;
|
||||
const s1 = total * 0.3; // 读题
|
||||
const s2 = total * 0.4; // 思考
|
||||
const s3 = total * 0.3; // 作答
|
||||
const maxTime = 30000; // 30秒基准
|
||||
|
||||
function sectorColor(t, threshold) {
|
||||
if (t < threshold * 0.5) return "#9147ff"; // 紫(最快)
|
||||
if (t < threshold * 0.8) return "#2d6a4f"; // 绿
|
||||
return "#e6a817"; // 黄
|
||||
}
|
||||
|
||||
containerEl.innerHTML =
|
||||
'<div class="f1-sectors">' +
|
||||
'<div class="f1-sector" style="background:' + sectorColor(s1, maxTime * 0.3) + ';width:30%">' +
|
||||
'<span>S1</span><span>' + (s1 / 1000).toFixed(1) + 's</span>' +
|
||||
'</div>' +
|
||||
'<div class="f1-sector" style="background:' + sectorColor(s2, maxTime * 0.4) + ';width:40%">' +
|
||||
'<span>S2</span><span>' + (s2 / 1000).toFixed(1) + 's</span>' +
|
||||
'</div>' +
|
||||
'<div class="f1-sector" style="background:' + sectorColor(s3, maxTime * 0.3) + ';width:30%">' +
|
||||
'<span>S3</span><span>' + (s3 / 1000).toFixed(1) + 's</span>' +
|
||||
'</div>' +
|
||||
'</div>';
|
||||
}
|
||||
|
||||
// ========== 3. 锦标赛积分系统 ==========
|
||||
let champPoints = 0;
|
||||
function getChampPoints(streak) {
|
||||
const pts = [25,18,15,12,10,8,6,4,2,1];
|
||||
return pts[Math.min(streak, 9)] || 0;
|
||||
}
|
||||
|
||||
function updateChampionshipDisplay() {
|
||||
const el = document.getElementById("f1Champ");
|
||||
if (!el) return;
|
||||
el.textContent = "🏆 " + champPoints + " PTS";
|
||||
}
|
||||
|
||||
// ========== 4. 领奖台动画 ==========
|
||||
function showPodium(level) {
|
||||
// level: 1=练习赛, 2=排位赛, 3=冲刺赛, 4=正赛
|
||||
const levels = ["", "🥉 练习赛完成", "🥈 排位赛晋级", "🥇 冲刺赛取胜", "🏆 分站赛冠军!"];
|
||||
const label = levels[level] || "🏆 恭喜!";
|
||||
|
||||
const mo = document.getElementById("mo");
|
||||
const mb = document.getElementById("mb");
|
||||
const mt = document.getElementById("mt");
|
||||
const mbd = document.getElementById("mbd");
|
||||
if (!mo || !mb || !mt || !mbd) return;
|
||||
|
||||
mt.textContent = label;
|
||||
const pts = level * 25;
|
||||
champPoints += pts;
|
||||
updateChampionshipDisplay();
|
||||
|
||||
const msgs = [
|
||||
"",
|
||||
"完成了练习赛!积累经验,为排位赛做准备! 🏎️",
|
||||
"排位赛晋级!正赛从P1发车! ⚡",
|
||||
"冲刺赛取胜!正赛策略已就位! 🚀",
|
||||
"🏆 分站赛冠军!你是真正的F1知识冠军!香槟时间! 🍾"
|
||||
];
|
||||
mbd.innerHTML = msgs[level] + "<br>+" + pts + " 锦标赛积分!";
|
||||
mb.textContent = level >= 4 ? "🏆 捧杯!" : "下一站 →";
|
||||
|
||||
mo.className = "mo sh";
|
||||
if (level >= 3) startConfetti(level);
|
||||
|
||||
// Save points
|
||||
try { localStorage.setItem("f1_champ", JSON.stringify({pts:champPoints, levels:level})); } catch(e) {}
|
||||
}
|
||||
|
||||
// ========== 5. 奖杯柜(赛道完成状态)=========
|
||||
function renderTrophyCabinet() {
|
||||
const container = document.getElementById("f1Trophies");
|
||||
if (!container) return;
|
||||
|
||||
const stages = ["热身圈","第一赛段","第二赛段","第三赛段","最终圈"];
|
||||
const emojis = ["","🥉","🥈","🥇","🏆"];
|
||||
const stageKeys = ["warmup","q1","q2","q3","race"];
|
||||
|
||||
// Check completion per stage per subject
|
||||
for (const s of ["math","chinese","english"]) {
|
||||
const subQs = Q.filter(function(q) { return q.sub === s; });
|
||||
const subConv = Object.keys(conv).filter(function(id) { return subQs.some(function(q) { return q.id === id; }); });
|
||||
const subCorrect = subConv.filter(function(id) { return conv[id] && Q.find(function(q) { return q.id === id; }) && conv[id] === Q.find(function(q) { return q.id === id; }).ans; }).length;
|
||||
const pct = subQs.length > 0 ? Math.round(subCorrect / subQs.length * 100) : 0;
|
||||
|
||||
const row = document.createElement("div");
|
||||
row.style.cssText = "display:flex;align-items:center;gap:4px;padding:3px 0;font-size:10px";
|
||||
|
||||
const nameSpan = document.createElement("span");
|
||||
nameSpan.textContent = {math:"🏎 MATH",chinese:"📖 CHN",english:"🔤 ENG"}[s];
|
||||
nameSpan.style.cssText = "width:50px;color:#888;font-family:Orbitron,sans-serif;font-size:8px";
|
||||
|
||||
for (let i = 0; i < stages.length; i++) {
|
||||
const stageQs = subQs.filter(function(q) { return q.ch === stages[i]; });
|
||||
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.title = stages[i] + (done ? " ✅" : "");
|
||||
row.appendChild(icon);
|
||||
}
|
||||
|
||||
const pctSpan = document.createElement("span");
|
||||
pctSpan.textContent = pct + "%";
|
||||
pctSpan.style.cssText = "color:" + (pct >= 80 ? "#52b788" : pct >= 50 ? "#ffd166" : "#888") + ";font-family:Orbitron,sans-serif;font-size:8px;width:30px;text-align:right";
|
||||
row.appendChild(pctSpan);
|
||||
|
||||
container.appendChild(row);
|
||||
}
|
||||
}
|
||||
|
||||
// ========== 6. CSS 注入 ==========
|
||||
(function() {
|
||||
const style = document.createElement("style");
|
||||
style.textContent = `
|
||||
/* Team Radio */
|
||||
#f1TeamRadio {
|
||||
position: fixed; bottom: 52px; left: 50%; transform: translateX(-50%);
|
||||
background: rgba(15,15,35,.92); border: 2px solid #e63946;
|
||||
border-radius: 20px; padding: 8px 18px; font-size: 12px;
|
||||
color: #52b788; z-index: 300; white-space: nowrap;
|
||||
font-family: 'Orbitron', sans-serif; letter-spacing: .5px;
|
||||
transition: all .4s cubic-bezier(.25,.46,.45,.94);
|
||||
pointer-events: none;
|
||||
}
|
||||
.f1-radio-show { opacity: 1; transform: translateX(-50%) translateY(0); }
|
||||
.f1-radio-hide { opacity: 0; transform: translateX(-50%) translateY(20px); }
|
||||
|
||||
/* Sector Timing */
|
||||
.f1-sectors { display: flex; gap: 2px; height: 16px; margin: 4px 0; border-radius: 2px; overflow: hidden; }
|
||||
.f1-sector { display: flex; align-items: center; justify-content: center; font-size: 7px; color: #fff; font-family: 'Orbitron',sans-serif; gap: 2px; opacity: 0.9; }
|
||||
.f1-sector span { text-shadow: 0 0 2px rgba(0,0,0,.8); }
|
||||
|
||||
/* Fastest Lap */
|
||||
#f1FastLap { font-size: 9px; color: #9147ff; font-family: 'Orbitron',sans-serif; letter-spacing: .5px; }
|
||||
|
||||
/* Championship */
|
||||
#f1Champ { font-size: 10px; color: #ffd166; font-family: 'Orbitron',sans-serif; }
|
||||
|
||||
/* Trophies */
|
||||
#f1Trophies { padding: 6px 0; }
|
||||
|
||||
/* Flag effect for podium */
|
||||
.f1-flag { position: fixed; top: 0; left: 0; right: 0; bottom: 0;
|
||||
background: repeating-linear-gradient(90deg,
|
||||
rgba(230,57,70,.08) 0, rgba(230,57,70,.08) 20px,
|
||||
rgba(255,255,255,.05) 20px, rgba(255,255,255,.05) 40px);
|
||||
pointer-events: none; z-index: -1; animation: f1-flag-wave 3s ease-in-out infinite; }
|
||||
@keyframes f1-flag-wave {
|
||||
0%,100% { transform: skewX(0); }
|
||||
50% { transform: skewX(2deg); }
|
||||
}
|
||||
`;
|
||||
document.head.appendChild(style);
|
||||
})();
|
||||
|
||||
// ========== 7. UI 注入 ==========
|
||||
(function() {
|
||||
// Team Radio element
|
||||
const radio = document.createElement("div");
|
||||
radio.id = "f1TeamRadio";
|
||||
radio.className = "f1-radio-hide";
|
||||
radio.textContent = "🔊 Starting your engine...";
|
||||
document.body.appendChild(radio);
|
||||
|
||||
// Fastest Lap + Championship in progress bar
|
||||
const pb = document.getElementById("pb") || document.querySelector(".pb");
|
||||
if (pb) {
|
||||
const fl = document.createElement("span");
|
||||
fl.id = "f1FastLap";
|
||||
fl.style.cssText = "margin-left:auto;font-size:9px;color:#9147ff;font-family:Orbitron,sans-serif;letter-spacing:.5px";
|
||||
pb.appendChild(fl);
|
||||
const cp = document.createElement("span");
|
||||
cp.id = "f1Champ";
|
||||
cp.style.cssText = "margin-left:8px;font-size:10px;color:#ffd166;font-family:Orbitron,sans-serif";
|
||||
pb.appendChild(cp);
|
||||
}
|
||||
|
||||
// Trophy cabinet in report
|
||||
const rp = document.getElementById("rp");
|
||||
if (rp) {
|
||||
const title = document.createElement("div");
|
||||
title.style.cssText = "color:#e63946;font-size:13px;margin-top:12px;margin-bottom:4px;font-weight:600;font-family:Orbitron,sans-serif";
|
||||
title.textContent = "🏆 奖杯柜";
|
||||
rp.appendChild(title);
|
||||
const cabinet = document.createElement("div");
|
||||
cabinet.id = "f1Trophies";
|
||||
rp.appendChild(cabinet);
|
||||
}
|
||||
})();
|
||||
|
||||
// ========== 8. Hooks ==========
|
||||
// Hook into recAns (save original reference)
|
||||
const origRecAns = window.recAns || function(){};
|
||||
window.recAns = function(id, ok) {
|
||||
origRecAns(id, ok);
|
||||
|
||||
// Find the question
|
||||
const q = Q.find(function(x) { return x.id === id; });
|
||||
if (!q) return;
|
||||
|
||||
// Sector timing
|
||||
const elapsed = getSectorTime();
|
||||
if (elapsed) {
|
||||
recordFastLap(q.sub, elapsed);
|
||||
const card = document.querySelector('.cd .op.ok,.cd .op.no')?.closest('.cd') || document.querySelector('.cd');
|
||||
if (card) {
|
||||
const existing = card.querySelector(".f1-sectors");
|
||||
if (existing) existing.remove();
|
||||
const sectorEl = document.createElement("div");
|
||||
renderSectors(sectorEl, elapsed);
|
||||
card.appendChild(sectorEl);
|
||||
}
|
||||
}
|
||||
|
||||
// Team Radio
|
||||
if (ok) {
|
||||
const m = meta[id];
|
||||
const cc = m ? m.cc : 0;
|
||||
if (cc >= 5) showTeamRadio("streak5");
|
||||
else if (cc >= 3) showTeamRadio("streak3");
|
||||
else showTeamRadio("correct");
|
||||
|
||||
// Championship points
|
||||
const pts = getChampPoints(cc);
|
||||
champPoints += pts;
|
||||
updateChampionshipDisplay();
|
||||
try { localStorage.setItem("f1_champ", JSON.stringify({pts:champPoints})); } catch(e) {}
|
||||
|
||||
// Check stage completion for podium
|
||||
if (q.ch) {
|
||||
const stageQs = Q.filter(function(x) { return x.sub === q.sub && x.ch === q.ch; });
|
||||
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");
|
||||
setTimeout(function() { showPodium(stageLevel[q.ch] || 1); }, 500);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
showTeamRadio("wrong");
|
||||
}
|
||||
};
|
||||
|
||||
// Hook into render to add sector timer
|
||||
const origR = window.r || function(){};
|
||||
window.r = function() {
|
||||
origR();
|
||||
// Start sector timer for the current question
|
||||
setTimeout(function() {
|
||||
const currentQ = document.querySelector(".cd .st");
|
||||
if (currentQ) {
|
||||
// Find the current question ID from the card
|
||||
const cards = document.querySelectorAll(".cd");
|
||||
for (let i = 0; i < cards.length; i++) {
|
||||
const card = cards[i];
|
||||
const btn = card.querySelector("[data-qid]");
|
||||
if (btn) {
|
||||
startSectorTimer(btn.dataset.qid);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
// Update fastest lap display
|
||||
const subFastLap = fastLap[window.__currentSub] || fastLap.math;
|
||||
const flEl = document.getElementById("f1FastLap");
|
||||
if (flEl && subFastLap) {
|
||||
flEl.textContent = "🏁 " + (subFastLap / 1000).toFixed(1) + "s";
|
||||
}
|
||||
// Restore championship points
|
||||
try {
|
||||
const saved = JSON.parse(localStorage.getItem("f1_champ"));
|
||||
if (saved && saved.pts) {
|
||||
champPoints = saved.pts;
|
||||
updateChampionshipDisplay();
|
||||
}
|
||||
} catch(e) {}
|
||||
// Render trophy cabinet
|
||||
renderTrophyCabinet();
|
||||
}, 100);
|
||||
};
|
||||
|
||||
// Initial load: restore saved data
|
||||
try {
|
||||
const saved = JSON.parse(localStorage.getItem("f1_fastlap"));
|
||||
if (saved) { Object.assign(fastLap, saved); }
|
||||
} catch(e) {}
|
||||
try {
|
||||
const saved = JSON.parse(localStorage.getItem("f1_champ"));
|
||||
if (saved) { champPoints = saved.pts || 0; }
|
||||
} catch(e) {}
|
||||
|
||||
console.log("🏁 F1 Emotion Engine loaded");
|
||||
})();
|
||||
|
||||
|
||||
// === F1 情绪价值引擎:分站赛体验 ===
|
||||
(function() {
|
||||
if (window.__f1EmotionLoaded) return;
|
||||
window.__f1EmotionLoaded = true;
|
||||
|
||||
// ========== 1. Team Radio 系统 ==========
|
||||
const TEAM_RADIO = {
|
||||
correct: [
|
||||
"Box box box — great answer! Keep pushing! 🏁",
|
||||
"Max, you're P1! Fantastic pace! ⚡",
|
||||
"That's P1 material! 🏆",
|
||||
"Simply lovely, simply lovely! 🎯",
|
||||
"You're on fire! 🔥",
|
||||
"DRS enabled — you're flying! 🚀",
|
||||
"Purple sector! Stunning! 💜",
|
||||
"Through goes Hamilton! No wait, that's YOU! 🤩",
|
||||
"No mistakes, perfect lap! ✨",
|
||||
"You're pulling away from the pack! 💪",
|
||||
"Fastest lap of the race so far! ⏱️",
|
||||
"Great strat call — that answer was bold! 🧠",
|
||||
"You've got the pace, keep it clean! 🏎️",
|
||||
"That was inch-perfect! 🎯",
|
||||
"P1 for you, champ! 👑"
|
||||
],
|
||||
streak3: [
|
||||
"Three in a row — you're on for a Grand Slam! 🏁",
|
||||
"Hat-trick! The crowd is on their feet! 🎪",
|
||||
"Triple purple sectors! Unstoppable! 💜💜💜"
|
||||
],
|
||||
streak5: [
|
||||
"FIVE IN A ROW — DOMINATION! 🏆",
|
||||
"This is champion-level consistency! 👑",
|
||||
"You're lapping the field! 🔥🔥🔥"
|
||||
],
|
||||
wrong: [
|
||||
"Box box, we need a strategy adjustment... 📋",
|
||||
"Not your sector, keep pushing! 💪",
|
||||
"Tricky conditions out there, stay focused! 🧠",
|
||||
"That was a gamble, onto the next one! 🎲",
|
||||
"Pit wall here — we'll get 'em next lap! 🏁"
|
||||
]
|
||||
};
|
||||
|
||||
function showTeamRadio(type) {
|
||||
const el = document.getElementById("f1TeamRadio");
|
||||
if (!el) return;
|
||||
let msgs;
|
||||
if (type === "streak5") msgs = TEAM_RADIO.streak5;
|
||||
else if (type === "streak3") msgs = TEAM_RADIO.streak3;
|
||||
else if (type === "correct") msgs = TEAM_RADIO.correct;
|
||||
else msgs = TEAM_RADIO.wrong;
|
||||
const msg = msgs[Math.floor(Math.random() * msgs.length)];
|
||||
el.textContent = "🔊 " + msg;
|
||||
el.className = "f1-radio-show";
|
||||
el.style.color = type === "wrong" ? "#ff6b6b" : "#52b788";
|
||||
clearTimeout(el._timer);
|
||||
el._timer = setTimeout(function() {
|
||||
el.className = "f1-radio-hide";
|
||||
}, 3500);
|
||||
}
|
||||
|
||||
// ========== 2. Sector Timing ==========
|
||||
let sectorTimer = {start:0, qid:null};
|
||||
const fastLap = {math:null, chinese:null, english:null};
|
||||
|
||||
function startSectorTimer(qid) {
|
||||
sectorTimer.start = performance.now();
|
||||
sectorTimer.qid = qid;
|
||||
}
|
||||
|
||||
function getSectorTime() {
|
||||
if (!sectorTimer.start) return null;
|
||||
return Math.round((performance.now() - sectorTimer.start) * 10) / 10;
|
||||
}
|
||||
|
||||
function recordFastLap(sub, timeMs) {
|
||||
if (!fastLap[sub] || timeMs < fastLap[sub]) {
|
||||
fastLap[sub] = timeMs;
|
||||
try { localStorage.setItem("f1_fastlap", JSON.stringify(fastLap)); } catch(e) {}
|
||||
}
|
||||
}
|
||||
|
||||
function renderSectors(containerEl, timeMs) {
|
||||
if (!containerEl) return;
|
||||
const total = timeMs;
|
||||
const s1 = total * 0.3; // 读题
|
||||
const s2 = total * 0.4; // 思考
|
||||
const s3 = total * 0.3; // 作答
|
||||
const maxTime = 30000; // 30秒基准
|
||||
|
||||
function sectorColor(t, threshold) {
|
||||
if (t < threshold * 0.5) return "#9147ff"; // 紫(最快)
|
||||
if (t < threshold * 0.8) return "#2d6a4f"; // 绿
|
||||
return "#e6a817"; // 黄
|
||||
}
|
||||
|
||||
containerEl.innerHTML =
|
||||
'<div class="f1-sectors">' +
|
||||
'<div class="f1-sector" style="background:' + sectorColor(s1, maxTime * 0.3) + ';width:30%">' +
|
||||
'<span>S1</span><span>' + (s1 / 1000).toFixed(1) + 's</span>' +
|
||||
'</div>' +
|
||||
'<div class="f1-sector" style="background:' + sectorColor(s2, maxTime * 0.4) + ';width:40%">' +
|
||||
'<span>S2</span><span>' + (s2 / 1000).toFixed(1) + 's</span>' +
|
||||
'</div>' +
|
||||
'<div class="f1-sector" style="background:' + sectorColor(s3, maxTime * 0.3) + ';width:30%">' +
|
||||
'<span>S3</span><span>' + (s3 / 1000).toFixed(1) + 's</span>' +
|
||||
'</div>' +
|
||||
'</div>';
|
||||
}
|
||||
|
||||
// ========== 3. 锦标赛积分系统 ==========
|
||||
let champPoints = 0;
|
||||
function getChampPoints(streak) {
|
||||
const pts = [25,18,15,12,10,8,6,4,2,1];
|
||||
return pts[Math.min(streak, 9)] || 0;
|
||||
}
|
||||
|
||||
function updateChampionshipDisplay() {
|
||||
const el = document.getElementById("f1Champ");
|
||||
if (!el) return;
|
||||
el.textContent = "🏆 " + champPoints + " PTS";
|
||||
}
|
||||
|
||||
// ========== 4. 领奖台动画 ==========
|
||||
function showPodium(level) {
|
||||
// level: 1=练习赛, 2=排位赛, 3=冲刺赛, 4=正赛
|
||||
const levels = ["", "🥉 练习赛完成", "🥈 排位赛晋级", "🥇 冲刺赛取胜", "🏆 分站赛冠军!"];
|
||||
const label = levels[level] || "🏆 恭喜!";
|
||||
|
||||
const mo = document.getElementById("mo");
|
||||
const mb = document.getElementById("mb");
|
||||
const mt = document.getElementById("mt");
|
||||
const mbd = document.getElementById("mbd");
|
||||
if (!mo || !mb || !mt || !mbd) return;
|
||||
|
||||
mt.textContent = label;
|
||||
const pts = level * 25;
|
||||
champPoints += pts;
|
||||
updateChampionshipDisplay();
|
||||
|
||||
const msgs = [
|
||||
"",
|
||||
"完成了练习赛!积累经验,为排位赛做准备! 🏎️",
|
||||
"排位赛晋级!正赛从P1发车! ⚡",
|
||||
"冲刺赛取胜!正赛策略已就位! 🚀",
|
||||
"🏆 分站赛冠军!你是真正的F1知识冠军!香槟时间! 🍾"
|
||||
];
|
||||
mbd.innerHTML = msgs[level] + "<br>+" + pts + " 锦标赛积分!";
|
||||
mb.textContent = level >= 4 ? "🏆 捧杯!" : "下一站 →";
|
||||
|
||||
mo.className = "mo sh";
|
||||
if (level >= 3) startConfetti(level);
|
||||
|
||||
// Save points
|
||||
try { localStorage.setItem("f1_champ", JSON.stringify({pts:champPoints, levels:level})); } catch(e) {}
|
||||
}
|
||||
|
||||
// ========== 5. 奖杯柜(赛道完成状态)=========
|
||||
function renderTrophyCabinet() {
|
||||
const container = document.getElementById("f1Trophies");
|
||||
if (!container) return;
|
||||
|
||||
const stages = ["热身圈","第一赛段","第二赛段","第三赛段","最终圈"];
|
||||
const emojis = ["","🥉","🥈","🥇","🏆"];
|
||||
const stageKeys = ["warmup","q1","q2","q3","race"];
|
||||
|
||||
// Check completion per stage per subject
|
||||
for (const s of ["math","chinese","english"]) {
|
||||
const subQs = Q.filter(function(q) { return q.sub === s; });
|
||||
const subConv = Object.keys(conv).filter(function(id) { return subQs.some(function(q) { return q.id === id; }); });
|
||||
const subCorrect = subConv.filter(function(id) { return conv[id] && Q.find(function(q) { return q.id === id; }) && conv[id] === Q.find(function(q) { return q.id === id; }).ans; }).length;
|
||||
const pct = subQs.length > 0 ? Math.round(subCorrect / subQs.length * 100) : 0;
|
||||
|
||||
const row = document.createElement("div");
|
||||
row.style.cssText = "display:flex;align-items:center;gap:4px;padding:3px 0;font-size:10px";
|
||||
|
||||
const nameSpan = document.createElement("span");
|
||||
nameSpan.textContent = {math:"🏎 MATH",chinese:"📖 CHN",english:"🔤 ENG"}[s];
|
||||
nameSpan.style.cssText = "width:50px;color:#888;font-family:Orbitron,sans-serif;font-size:8px";
|
||||
|
||||
for (let i = 0; i < stages.length; i++) {
|
||||
const stageQs = subQs.filter(function(q) { return q.ch === stages[i]; });
|
||||
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.title = stages[i] + (done ? " ✅" : "");
|
||||
row.appendChild(icon);
|
||||
}
|
||||
|
||||
const pctSpan = document.createElement("span");
|
||||
pctSpan.textContent = pct + "%";
|
||||
pctSpan.style.cssText = "color:" + (pct >= 80 ? "#52b788" : pct >= 50 ? "#ffd166" : "#888") + ";font-family:Orbitron,sans-serif;font-size:8px;width:30px;text-align:right";
|
||||
row.appendChild(pctSpan);
|
||||
|
||||
container.appendChild(row);
|
||||
}
|
||||
}
|
||||
|
||||
// ========== 6. CSS 注入 ==========
|
||||
(function() {
|
||||
const style = document.createElement("style");
|
||||
style.textContent = `
|
||||
/* Team Radio */
|
||||
#f1TeamRadio {
|
||||
position: fixed; bottom: 52px; left: 50%; transform: translateX(-50%);
|
||||
background: rgba(15,15,35,.92); border: 2px solid #e63946;
|
||||
border-radius: 20px; padding: 8px 18px; font-size: 12px;
|
||||
color: #52b788; z-index: 300; white-space: nowrap;
|
||||
font-family: 'Orbitron', sans-serif; letter-spacing: .5px;
|
||||
transition: all .4s cubic-bezier(.25,.46,.45,.94);
|
||||
pointer-events: none;
|
||||
}
|
||||
.f1-radio-show { opacity: 1; transform: translateX(-50%) translateY(0); }
|
||||
.f1-radio-hide { opacity: 0; transform: translateX(-50%) translateY(20px); }
|
||||
|
||||
/* Sector Timing */
|
||||
.f1-sectors { display: flex; gap: 2px; height: 16px; margin: 4px 0; border-radius: 2px; overflow: hidden; }
|
||||
.f1-sector { display: flex; align-items: center; justify-content: center; font-size: 7px; color: #fff; font-family: 'Orbitron',sans-serif; gap: 2px; opacity: 0.9; }
|
||||
.f1-sector span { text-shadow: 0 0 2px rgba(0,0,0,.8); }
|
||||
|
||||
/* Fastest Lap */
|
||||
#f1FastLap { font-size: 9px; color: #9147ff; font-family: 'Orbitron',sans-serif; letter-spacing: .5px; }
|
||||
|
||||
/* Championship */
|
||||
#f1Champ { font-size: 10px; color: #ffd166; font-family: 'Orbitron',sans-serif; }
|
||||
|
||||
/* Trophies */
|
||||
#f1Trophies { padding: 6px 0; }
|
||||
|
||||
/* Flag effect for podium */
|
||||
.f1-flag { position: fixed; top: 0; left: 0; right: 0; bottom: 0;
|
||||
background: repeating-linear-gradient(90deg,
|
||||
rgba(230,57,70,.08) 0, rgba(230,57,70,.08) 20px,
|
||||
rgba(255,255,255,.05) 20px, rgba(255,255,255,.05) 40px);
|
||||
pointer-events: none; z-index: -1; animation: f1-flag-wave 3s ease-in-out infinite; }
|
||||
@keyframes f1-flag-wave {
|
||||
0%,100% { transform: skewX(0); }
|
||||
50% { transform: skewX(2deg); }
|
||||
}
|
||||
`;
|
||||
document.head.appendChild(style);
|
||||
})();
|
||||
|
||||
// ========== 7. UI 注入 ==========
|
||||
(function() {
|
||||
// Team Radio element
|
||||
const radio = document.createElement("div");
|
||||
radio.id = "f1TeamRadio";
|
||||
radio.className = "f1-radio-hide";
|
||||
radio.textContent = "🔊 Starting your engine...";
|
||||
document.body.appendChild(radio);
|
||||
|
||||
// Fastest Lap + Championship in progress bar
|
||||
const pb = document.getElementById("pb") || document.querySelector(".pb");
|
||||
if (pb) {
|
||||
const fl = document.createElement("span");
|
||||
fl.id = "f1FastLap";
|
||||
fl.style.cssText = "margin-left:auto;font-size:9px;color:#9147ff;font-family:Orbitron,sans-serif;letter-spacing:.5px";
|
||||
pb.appendChild(fl);
|
||||
const cp = document.createElement("span");
|
||||
cp.id = "f1Champ";
|
||||
cp.style.cssText = "margin-left:8px;font-size:10px;color:#ffd166;font-family:Orbitron,sans-serif";
|
||||
pb.appendChild(cp);
|
||||
}
|
||||
|
||||
// Trophy cabinet in report
|
||||
const rp = document.getElementById("rp");
|
||||
if (rp) {
|
||||
const title = document.createElement("div");
|
||||
title.style.cssText = "color:#e63946;font-size:13px;margin-top:12px;margin-bottom:4px;font-weight:600;font-family:Orbitron,sans-serif";
|
||||
title.textContent = "🏆 奖杯柜";
|
||||
rp.appendChild(title);
|
||||
const cabinet = document.createElement("div");
|
||||
cabinet.id = "f1Trophies";
|
||||
rp.appendChild(cabinet);
|
||||
}
|
||||
})();
|
||||
|
||||
// ========== 8. Hooks ==========
|
||||
// Hook into recAns (save original reference)
|
||||
const origRecAns = window.recAns || function(){};
|
||||
window.recAns = function(id, ok) {
|
||||
origRecAns(id, ok);
|
||||
|
||||
// Find the question
|
||||
const q = Q.find(function(x) { return x.id === id; });
|
||||
if (!q) return;
|
||||
|
||||
// Sector timing
|
||||
const elapsed = getSectorTime();
|
||||
if (elapsed) {
|
||||
recordFastLap(q.sub, elapsed);
|
||||
const card = document.querySelector('.cd .op.ok,.cd .op.no')?.closest('.cd') || document.querySelector('.cd');
|
||||
if (card) {
|
||||
const existing = card.querySelector(".f1-sectors");
|
||||
if (existing) existing.remove();
|
||||
const sectorEl = document.createElement("div");
|
||||
renderSectors(sectorEl, elapsed);
|
||||
card.appendChild(sectorEl);
|
||||
}
|
||||
}
|
||||
|
||||
// Team Radio
|
||||
if (ok) {
|
||||
const m = meta[id];
|
||||
const cc = m ? m.cc : 0;
|
||||
if (cc >= 5) showTeamRadio("streak5");
|
||||
else if (cc >= 3) showTeamRadio("streak3");
|
||||
else showTeamRadio("correct");
|
||||
|
||||
// Championship points
|
||||
const pts = getChampPoints(cc);
|
||||
champPoints += pts;
|
||||
updateChampionshipDisplay();
|
||||
try { localStorage.setItem("f1_champ", JSON.stringify({pts:champPoints})); } catch(e) {}
|
||||
|
||||
// Check stage completion for podium
|
||||
if (q.ch) {
|
||||
const stageQs = Q.filter(function(x) { return x.sub === q.sub && x.ch === q.ch; });
|
||||
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");
|
||||
setTimeout(function() { showPodium(stageLevel[q.ch] || 1); }, 500);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
showTeamRadio("wrong");
|
||||
}
|
||||
};
|
||||
|
||||
// Hook into render to add sector timer
|
||||
const origR = window.r || function(){};
|
||||
window.r = function() {
|
||||
origR();
|
||||
// Start sector timer for the current question
|
||||
setTimeout(function() {
|
||||
const currentQ = document.querySelector(".cd .st");
|
||||
if (currentQ) {
|
||||
// Find the current question ID from the card
|
||||
const cards = document.querySelectorAll(".cd");
|
||||
for (let i = 0; i < cards.length; i++) {
|
||||
const card = cards[i];
|
||||
const btn = card.querySelector("[data-qid]");
|
||||
if (btn) {
|
||||
startSectorTimer(btn.dataset.qid);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
// Update fastest lap display
|
||||
const subFastLap = fastLap[window.__currentSub] || fastLap.math;
|
||||
const flEl = document.getElementById("f1FastLap");
|
||||
if (flEl && subFastLap) {
|
||||
flEl.textContent = "🏁 " + (subFastLap / 1000).toFixed(1) + "s";
|
||||
}
|
||||
// Restore championship points
|
||||
try {
|
||||
const saved = JSON.parse(localStorage.getItem("f1_champ"));
|
||||
if (saved && saved.pts) {
|
||||
champPoints = saved.pts;
|
||||
updateChampionshipDisplay();
|
||||
}
|
||||
} catch(e) {}
|
||||
// Render trophy cabinet
|
||||
renderTrophyCabinet();
|
||||
}, 100);
|
||||
};
|
||||
|
||||
// Initial load: restore saved data
|
||||
try {
|
||||
const saved = JSON.parse(localStorage.getItem("f1_fastlap"));
|
||||
if (saved) { Object.assign(fastLap, saved); }
|
||||
} catch(e) {}
|
||||
try {
|
||||
const saved = JSON.parse(localStorage.getItem("f1_champ"));
|
||||
if (saved) { champPoints = saved.pts || 0; }
|
||||
} catch(e) {}
|
||||
|
||||
console.log("🏁 F1 Emotion Engine loaded");
|
||||
})();
|
||||
|
||||
|
||||
</script></body></html>
|
||||
|
||||
Reference in New Issue
Block a user