From 58a73365fd7ee0b07e17a7bbfe316ed658135a03 Mon Sep 17 00:00:00 2001 From: Maxim Dolgolyov Date: Fri, 29 May 2026 09:50:25 +0300 Subject: [PATCH] =?UTF-8?q?feat(geom9=20ch1=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=201=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_ch1.html | 242 ++++++++++++++++++++++++- 1 file changed, 234 insertions(+), 8 deletions(-) diff --git a/frontend/textbooks/geometry_9_ch1.html b/frontend/textbooks/geometry_9_ch1.html index a4e8d80..25a986b 100644 --- a/frontend/textbooks/geometry_9_ch1.html +++ b/frontend/textbooks/geometry_9_ch1.html @@ -2395,16 +2395,242 @@ function buildP6(){ } function buildFinal1(){ - const body = document.getElementById('final1-body'); + const box = document.getElementById('final1-body'); let html = ''; - html += makeCard('theory', 'Финал главы 1', '★', ` -

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

-

Раздел Phase 7.

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

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

+
+
+
+ + § 1 · Тригонометрия +
+
$\\sin\\alpha = \\dfrac{a}{c},\\ \\cos\\alpha = \\dfrac{b}{c},\\ \\tan\\alpha = \\dfrac{a}{b},\\ \\cot\\alpha = \\dfrac{1}{\\tan\\alpha}$
+
+
+
+ + § 2 · Решение прямоуг. +
+
Теорема Пифагора: $c^2 = a^2 + b^2$. Достаточно 2 стороны или сторона + угол.
+
+
+
+ + § 3 · Формулы +
+
$\\sin^2\\alpha + \\cos^2\\alpha = 1$. Эталоны $30°/45°/60°$ — из специальных треугольников.
+
+
+
+ + § 4 · Тупой угол +
+
Единичная окружность: $\\sin(180°-\\alpha) = \\sin\\alpha$, $\\cos(180°-\\alpha) = -\\cos\\alpha$.
+
+
+
+ + § 5 · Площадь +
+
$S_\\triangle = \\tfrac{1}{2}ab\\sin C$, $S_{пар} = ab\\sin\\alpha$, $S_{4-уг} = \\tfrac{1}{2}d_1 d_2\\sin\\varphi$.
+
+
+
+ + § 6 · Среднее геом. +
+
Высота к гипотенузе: $h^2 = a_1 b_1$, $a^2 = c \\cdot a_1$, $b^2 = c \\cdot b_1$.
+
+
+
+
`; + + /* Часть Б — 5 боссов */ + html += `
+
+ ${ICONS.rule} + Боссы главы 1 + 5 +
+
+

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

+
+
`; + + html += '
'; + + html += `
+
Прогресс по боссам
+
0 / 5 боссов побеждено
+
+
+
+ +
`; + html += secNav('p6', null); - body.innerHTML = html; - wireReadBtn('final1'); - if(window.renderMathInElement) renderMath(body); + + box.innerHTML = html; + renderMath(box); + + /* Боссы */ + const BOSSES = [ + { + n:1, color:'#10b981', + title:'Сфинкс Тригонометрии', + tag:'§ 1 + § 3', + q:'В прямоугольном треугольнике катеты $a = 3$ и $b = 4$. Чему равен синус большего острого угла?', + ans:0.8, decimal:true, + hint:'Гипотенуза $c = \\sqrt{3^2 + 4^2} = 5$. Больший острый угол лежит против большего катета (4). $\\sin = \\dfrac{4}{5} = 0{,}8$.' + }, + { + n:2, color:'#0891b2', + title:'Минотавр Решения', + tag:'§ 2 + § 1', + q:'В прямоугольном треугольнике $\\angle A = 30°$, гипотенуза $c = 12$. Найди длину катета, противолежащего углу $A$.', + ans:6, decimal:false, + hint:'$a = c \\sin A = 12 \\cdot \\sin 30° = 12 \\cdot \\dfrac{1}{2} = 6$.' + }, + { + n:3, color:'#7c3aed', + title:'Гарпия Тупого Угла', + tag:'§ 4 + § 3', + q:'Вычисли: $\\sin 150° + \\cos 60° = \\,?$', + ans:1, decimal:false, + hint:'$\\sin 150° = \\sin(180°-30°) = \\sin 30° = \\dfrac{1}{2}$. $\\cos 60° = \\dfrac{1}{2}$. Сумма $= 1$.' + }, + { + n:4, color:'#dc2626', + title:'Дракон Площади', + tag:'§ 5 + § 1', + q:'Треугольник со сторонами $a = 8$, $b = 5$ и углом $C = 30°$ между ними. Найди площадь $S$.', + ans:10, decimal:false, + hint:'$S = \\dfrac{1}{2} ab \\sin C = \\dfrac{1}{2} \\cdot 8 \\cdot 5 \\cdot \\sin 30° = 20 \\cdot \\dfrac{1}{2} = 10$.' + }, + { + n:5, color:'#f59e0b', + title:'Мастер Прямоугольного', + tag:'§§ 1-6 — синтез', + q:'В прямоугольном треугольнике катеты $a = 6$, $b = 8$. Из прямого угла опущена высота на гипотенузу. Найди её длину.', + ans:4.8, decimal:true, + hint:'Гипотенуза $c = \\sqrt{36+64} = 10$. Из $S = \\dfrac{1}{2}ab = \\dfrac{1}{2}ch$ следует $h = \\dfrac{ab}{c} = \\dfrac{48}{10} = 4{,}8$.' + }, + ]; + + const cont = document.getElementById('ch1G-bosses-container'); + const STATE_KEY = 'geometry9_ch1_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.1"' : '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('bossG1-'+b.n+'-card'); + const goBtn = document.getElementById('bossG1-'+b.n+'-go'); + const ansInp = document.getElementById('bossG1-'+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('ch1G-boss-overall'); + const fill = document.getElementById('ch1G-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('ch1G-final-reward'); + if(reward && reward.style.display === 'none'){ + reward.style.display = 'block'; + if(!STATE.achievements.has('ch1_done')){ + achievement('ch1_done','Мастер прямоугольного треугольника'); + addXp(50, 'ch1-bonus'); + bumpProgress('final1', 10); + if(window.confetti){ try{ window.confetti(); }catch(e){} } + } + } + } + } + + BOSSES.forEach((b, idx)=>{ + const goBtn = document.getElementById('bossG1-'+b.n+'-go'); + const hintBtn = document.getElementById('bossG1-'+b.n+'-hint'); + const ansInp = document.getElementById('bossG1-'+b.n+'-ans'); + if(BOSS_STATE[idx].defeated) markDefeatedUI(b, idx); + goBtn.addEventListener('click', ()=>{ + if(BOSS_STATE[idx].defeated) return; + const fb = document.getElementById('bossG1-'+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-ch1-'+b.n); + bumpProgress('final1', 18); + markDefeatedUI(b, idx); + refreshOverall(); + } else { + feedback(fb, false, '✗ Промах. Попробуй ещё. Подсказка доступна.'); + } + }); + hintBtn.addEventListener('click', ()=>{ + const fb = document.getElementById('bossG1-'+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 ===== */