From c494ec92fb3b077ef1738dad7eb490848fa09d5b Mon Sep 17 00:00:00 2001 From: Maxim Dolgolyov Date: Fri, 29 May 2026 10:28:11 +0300 Subject: [PATCH] =?UTF-8?q?feat(geom9=20ch4=20final):=20=D0=A4=D0=B8=D0=BD?= =?UTF-8?q?=D0=B0=D0=BB=20=D0=93=D0=BB=D0=B0=D0=B2=D1=8B=204=20(5=20=D0=B1?= =?UTF-8?q?=D0=BE=D1=81=D1=81=D0=BE=D0=B2=20+=20=D0=B0=D1=87=D0=B8=D0=B2?= =?UTF-8?q?=D0=BA=D0=B0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/textbooks/geometry_9_ch4.html | 232 ++++++++++++++++++++++++- 1 file changed, 224 insertions(+), 8 deletions(-) diff --git a/frontend/textbooks/geometry_9_ch4.html b/frontend/textbooks/geometry_9_ch4.html index 8908ba3..bd45857 100644 --- a/frontend/textbooks/geometry_9_ch4.html +++ b/frontend/textbooks/geometry_9_ch4.html @@ -1645,16 +1645,232 @@ function buildP14(){ } function buildFinal4(){ - const body = document.getElementById('final4-body'); + const box = document.getElementById('final4-body'); let html = ''; - html += makeCard('theory', 'Финал главы 4', '★', ` -

Итоговый раздел главы «Правильные многоугольники» будет добавлен в следующих обновлениях.

-

Раздел Phase 7.

`); - html += readButton('final4'); + + /* Часть А — Шпаргалка главы (4 mini-карточки) */ + html += `
+
+ ${ICONS.theory} + Шпаргалка главы 4 + Итог +
+
+

Все ключевые формулы главы «Правильные многоугольники» — в одном месте. Просмотри перед боссами!

+
+
+
+ + § 13 · Правильные многоуг. +
+
Внутренний угол $\\beta = \\dfrac{180°(n-2)}{n}$. Центральный угол $= \\dfrac{360°}{n}$.
+
+
+
+ + § 14 · Радиусы +
+
$\\dfrac{a}{2} = R\\sin\\dfrac{180°}{n} = r\\tan\\dfrac{180°}{n}$. $r = R\\cos\\dfrac{180°}{n}$.
+
+
+
+ + § 15 · Эталоны $n=3,4,6$ +
+
3-уг: $a = R\\sqrt{3}$. 4-уг: $a = R\\sqrt{2}$. 6-уг: $a = R$.
+
+
+
+ + § 16 · Окружность и круг +
+
$C = 2\\pi R$, $S = \\pi R^2$. Дуга $\\ell = \\dfrac{\\pi R \\alpha}{180}$, сектор $S = \\dfrac{\\pi R^2 \\alpha}{360}$.
+
+
+
+
`; + + /* Часть Б — 5 боссов */ + html += `
+
+ ${ICONS.rule} + Боссы главы 4 + 5 +
+
+

5 интегрированных задач — каждая комбинирует темы главы. За каждого побеждённого босса — +10 XP и +18% к прогрессу. Победишь всех — +50 XP бонус и ачивка «Магистр многоугольников и круга»!

+
+
`; + + html += '
'; + + html += `
+
Прогресс по боссам
+
0 / 5 боссов побеждено
+
+
+
+ +
`; + html += secNav('p16', null); - body.innerHTML = html; - wireReadBtn('final4'); - if(window.renderMathInElement) renderMath(body); + + box.innerHTML = html; + renderMath(box); + + /* Боссы */ + const BOSSES = [ + { + n:1, color:'#10b981', + title:'Циклоп Углов', + tag:'§ 13', + q:'Чему равен внутренний угол правильного 12-угольника (в градусах)?', + ans:150, decimal:false, + hint:'$\\beta = \\dfrac{180°(n-2)}{n} = \\dfrac{180° \\cdot 10}{12} = 150°$.' + }, + { + n:2, color:'#0891b2', + title:'Минотавр Сторон', + tag:'§ 14 + § 15', + q:'В правильный шестиугольник с описанной окружностью радиуса $R = 5$ вписан правильный треугольник (та же окружность). Найди сторону треугольника (округли до сотых).', + ans:8.66, decimal:true, + hint:'У треугольника та же $R = 5$. По эталону: $a = R\\sqrt{3} = 5\\sqrt{3} \\approx 8{,}66$.' + }, + { + n:3, color:'#7c3aed', + title:'Гарпия Окружности', + tag:'§ 16', + q:'Длина окружности равна $C = 31{,}4$ см. Найди радиус (используй $\\pi = 3{,}14$).', + ans:5, decimal:false, + hint:'$R = \\dfrac{C}{2\\pi} = \\dfrac{31{,}4}{6{,}28} = 5$.' + }, + { + n:4, color:'#dc2626', + title:'Дракон Сектора', + tag:'§ 16 + § 13', + q:'Правильный 6-угольник вписан в окружность радиуса $R = 6$. Найди площадь сектора, центральный угол которого равен углу, опирающемуся на одну сторону (используй $\\pi = 3{,}14$, округли до сотых).', + ans:18.84, decimal:true, + hint:'Центральный угол 6-уг $= \\dfrac{360°}{6} = 60°$. $S = \\dfrac{\\pi R^2 \\cdot 60}{360} = \\dfrac{\\pi \\cdot 36}{6} = 6\\pi \\approx 18{,}84$.' + }, + { + n:5, color:'#f59e0b', + title:'Мастер Многоугольников', + tag:'§§ 13-16 — синтез', + q:'В круг радиуса $R = 10$ вписан правильный 4-угольник (квадрат). Найди разницу между площадью круга и площадью квадрата (используй $\\pi = 3{,}14$).', + ans:114, decimal:false, + hint:'$S_{круга} = \\pi R^2 = 100\\pi = 314$. Для квадрата $a = R\\sqrt{2}$, $S_{кв} = a^2 = 2R^2 = 200$. Разница $= 314 - 200 = 114$.' + }, + ]; + + const cont = document.getElementById('ch4G-bosses-container'); + const STATE_KEY = 'geometry9_ch4_bosses'; + const BOSS_STATE = (function(){ + try{ const s = localStorage.getItem(STATE_KEY); if(s){ const p = JSON.parse(s); if(Array.isArray(p) && p.length === BOSSES.length) return p; } }catch(e){} + return BOSSES.map(()=>({defeated:false})); + })(); + function saveBosses(){ try{ localStorage.setItem(STATE_KEY, JSON.stringify(BOSS_STATE)); }catch(e){} } + + cont.innerHTML = BOSSES.map((b, idx)=>{ + const stepAttr = b.decimal ? 'step="0.01"' : 'step="1"'; + const ph = b.decimal ? 'число (можно с запятой)' : 'целое число'; + return '
' + +'
' + +'' + +'
Босс '+b.n+': '+b.title+'
' + +'
'+b.tag+'
' + +'
' + +'
'+b.q+'
' + +'
' + +'ответ =' + +'' + +'' + +'' + +'
' + +'' + +'
'; + }).join(''); + renderMath(cont); + + function markDefeatedUI(b, idx){ + const card = document.getElementById('bossG4-'+b.n+'-card'); + const goBtn = document.getElementById('bossG4-'+b.n+'-go'); + const ansInp = document.getElementById('bossG4-'+b.n+'-ans'); + if(!card || !goBtn || !ansInp) return; + card.style.background = 'linear-gradient(135deg,var(--acc-soft),var(--pri-soft))'; + card.style.boxShadow = '0 0 0 2px '+b.color+'33, 0 8px 24px rgba(16,185,129,.12)'; + goBtn.disabled = true; goBtn.style.opacity = .55; + goBtn.innerHTML = ' Повержен'; + ansInp.disabled = true; + } + + function refreshOverall(){ + const won = BOSS_STATE.filter(s => s.defeated).length; + const txt = document.getElementById('ch4G-boss-overall'); + const fill = document.getElementById('ch4G-boss-overall-fill'); + if(txt) txt.textContent = won + ' / ' + BOSSES.length + ' боссов побеждено'; + if(fill) fill.style.width = (won * 100 / BOSSES.length) + '%'; + if(won >= BOSSES.length){ + const reward = document.getElementById('ch4G-final-reward'); + if(reward && reward.style.display === 'none'){ + reward.style.display = 'block'; + if(!STATE.achievements.has('ch4_done')){ + achievement('ch4_done','Магистр многоугольников и круга'); + addXp(50, 'ch4-bonus'); + bumpProgress('final4', 10); + if(window.confetti){ try{ window.confetti(); }catch(e){} } + } + } + } + } + + BOSSES.forEach((b, idx)=>{ + const goBtn = document.getElementById('bossG4-'+b.n+'-go'); + const hintBtn = document.getElementById('bossG4-'+b.n+'-hint'); + const ansInp = document.getElementById('bossG4-'+b.n+'-ans'); + if(BOSS_STATE[idx].defeated) markDefeatedUI(b, idx); + goBtn.addEventListener('click', ()=>{ + if(BOSS_STATE[idx].defeated) return; + const fb = document.getElementById('bossG4-'+b.n+'-fb'); + const raw = (ansInp.value||'').replace(',', '.').trim(); + const val = parseFloat(raw); + if(isNaN(val) || raw === ''){ feedback(fb, false, '✗ Введи число.'); return; } + const ok = Math.abs(val - b.ans) < 0.05; + if(ok){ + BOSS_STATE[idx].defeated = true; saveBosses(); + feedback(fb, true, '✓ Босс '+b.n+' повержен! +10 XP. '+b.hint); + addXp(10, 'boss-ch4-'+b.n); + bumpProgress('final4', 18); + markDefeatedUI(b, idx); + refreshOverall(); + } else { + feedback(fb, false, '✗ Промах. Попробуй ещё. Подсказка доступна.'); + } + }); + hintBtn.addEventListener('click', ()=>{ + const fb = document.getElementById('bossG4-'+b.n+'-fb'); + fb.className = 'feedback ok'; + fb.innerHTML = 'Подсказка: '+b.hint; + fb.style.display = 'block'; + fb.style.background = 'var(--warn-bg)'; + fb.style.color = '#92400e'; + fb.style.borderLeftColor = 'var(--warn)'; + renderMath(fb); + }); + ansInp.addEventListener('keydown', e=>{ if(e.key === 'Enter') goBtn.click(); }); + }); + + refreshOverall(); } /* ===== Search ===== */