From d0cfff38c15b9128f34532ababa0315ff75fcc6d Mon Sep 17 00:00:00 2001 From: Maxim Dolgolyov Date: Fri, 29 May 2026 08:45:17 +0300 Subject: [PATCH] =?UTF-8?q?feat(alg9=20ch3=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=203=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/algebra_9_ch3.html | 211 ++++++++++++++++++++++++-- 1 file changed, 197 insertions(+), 14 deletions(-) diff --git a/frontend/textbooks/algebra_9_ch3.html b/frontend/textbooks/algebra_9_ch3.html index c77bb51..99f1252 100644 --- a/frontend/textbooks/algebra_9_ch3.html +++ b/frontend/textbooks/algebra_9_ch3.html @@ -1741,21 +1741,204 @@ function buildP13(){ } function buildFinal3(){ - const root = document.getElementById('final3-body'); - root.innerHTML = ` -
-
- ${ICONS.theory} - В разработке - + const box = document.getElementById('final3-body'); + let html = ''; + + /* Часть А — Шпаргалка главы (4 mini-карточки) */ + html += `
+
+ ${ICONS.theory} + Шпаргалка главы 3 + Итог +
+
+

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

+
+
+
§ 10 · Дробно-рац. уравнения
+
$\\dfrac{P(x)}{Q(x)} = 0 \\Leftrightarrow P(x) = 0,\\ Q(x) \\ne 0$. Корни, при которых знаменатель $=0$ — посторонние!
+
+
+
§ 11 · Системы нелинейных
+
Подстановка (выразить переменную) или сложение. Решения — точки пересечения графиков.
+
+
+
§ 12 · Окружность
+
$|AB| = \\sqrt{(x_2-x_1)^2 + (y_2-y_1)^2}$. Окр.: $(x-a)^2 + (y-b)^2 = R^2$, центр $(a;b)$, радиус $R$.
+
+
+
§ 13 · Метод интервалов
+
Корни на прямой $\\to$ знаки чередуются $\\to$ выбрать подходящие интервалы. Корни знаменателя — выколоты!
+
-
-

Содержание финала главы Финал главы — в разработке будет добавлено в следующих обновлениях.

-

Боссы и итоговые задания будут добавлены в Phase 1.

-
-
` + secNav('p13', null) + readButton('final3'); - renderMath(root); - wireReadBtn('final3'); +
+
`; + + /* Часть Б — 5 боссов */ + html += `
+
+ ${ICONS.rule} + Боссы главы 3 + 5 +
+
+

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

+
+
`; + + html += '
'; + + html += `
+
Прогресс по боссам
+
0 / 5 боссов побеждено
+
+
+
+ +
`; + + html += secNav('p13', null); + + box.innerHTML = html; + renderMath(box); + + /* Боссы */ + const BOSSES = [ + { + n:1, color:'#10b981', + title:'Циклоп Уравнений', + tag:'§ 10 + § 13', + q:'Реши уравнение $\\dfrac{x^2 - 9}{x - 3} = 0$. Сколько корней у уравнения?', + ans:1, + hint:'$x^2 - 9 = 0 \\Rightarrow x = \\pm 3$. ОДЗ: $x \\ne 3$. Значит $x = 3$ — посторонний. Остаётся $x = -3$. Итого: 1 корень.' + }, + { + n:2, color:'#0891b2', + title:'Гарпия Систем', + tag:'§ 11 + § 12', + q:'Сколько решений у системы $\\begin{cases} x^2 + y^2 = 25 \\\\ y = x + 1 \\end{cases}$?', + ans:2, + hint:'Подставим: $x^2 + (x+1)^2 = 25 \\Rightarrow 2x^2 + 2x - 24 = 0 \\Rightarrow x^2 + x - 12 = 0 \\Rightarrow x = 3$ или $x = -4$. 2 решения.' + }, + { + n:3, color:'#7c3aed', + title:'Сирена Окружности', + tag:'§ 12 + основы', + q:'Найди радиус $R$ окружности $x^2 + y^2 - 6x + 4y - 12 = 0$.', + ans:5, + hint:'Выделим полные квадраты: $(x-3)^2 + (y+2)^2 = 12 + 9 + 4 = 25 \\Rightarrow R^2 = 25 \\Rightarrow R = 5$.' + }, + { + n:4, color:'#dc2626', + title:'Минотавр Интервалов', + tag:'§ 13 + § 10', + q:'Реши $\\dfrac{x(x-4)}{x+2} \\ge 0$. Сколько целых значений $x$ из отрезка $[-5;\\ 5]$ удовлетворяют неравенству?', + ans:4, + hint:'Корни числителя $0, 4$ (закрашены), корень знаменателя $-2$ (выколота). Знак справа $(x=10)$: $+$. Чередование: $-, +, -, +$. Решение: $(-2;\\ 0] \\cup [4;\\ +\\infty)$. Целые в $[-5;5]$: $\\{-1, 0, 4, 5\\}$ — 4 значения.' + }, + { + n:5, color:'#f59e0b', + title:'Мастер Глубин', + tag:'§§ 10–13 — синтез', + q:'Сколько решений у системы $\\begin{cases} (x-1)^2 + (y-2)^2 = 25 \\\\ y = x + 1 \\end{cases}$?', + ans:2, + hint:'Подставим $y = x + 1$: $(x-1)^2 + (x-1)^2 = 25 \\Rightarrow 2(x-1)^2 = 25 \\Rightarrow (x-1)^2 = 12{,}5$. Корней 2 (квадратное с $D > 0$).' + }, + ]; + + const cont = document.getElementById('ch3-bosses-container'); + const STATE_KEY = 'algebra9_ch3_bosses'; + const BOSS_STATE = (function(){ + try{ const s = localStorage.getItem(STATE_KEY); if(s) return JSON.parse(s); }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)=>{ + return '
' + +'
' + +'' + +'
Босс '+b.n+': '+b.title+'
' + +'
'+b.tag+'
' + +'
' + +'
'+b.q+'
' + +'
' + +'ответ =' + +'' + +'' + +'' + +'
' + +'' + +'
'; + }).join(''); + renderMath(cont); + + function refreshOverall(){ + const won = BOSS_STATE.filter(s => s.defeated).length; + const txt = document.getElementById('ch3-boss-overall'); + const fill = document.getElementById('ch3-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('ch3-final-reward'); + if(reward && reward.style.display === 'none'){ + reward.style.display = 'block'; + if(!STATE.achievements.has('ch3_done')){ + achievement('ch3_done','Мастер дробно-рациональных'); + addXp(50, 'ch3-bonus'); + bumpProgress('final3', 30); + if(window.confetti){ try{ confetti(); }catch(e){} } + } + } + } + } + + BOSSES.forEach((b, idx)=>{ + const card = document.getElementById('boss3-'+b.n+'-card'); + const goBtn = document.getElementById('boss3-'+b.n+'-go'); + const hintBtn = document.getElementById('boss3-'+b.n+'-hint'); + const ansInp = document.getElementById('boss3-'+b.n+'-ans'); + if(BOSS_STATE[idx].defeated){ + card.style.background = 'linear-gradient(135deg,var(--sec-acc-soft),var(--pri-soft))'; + goBtn.disabled = true; goBtn.style.opacity = .55; goBtn.textContent = '✓ Повержен'; + ansInp.disabled = true; + } + goBtn.addEventListener('click', ()=>{ + if(BOSS_STATE[idx].defeated) return; + const fb = document.getElementById('boss3-'+b.n+'-fb'); + const val = parseInt(ansInp.value, 10); + if(isNaN(val)){ feedback(fb, false, '✗ Введи целое число.'); return; } + if(val === b.ans){ + BOSS_STATE[idx].defeated = true; saveBosses(); + feedback(fb, true, '✓ Босс '+b.n+' повержен! +10 XP. '+b.hint); + addXp(10, 'boss-ch3-'+b.n); + bumpProgress('final3', 18); + goBtn.disabled = true; goBtn.style.opacity = .55; goBtn.textContent = '✓ Повержен'; + ansInp.disabled = true; + card.style.background = 'linear-gradient(135deg,var(--sec-acc-soft),var(--pri-soft))'; + refreshOverall(); + } else { + feedback(fb, false, '✗ Промах. Попробуй ещё. Подсказка доступна.'); + } + }); + hintBtn.addEventListener('click', ()=>{ + const fb = document.getElementById('boss3-'+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 ===== */