feat(phys10 ch3 wave5 + final): §24 «Энергия конденсатора» + Финал Главы 3 (7 боссов)
This commit is contained in:
@@ -3494,35 +3494,600 @@ function build_p23(){
|
||||
function build_p24(){
|
||||
const box = document.getElementById('p24-body');
|
||||
let html = '';
|
||||
html += makeCard('theory', "Энергия поля конденсатора", "§24", `
|
||||
<p><b>Энергия поля конденсатора</b> — этот параграф в разработке (Phase 1+).</p>
|
||||
<p>Здесь появятся: теория, формулы, разобранные примеры и 3–4 интерактива в стиле «алгебры 11» — таблицы, симуляции, ползунки, drag-and-drop и автопроверяемые тренажёры.</p>
|
||||
<p style="margin-top:10px;padding:10px 14px;background:var(--sec-acc-soft);border-radius:9px;font-size:.92rem">
|
||||
<b>Phase 0:</b> создан скелет учебника. <b>Phase 3+:</b> наполнение этого § содержанием по учебнику «Физика 10» (Беларусь, 2019).
|
||||
</p>
|
||||
|
||||
/* THEORY 1 — Энергия заряженного конденсатора */
|
||||
html += makeCard('theory', "Энергия заряженного конденсатора", "§24", `
|
||||
<p>Заряженный конденсатор обладает <b>запасённой энергией</b>. Чтобы зарядить конденсатор, источник тока совершает работу — переносит заряды с одной обкладки на другую против сил электрического поля.</p>
|
||||
<p>Если рассчитать эту работу через интегрирование, получим, что <b>энергия конденсатора</b> равна:</p>
|
||||
<p style="text-align:center;margin:10px 0">$$W = \\dfrac{CU^2}{2}$$</p>
|
||||
<p>Используя соотношение $q = CU$ ($C = q/U$, $U = q/C$), эту формулу можно переписать ещё двумя способами:</p>
|
||||
<p style="text-align:center;margin:10px 0">$$W = \\dfrac{q^2}{2C} = \\dfrac{qU}{2}$$</p>
|
||||
<p>Все три формулы <b>эквивалентны</b> — выбирай удобную в зависимости от того, какие величины даны в задаче:</p>
|
||||
<ul style="margin:6px 0 6px 18px">
|
||||
<li>Известны $C$ и $U$ → $W = CU^2/2$.</li>
|
||||
<li>Известны $q$ и $C$ → $W = q^2/(2C)$.</li>
|
||||
<li>Известны $q$ и $U$ → $W = qU/2$.</li>
|
||||
</ul>
|
||||
<p style="margin-top:10px;padding:10px 14px;background:var(--sec-acc-soft);border-radius:9px"><b>Единица энергии:</b> Джоуль (Дж). На практике в электронике: мДж $= 10^{-3}$ Дж, мкДж $= 10^{-6}$ Дж.</p>
|
||||
`);
|
||||
|
||||
/* THEORY 2 — Где запасена энергия */
|
||||
html += makeCard('rule', "Где запасена энергия. Плотность энергии поля", "§24", `
|
||||
<p>Где же находится энергия конденсатора? Не на пластинах и не в зарядах. <b>Энергия запасена в электрическом поле</b> между обкладками.</p>
|
||||
<p>Это глубокий вывод: <b>электрическое поле — носитель энергии</b>, как и материя. Энергию можно вычислить через характеристики самого поля.</p>
|
||||
<p style="margin-top:10px"><b>Объёмная плотность энергии</b> — энергия в единице объёма поля:</p>
|
||||
<p style="text-align:center;margin:10px 0">$$w = \\dfrac{\\varepsilon \\varepsilon_0 E^2}{2}$$</p>
|
||||
<ul style="margin:6px 0 6px 18px">
|
||||
<li>$w$ — плотность энергии в Дж/м³</li>
|
||||
<li>$E$ — напряжённость поля в В/м</li>
|
||||
<li>$\\varepsilon$ — относительная диэлектрическая проницаемость среды</li>
|
||||
<li>$\\varepsilon_0 = 8{,}85 \\cdot 10^{-12}$ Ф/м — электрическая постоянная</li>
|
||||
</ul>
|
||||
<p style="margin-top:10px">Полная энергия поля в объёме $V$:</p>
|
||||
<p style="text-align:center;margin:10px 0">$$W = w \\cdot V$$</p>
|
||||
<p style="padding:10px 14px;background:var(--warn-bg,#fef3c7);border-left:4px solid var(--warn,#f59e0b);border-radius:9px"><b>Проверка:</b> для плоского конденсатора $E = U/d$, $V = Sd$, $C = \\varepsilon\\varepsilon_0 S/d$. Подставив, получаем $W = \\varepsilon\\varepsilon_0 (U/d)^2 \\cdot Sd / 2 = (\\varepsilon\\varepsilon_0 S/d)\\cdot U^2/2 = CU^2/2$. То же самое!</p>
|
||||
`);
|
||||
|
||||
/* THEORY 3 — Применение */
|
||||
html += makeCard('example', "Применение энергии конденсатора", "§24", `
|
||||
<p>Запасание энергии в конденсаторах используется в технике и медицине очень широко:</p>
|
||||
<ul style="margin:6px 0 6px 18px">
|
||||
<li><b>Фотовспышка:</b> конденсатор медленно заряжается от батареи, затем за миллисекунды разряжается через ксеноновую лампу → яркая вспышка света.</li>
|
||||
<li><b>Импульсные лазеры:</b> накопленная энергия за миллисекунды отдаётся в активную среду для накачки.</li>
|
||||
<li><b>Дефибрилляторы:</b> короткий мощный импульс (сотни Дж) восстанавливает ритм сердца — спасает жизни.</li>
|
||||
<li><b>Источники бесперебойного питания, фильтры:</b> сглаживают пульсации тока и поддерживают питание при просадках.</li>
|
||||
<li><b>Суперконденсаторы в электромобилях:</b> быстрое накопление/отдача энергии при разгоне и торможении.</li>
|
||||
</ul>
|
||||
<p style="margin-top:12px;padding:12px 14px;background:var(--sec-acc-soft);border-radius:10px"><b>Пример (фотовспышка).</b> $C = 1000$ мкФ $= 10^{-3}$ Ф, $U = 300$ В.</p>
|
||||
<p style="text-align:center;margin:10px 0">$$W = \\dfrac{CU^2}{2} = \\dfrac{10^{-3} \\cdot 90\\,000}{2} = 45 \\text{ Дж}$$</p>
|
||||
<p>Это много! Если разряд происходит за $\\Delta t = 1$ мс $= 10^{-3}$ с, мощность вспышки:</p>
|
||||
<p style="text-align:center;margin:10px 0">$$P = \\dfrac{W}{\\Delta t} = \\dfrac{45}{10^{-3}} = 45\\,000 \\text{ Вт} = 45 \\text{ кВт}$$</p>
|
||||
<p>Поэтому фотовспышка такая яркая.</p>
|
||||
`);
|
||||
|
||||
/* INTERACTIVE 1 — Энергия от C и U */
|
||||
html += `<div class="wg" id="p24-iv1">
|
||||
<div class="wg-header"><span class="wg-badge">ИНТЕРАКТИВ 1</span><div class="wg-title">Энергия конденсатора от $C$ и $U$</div></div>
|
||||
<div class="wg-help">Меняй ёмкость $C$ и напряжение $U$. Наблюдай $W = CU^2/2$ и заряд $q = CU$. «Заряжённость» обкладок видна по числу значков «+» и «−».</div>
|
||||
<div class="sliders">
|
||||
<label>$C$: <b id="p24-iv1-CL">100</b> мкФ <input type="range" id="p24-iv1-C" min="1" max="1000" value="100" step="1"></label>
|
||||
<label>$U$: <b id="p24-iv1-UL">100</b> В <input type="range" id="p24-iv1-U" min="10" max="500" value="100" step="5"></label>
|
||||
</div>
|
||||
<div style="background:var(--card);border:1px solid var(--border);border-radius:9px;padding:8px">
|
||||
<svg id="p24-iv1-svg" viewBox="0 0 480 260" width="100%" style="height:auto"></svg>
|
||||
</div>
|
||||
<div id="p24-iv1-out" style="margin-top:10px;padding:10px 14px;background:var(--sec-acc-soft);border-radius:9px;font-size:.94rem;line-height:1.75;text-align:center"></div>
|
||||
</div>`;
|
||||
|
||||
/* INTERACTIVE 2 — Калькулятор энергии */
|
||||
html += `<div class="wg" id="p24-iv2">
|
||||
<div class="wg-header"><span class="wg-badge">ИНТЕРАКТИВ 2</span><div class="wg-title">Калькулятор энергии: 3 формулы</div></div>
|
||||
<div class="wg-help">Выбери формулу, подставь данные, получи $W$. Попробуй все три варианта.</div>
|
||||
<div style="display:flex;gap:8px;justify-content:center;margin-bottom:10px;flex-wrap:wrap">
|
||||
<button class="btn primary" id="p24-iv2-mCU">через $C, U$</button>
|
||||
<button class="btn" id="p24-iv2-mqC">через $q, C$</button>
|
||||
<button class="btn" id="p24-iv2-mqU">через $q, U$</button>
|
||||
</div>
|
||||
<div id="p24-iv2-inputs" style="display:grid;grid-template-columns:1fr 1fr;gap:10px;align-items:end;margin-bottom:10px"></div>
|
||||
<div style="display:flex;justify-content:center;margin-bottom:10px">
|
||||
<button class="btn primary" id="p24-iv2-go">Вычислить $W$</button>
|
||||
</div>
|
||||
<div id="p24-iv2-out" style="padding:12px 14px;background:var(--sec-acc-soft);border-radius:9px;font-size:.95rem;line-height:1.75;text-align:center"></div>
|
||||
</div>`;
|
||||
|
||||
/* INTERACTIVE 3 — Как изменится энергия? */
|
||||
html += `<div class="wg" id="p24-iv3">
|
||||
<div class="wg-header"><span class="wg-badge">ИНТЕРАКТИВ 3</span><div class="wg-title">Как изменится энергия конденсатора?</div></div>
|
||||
<div class="wg-help">Опираясь на формулы $W = CU^2/2 = q^2/(2C) = qU/2$, выбери, как изменится энергия.</div>
|
||||
<div class="score-display"><span>Задача <b id="p24-iv3-i">1</b> / 6</span><span>Очки: <b id="p24-iv3-s">0</b> / 6</span></div>
|
||||
<div id="p24-iv3-q" style="padding:14px;background:var(--sec-acc-soft);border-radius:10px;font-size:1.02rem;margin-bottom:10px;text-align:center;min-height:54px"></div>
|
||||
<div id="p24-iv3-opts" style="display:grid;grid-template-columns:1fr 1fr;gap:8px"></div>
|
||||
<div class="feedback" id="p24-iv3-fb"></div>
|
||||
<div class="actions"><button class="btn" id="p24-iv3-restart">Начать заново</button></div>
|
||||
</div>`;
|
||||
|
||||
/* INTERACTIVE 4 — Тренажёр энергии */
|
||||
html += `<div class="wg" id="p24-iv4">
|
||||
<div class="wg-header"><span class="wg-badge">ИНТЕРАКТИВ 4</span><div class="wg-title">Тренажёр энергии конденсатора</div></div>
|
||||
<div class="wg-help">5 задач. Допуск $\\pm 5\\%$. Внимательно следи за единицами (мкФ, нФ, мкКл, мДж).</div>
|
||||
<div class="score-display"><span>Задача <b id="p24-iv4-i">1</b> / 5</span><span>Очки: <b id="p24-iv4-s">0</b> / 5</span></div>
|
||||
<div id="p24-iv4-q" style="padding:14px;background:var(--sec-acc-soft);border-radius:10px;font-size:1.02rem;margin-bottom:10px;text-align:center;min-height:54px"></div>
|
||||
<div style="display:flex;gap:10px;align-items:center;flex-wrap:wrap;justify-content:center">
|
||||
<span style="font-family:'JetBrains Mono',monospace">ответ =</span>
|
||||
<input type="number" id="p24-iv4-ans" class="tinp" style="width:140px;text-align:center" step="any">
|
||||
<button class="btn primary" id="p24-iv4-go">Проверить</button>
|
||||
<button class="btn" id="p24-iv4-start">Заново</button>
|
||||
</div>
|
||||
<div class="feedback" id="p24-iv4-fb"></div>
|
||||
</div>`;
|
||||
|
||||
html += secNav('p23', 'final3');
|
||||
html += readButton('p24');
|
||||
|
||||
box.innerHTML = html;
|
||||
renderMath(box);
|
||||
|
||||
/* IV1 — Энергия конденсатора (C, U) */
|
||||
(function(){
|
||||
const CS = document.getElementById('p24-iv1-C');
|
||||
const US = document.getElementById('p24-iv1-U');
|
||||
const CL = document.getElementById('p24-iv1-CL');
|
||||
const UL = document.getElementById('p24-iv1-UL');
|
||||
const svg = document.getElementById('p24-iv1-svg');
|
||||
const out = document.getElementById('p24-iv1-out');
|
||||
const seen = new Set();
|
||||
let _done = false;
|
||||
|
||||
function render(){
|
||||
const C_uF = +CS.value; // мкФ
|
||||
const U = +US.value; // В
|
||||
const C = C_uF * 1e-6; // Ф
|
||||
const W = C * U * U / 2; // Дж
|
||||
const q = C * U; // Кл
|
||||
CL.textContent = C_uF;
|
||||
UL.textContent = U;
|
||||
|
||||
// SVG: два прямоугольника-обкладки с зарядами
|
||||
const W_svg = 480, H_svg = 260, cx = W_svg/2, cy = H_svg/2;
|
||||
const plateW = 280, plateH = 14;
|
||||
const gap = 90;
|
||||
const xL = cx - plateW/2;
|
||||
const yTop = cy - gap/2 - plateH;
|
||||
const yBot = cy + gap/2;
|
||||
// Число значков пропорционально q (норм. к диапазону ~ q_max = 1000e-6 * 500 = 0.5 Кл; logarithmically scale)
|
||||
const qMax = 1000e-6 * 500;
|
||||
const ratio = Math.min(1, Math.sqrt(q / qMax));
|
||||
const nSign = Math.max(3, Math.round(3 + ratio * 17)); // 3..20
|
||||
|
||||
let g = '';
|
||||
g += '<rect x="0" y="0" width="'+W_svg+'" height="'+H_svg+'" fill="#fafafa"/>';
|
||||
g += '<text x="'+cx+'" y="22" text-anchor="middle" font-family="Inter,sans-serif" font-size="13" font-weight="700" fill="#0f172a">Заряд на обкладках</text>';
|
||||
// Поле (стрелки между пластинами)
|
||||
const yMid = (yTop+plateH + yBot)/2;
|
||||
for(let i = 0; i < 5; i++){
|
||||
const x = xL + 30 + i*(plateW-60)/4;
|
||||
g += '<line x1="'+x+'" y1="'+(yTop+plateH+4)+'" x2="'+x+'" y2="'+(yBot-4)+'" stroke="#0ea5e9" stroke-width="1.4" stroke-dasharray="3,3" opacity="0.6"/>';
|
||||
g += '<polygon points="'+(x-4)+','+(yBot-8)+' '+(x+4)+','+(yBot-8)+' '+x+','+(yBot-2)+'" fill="#0ea5e9" opacity="0.6"/>';
|
||||
}
|
||||
// Верхняя обкладка (+)
|
||||
g += '<rect x="'+xL+'" y="'+yTop+'" width="'+plateW+'" height="'+plateH+'" fill="#fecaca" stroke="#dc2626" stroke-width="2"/>';
|
||||
// Нижняя обкладка (−)
|
||||
g += '<rect x="'+xL+'" y="'+yBot+'" width="'+plateW+'" height="'+plateH+'" fill="#bfdbfe" stroke="#2563eb" stroke-width="2"/>';
|
||||
// Значки + сверху
|
||||
for(let i = 0; i < nSign; i++){
|
||||
const x = xL + 14 + i*(plateW-28)/(nSign-1 || 1);
|
||||
g += '<text x="'+x+'" y="'+(yTop+plateH-2)+'" text-anchor="middle" font-family="Inter,sans-serif" font-size="13" font-weight="700" fill="#dc2626">+</text>';
|
||||
}
|
||||
// Значки − снизу
|
||||
for(let i = 0; i < nSign; i++){
|
||||
const x = xL + 14 + i*(plateW-28)/(nSign-1 || 1);
|
||||
g += '<text x="'+x+'" y="'+(yBot+plateH-2)+'" text-anchor="middle" font-family="Inter,sans-serif" font-size="14" font-weight="700" fill="#2563eb">−</text>';
|
||||
}
|
||||
// Подписи U и q
|
||||
g += '<text x="'+(xL-12)+'" y="'+(yTop+plateH+4)+'" text-anchor="end" font-family="JetBrains Mono,monospace" font-size="12" font-weight="700" fill="#dc2626">+q</text>';
|
||||
g += '<text x="'+(xL-12)+'" y="'+(yBot+plateH-2)+'" text-anchor="end" font-family="JetBrains Mono,monospace" font-size="12" font-weight="700" fill="#2563eb">−q</text>';
|
||||
g += '<text x="'+(xL+plateW+12)+'" y="'+(yMid+4)+'" font-family="JetBrains Mono,monospace" font-size="12" font-weight="700" fill="#0ea5e9">U</text>';
|
||||
|
||||
svg.innerHTML = g;
|
||||
|
||||
// Вывод
|
||||
let WStr;
|
||||
if(W >= 1) WStr = W.toFixed(2) + ' Дж';
|
||||
else if(W >= 1e-3) WStr = (W*1e3).toFixed(2) + ' мДж';
|
||||
else WStr = (W*1e6).toFixed(2) + ' мкДж';
|
||||
let qStr;
|
||||
if(q >= 1e-3) qStr = (q*1e3).toFixed(2) + ' мКл';
|
||||
else qStr = (q*1e6).toFixed(2) + ' мкКл';
|
||||
|
||||
out.innerHTML = '<b>$W = \\dfrac{CU^2}{2} = \\dfrac{'+C_uF+'\\cdot 10^{-6} \\cdot '+U+'^2}{2} \\approx$ '+WStr+'</b><br><span style="color:var(--muted);font-size:.9rem">$q = CU = $ '+qStr+'</span>';
|
||||
renderMath(out);
|
||||
|
||||
seen.add(C_uF+':'+U);
|
||||
if(!_done && seen.size >= 4){ _done = true; addXp(10, 'p24-iv1'); bumpProgress('p24', 15); }
|
||||
}
|
||||
CS.addEventListener('input', render);
|
||||
US.addEventListener('input', render);
|
||||
render();
|
||||
})();
|
||||
|
||||
/* IV2 — Калькулятор энергии (3 формулы) */
|
||||
(function(){
|
||||
let mode = 'CU';
|
||||
const mCU = document.getElementById('p24-iv2-mCU');
|
||||
const mqC = document.getElementById('p24-iv2-mqC');
|
||||
const mqU = document.getElementById('p24-iv2-mqU');
|
||||
const inputs = document.getElementById('p24-iv2-inputs');
|
||||
const out = document.getElementById('p24-iv2-out');
|
||||
const seen = new Set();
|
||||
let _done = false;
|
||||
|
||||
function setMode(m){
|
||||
mode = m;
|
||||
[mCU,mqC,mqU].forEach(b => b.classList.remove('primary'));
|
||||
if(m === 'CU') mCU.classList.add('primary');
|
||||
else if(m === 'qC') mqC.classList.add('primary');
|
||||
else mqU.classList.add('primary');
|
||||
render();
|
||||
}
|
||||
function render(){
|
||||
if(mode === 'CU'){
|
||||
inputs.innerHTML = '<label>$C$ (мкФ): <input type="number" id="p24-iv2-C" class="tinp" value="100" step="1" min="0.1" style="width:100%"></label>'
|
||||
+ '<label>$U$ (В): <input type="number" id="p24-iv2-U" class="tinp" value="100" step="1" min="0.1" style="width:100%"></label>';
|
||||
} else if(mode === 'qC'){
|
||||
inputs.innerHTML = '<label>$q$ (мкКл): <input type="number" id="p24-iv2-q" class="tinp" value="20" step="0.1" min="0.001" style="width:100%"></label>'
|
||||
+ '<label>$C$ (мкФ): <input type="number" id="p24-iv2-C" class="tinp" value="10" step="0.1" min="0.001" style="width:100%"></label>';
|
||||
} else {
|
||||
inputs.innerHTML = '<label>$q$ (мкКл): <input type="number" id="p24-iv2-q" class="tinp" value="20" step="0.1" min="0.001" style="width:100%"></label>'
|
||||
+ '<label>$U$ (В): <input type="number" id="p24-iv2-U" class="tinp" value="100" step="1" min="0.1" style="width:100%"></label>';
|
||||
}
|
||||
renderMath(inputs);
|
||||
out.innerHTML = '<span style="color:var(--muted)">Введи значения и нажми «Вычислить $W$».</span>';
|
||||
renderMath(out);
|
||||
}
|
||||
function calc(){
|
||||
let W = 0, html = '';
|
||||
if(mode === 'CU'){
|
||||
const Cuf = parseFloat(document.getElementById('p24-iv2-C').value) || 0;
|
||||
const U = parseFloat(document.getElementById('p24-iv2-U').value) || 0;
|
||||
const C = Cuf * 1e-6;
|
||||
W = C * U * U / 2;
|
||||
html = '<b>$W = \\dfrac{CU^2}{2} = \\dfrac{'+Cuf+'\\cdot 10^{-6} \\cdot '+U+'^2}{2} = '+W.toExponential(3)+'$ Дж</b>';
|
||||
} else if(mode === 'qC'){
|
||||
const quc = parseFloat(document.getElementById('p24-iv2-q').value) || 0;
|
||||
const Cuf = parseFloat(document.getElementById('p24-iv2-C').value) || 0;
|
||||
const q = quc * 1e-6, C = Cuf * 1e-6;
|
||||
W = (C > 0) ? (q*q / (2*C)) : 0;
|
||||
html = '<b>$W = \\dfrac{q^2}{2C} = \\dfrac{('+quc+'\\cdot 10^{-6})^2}{2 \\cdot '+Cuf+'\\cdot 10^{-6}} = '+W.toExponential(3)+'$ Дж</b>';
|
||||
} else {
|
||||
const quc = parseFloat(document.getElementById('p24-iv2-q').value) || 0;
|
||||
const U = parseFloat(document.getElementById('p24-iv2-U').value) || 0;
|
||||
const q = quc * 1e-6;
|
||||
W = q * U / 2;
|
||||
html = '<b>$W = \\dfrac{qU}{2} = \\dfrac{'+quc+'\\cdot 10^{-6} \\cdot '+U+'}{2} = '+W.toExponential(3)+'$ Дж</b>';
|
||||
}
|
||||
// Дополнительный перевод в удобные единицы
|
||||
let extra = '';
|
||||
if(W >= 1) extra = '$\\approx '+W.toFixed(3)+'$ Дж';
|
||||
else if(W >= 1e-3) extra = '$\\approx '+(W*1e3).toFixed(3)+'$ мДж';
|
||||
else if(W > 0) extra = '$\\approx '+(W*1e6).toFixed(3)+'$ мкДж';
|
||||
out.innerHTML = html + (extra ? '<br><span style="font-size:.92rem">'+extra+'</span>' : '');
|
||||
renderMath(out);
|
||||
seen.add(mode);
|
||||
if(!_done && seen.size >= 3){ _done = true; addXp(10, 'p24-iv2'); bumpProgress('p24', 15); }
|
||||
}
|
||||
mCU.addEventListener('click', () => setMode('CU'));
|
||||
mqC.addEventListener('click', () => setMode('qC'));
|
||||
mqU.addEventListener('click', () => setMode('qU'));
|
||||
document.getElementById('p24-iv2-go').addEventListener('click', calc);
|
||||
setMode('CU');
|
||||
})();
|
||||
|
||||
/* IV3 — Как изменится энергия? (6 заданий, 4 варианта) */
|
||||
(function(){
|
||||
const OPTS = ['увеличится в 2 раза', 'уменьшится в 2 раза', 'увеличится в 4 раза', 'не изменится'];
|
||||
// ans: 0 = увеличится в 2 раза, 1 = уменьшится в 2 раза, 2 = увеличится в 4 раза, 3 = не изменится
|
||||
const Q = [
|
||||
{ q:'Удвоили $U$ при том же $C$. Как изменится $W$?', ans:2, why:'$W = CU^2/2$: $U$ удваивается $\\Rightarrow W$ растёт в $2^2 = 4$ раза.' },
|
||||
{ q:'Удвоили $C$ при том же $U$. Как изменится $W$?', ans:0, why:'$W = CU^2/2$: $C$ удваивается $\\Rightarrow W$ растёт в 2 раза.' },
|
||||
{ q:'Удвоили заряд $q$ при том же $C$. Как изменится $W$?', ans:2, why:'$W = q^2/(2C)$: $q$ удваивается $\\Rightarrow W$ растёт в $2^2 = 4$ раза.' },
|
||||
{ q:'Уменьшили $C$ в 2 раза при том же заряде $q$. Как изменится $W$?', ans:0, why:'$W = q^2/(2C)$: $C$ в знаменателе уменьшается в 2 раза $\\Rightarrow W$ растёт в 2 раза.' },
|
||||
{ q:'Уменьшили $U$ в 2 раза, а $C$ увеличили в 4 раза. Как изменится $W$?', ans:3, why:'$W = CU^2/2$: $U^2$ упало в 4 раза, $C$ выросло в 4 раза $\\Rightarrow$ $W$ не меняется.' },
|
||||
{ q:'Зарядили конденсатор с 100 В до 200 В при том же $C$. Как изменилась $W$?', ans:2, why:'$W \\propto U^2$: $(200/100)^2 = 4$ — $W$ увеличилась в 4 раза.' },
|
||||
];
|
||||
|
||||
let i = 0, score = 0;
|
||||
const qEl = document.getElementById('p24-iv3-q');
|
||||
const oEl = document.getElementById('p24-iv3-opts');
|
||||
const fb = document.getElementById('p24-iv3-fb');
|
||||
const iEl = document.getElementById('p24-iv3-i');
|
||||
const sEl = document.getElementById('p24-iv3-s');
|
||||
// Update score-display total to actual length
|
||||
const total = Q.length;
|
||||
document.querySelector('#p24-iv3 .score-display').innerHTML =
|
||||
'<span>Задача <b id="p24-iv3-i">1</b> / '+total+'</span><span>Очки: <b id="p24-iv3-s">0</b> / '+total+'</span>';
|
||||
const iEl2 = document.getElementById('p24-iv3-i');
|
||||
const sEl2 = document.getElementById('p24-iv3-s');
|
||||
|
||||
function show(){
|
||||
if(i >= Q.length){
|
||||
qEl.innerHTML = '<b>Готово!</b> Результат: ' + score + ' / ' + Q.length;
|
||||
oEl.innerHTML = '';
|
||||
if(score === Q.length){ addXp(15, 'p24-iv3'); bumpProgress('p24', 25); }
|
||||
else if(score >= 4){ addXp(8, 'p24-iv3'); bumpProgress('p24', 15); }
|
||||
return;
|
||||
}
|
||||
iEl2.textContent = (i+1);
|
||||
sEl2.textContent = score;
|
||||
const item = Q[i];
|
||||
qEl.innerHTML = item.q;
|
||||
oEl.innerHTML = OPTS.map((t, k) => '<button class="btn primary" data-v="' + k + '">' + t + '</button>').join('');
|
||||
fb.style.display = 'none';
|
||||
renderMath(qEl); renderMath(oEl);
|
||||
oEl.querySelectorAll('button').forEach(b => {
|
||||
b.addEventListener('click', () => {
|
||||
const v = +b.dataset.v;
|
||||
if(v === item.ans){ score++; feedback(fb, true, '✓ Верно! ' + item.why + ' Дальше ▶'); }
|
||||
else feedback(fb, false, '✗ Неверно. ' + item.why + ' Дальше ▶');
|
||||
sEl2.textContent = score;
|
||||
oEl.querySelectorAll('button').forEach(x => x.disabled = true);
|
||||
i++;
|
||||
setTimeout(show, 2000);
|
||||
});
|
||||
});
|
||||
}
|
||||
document.getElementById('p24-iv3-restart').addEventListener('click', () => { i = 0; score = 0; show(); });
|
||||
show();
|
||||
})();
|
||||
|
||||
/* IV4 — Тренажёр энергии */
|
||||
(function(){
|
||||
const Q = [
|
||||
{ q:'$C = 100$ мкФ, $U = 100$ В. Найди $W$ в Дж (до сотых).', ans:0.5, tol:0.03, hint:'$W = CU^2/2 = 10^{-4}\\cdot 10^4/2 = 0{,}5$ Дж.' },
|
||||
{ q:'$C = 1000$ мкФ, $U = 300$ В (фотовспышка). Найди $W$ в Дж.', ans:45, tol:2.5, hint:'$W = CU^2/2 = 10^{-3}\\cdot 9\\cdot 10^4/2 = 45$ Дж.' },
|
||||
{ q:'$q = 10$ мкКл, $U = 200$ В. Найди $W$ в мДж.', ans:1, tol:0.06, hint:'$W = qU/2 = 10^{-5}\\cdot 200/2 = 10^{-3}$ Дж $= 1$ мДж.' },
|
||||
{ q:'$q = 20$ мкКл, $C = 200$ нФ. Найди $W$ в мДж.', ans:1, tol:0.06, hint:'$W = q^2/(2C) = (2\\cdot 10^{-5})^2/(2\\cdot 2\\cdot 10^{-7}) = 4\\cdot 10^{-10}/(4\\cdot 10^{-7}) = 10^{-3}$ Дж $= 1$ мДж.' },
|
||||
{ q:'Если удвоить $U$ конденсатора при $C = $ const, во сколько раз вырастет $W$?', ans:4, tol:0.1, hint:'$W \\propto U^2$: $(2U)^2/U^2 = 4$.' }
|
||||
];
|
||||
let i = 0, score = 0;
|
||||
function show(){
|
||||
if(i >= Q.length){
|
||||
document.getElementById('p24-iv4-q').innerHTML = '<b>Готово!</b> Результат: ' + score + ' / ' + Q.length;
|
||||
if(score === Q.length){ addXp(15, 'p24-iv4'); bumpProgress('p24', 25); }
|
||||
else if(score >= 3){ addXp(8, 'p24-iv4'); bumpProgress('p24', 15); }
|
||||
return;
|
||||
}
|
||||
document.getElementById('p24-iv4-i').textContent = (i+1);
|
||||
document.getElementById('p24-iv4-s').textContent = score;
|
||||
document.getElementById('p24-iv4-q').innerHTML = Q[i].q;
|
||||
document.getElementById('p24-iv4-ans').value = '';
|
||||
renderMath(document.getElementById('p24-iv4-q'));
|
||||
document.getElementById('p24-iv4-fb').style.display = 'none';
|
||||
}
|
||||
function go(){
|
||||
if(i >= Q.length) return;
|
||||
const fb = document.getElementById('p24-iv4-fb');
|
||||
const raw = document.getElementById('p24-iv4-ans').value.replace(',', '.');
|
||||
const ans = parseFloat(raw);
|
||||
if(isNaN(ans)){ feedback(fb, false, '✗ Введи число.'); return; }
|
||||
if(Math.abs(ans - Q[i].ans) <= Q[i].tol + 0.001){ score++; feedback(fb, true, '✓ Верно! '+Q[i].hint+' Дальше ▶'); }
|
||||
else feedback(fb, false, '✗ Неверно. Ответ: $'+Q[i].ans+'$. '+Q[i].hint+' Дальше ▶');
|
||||
document.getElementById('p24-iv4-s').textContent = score;
|
||||
i++;
|
||||
setTimeout(show, 1800);
|
||||
}
|
||||
document.getElementById('p24-iv4-go').addEventListener('click', go);
|
||||
document.getElementById('p24-iv4-ans').addEventListener('keydown', e => { if(e.key === 'Enter') go(); });
|
||||
document.getElementById('p24-iv4-start').addEventListener('click', () => { i = 0; score = 0; show(); });
|
||||
show();
|
||||
})();
|
||||
|
||||
wireReadBtn('p24');
|
||||
}
|
||||
|
||||
function build_final3(){
|
||||
const box = document.getElementById('final3-body');
|
||||
let html = '';
|
||||
html += makeCard('theory', "Финал главы 3", "★", `
|
||||
<p><b>Финал главы 3</b> — этот параграф в разработке (Phase 1+).</p>
|
||||
<p>Здесь появятся: теория, формулы, разобранные примеры и 3–4 интерактива в стиле «алгебры 11» — таблицы, симуляции, ползунки, drag-and-drop и автопроверяемые тренажёры.</p>
|
||||
<p style="margin-top:10px;padding:10px 14px;background:var(--sec-acc-soft);border-radius:9px;font-size:.92rem">
|
||||
<b>Phase 0:</b> создан скелет учебника. <b>Phase 3+:</b> наполнение этого § содержанием по учебнику «Физика 10» (Беларусь, 2019).
|
||||
</p>
|
||||
`);
|
||||
|
||||
/* Часть А — Шпаргалка главы (9 mini-карточек) */
|
||||
const SHEET = [
|
||||
{ t:'§ 16 · Заряд', icon:'<svg viewBox="0 0 24 24" fill="none" stroke="#dc2626" stroke-width="2" style="width:18px;height:18px"><circle cx="12" cy="12" r="9"/><text x="12" y="16" text-anchor="middle" font-size="12" font-weight="700" fill="#dc2626">+</text></svg>', body:'$q = ne$, $e = 1{,}6 \\cdot 10^{-19}$ Кл. Закон сохранения: $\\sum q = $ const.' },
|
||||
{ t:'§ 17 · Кулон', icon:'<svg viewBox="0 0 24 24" fill="none" stroke="#7c3aed" stroke-width="2" style="width:18px;height:18px"><circle cx="6" cy="12" r="3"/><circle cx="18" cy="12" r="3"/><path d="M9 12h6"/></svg>', body:'$F = k\\dfrac{q_1 q_2}{r^2}$, $k = 9\\cdot 10^9$ Н·м²/Кл². В среде: $F = F_0/\\varepsilon$.' },
|
||||
{ t:'§ 18 · Поле', icon:'<svg viewBox="0 0 24 24" fill="none" stroke="#0ea5e9" stroke-width="2" style="width:18px;height:18px"><circle cx="12" cy="12" r="3"/><path d="M12 5v2"/><path d="M12 17v2"/><path d="M5 12h2"/><path d="M17 12h2"/></svg>', body:'Создаётся неподвижными зарядами, действует на заряды. Пробный заряд $q_0$ — для измерения.' },
|
||||
{ t:'§ 19 · Напряжённость', icon:'<svg viewBox="0 0 24 24" fill="none" stroke="#f59e0b" stroke-width="2" style="width:18px;height:18px"><path d="M4 12h14"/><polyline points="14 7 19 12 14 17"/></svg>', body:'$\\vec{E} = \\vec{F}/q$. Точечный: $E = kq/r^2$. Принцип суперпозиции — векторно.' },
|
||||
{ t:'§ 20 · Линии', icon:'<svg viewBox="0 0 24 24" fill="none" stroke="#10b981" stroke-width="2" style="width:18px;height:18px"><path d="M5 4c4 4 10 4 14 0"/><path d="M5 12c4 4 10 4 14 0"/><path d="M5 20c4 4 10 4 14 0"/></svg>', body:'Касательны к $\\vec{E}$. От + к −, не пересекаются. Густота = $E$. Однородное поле — параллельные линии.' },
|
||||
{ t:'§ 21 · Работа · потенциал', icon:'<svg viewBox="0 0 24 24" fill="none" stroke="#8b5cf6" stroke-width="2" style="width:18px;height:18px"><path d="M4 18l8-12 8 12"/></svg>', body:'$A = qEd\\cos\\alpha = q(\\varphi_1-\\varphi_2)$. $\\varphi = kq/r$. Работа не зависит от траектории.' },
|
||||
{ t:'§ 22 · Напряжение', icon:'<svg viewBox="0 0 24 24" fill="none" stroke="#06b6d4" stroke-width="2" style="width:18px;height:18px"><path d="M4 6h16"/><path d="M4 12h16"/><path d="M4 18h10"/></svg>', body:'$U = \\varphi_1 - \\varphi_2$ [В]. В однородном: $U = Ed$. Эквипотенциальные поверхности $\\perp \\vec{E}$.' },
|
||||
{ t:'§ 23 · Конденсаторы', icon:'<svg viewBox="0 0 24 24" fill="none" stroke="#0891b2" stroke-width="2" style="width:18px;height:18px"><path d="M4 8v8"/><path d="M9 6v12"/><path d="M15 6v12"/><path d="M20 8v8"/></svg>', body:'$C = q/U$ [Ф]. Плоский: $C = \\varepsilon\\varepsilon_0 S/d$. $\\parallel$: $\\sum C$. Последов.: $\\sum 1/C$.' },
|
||||
{ t:'§ 24 · Энергия', icon:'<svg viewBox="0 0 24 24" fill="none" stroke="#dc2626" stroke-width="2" style="width:18px;height:18px"><polygon points="13,2 4,14 12,14 11,22 20,10 12,10"/></svg>', body:'$W = \\dfrac{CU^2}{2} = \\dfrac{q^2}{2C} = \\dfrac{qU}{2}$. Хранится в поле.' },
|
||||
];
|
||||
|
||||
html += `<div class="card">
|
||||
<div class="card-header">
|
||||
<span class="card-icon theory">${ICONS.theory}</span>
|
||||
<span class="card-title">Шпаргалка главы 3 — Электростатика</span>
|
||||
<span class="card-num">Итог</span>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<p>Ключевые формулы и идеи всех 9 параграфов главы — повтори перед битвой с боссами.</p>
|
||||
<div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:12px;margin-top:10px">
|
||||
${SHEET.map(s => `<div style="padding:12px 14px;background:var(--sec-acc-soft);border-radius:11px;border-left:3px solid var(--pri)">
|
||||
<div style="display:flex;align-items:center;gap:8px;margin-bottom:6px">
|
||||
${s.icon}
|
||||
<div style="font-family:'Unbounded',sans-serif;font-weight:700;color:var(--pri2);font-size:.88rem">${s.t}</div>
|
||||
</div>
|
||||
<div style="font-size:.92rem;line-height:1.55">${s.body}</div>
|
||||
</div>`).join('')}
|
||||
</div>
|
||||
</div>
|
||||
</div>`;
|
||||
|
||||
/* Часть Б — 7 боссов intro */
|
||||
html += `<div class="card">
|
||||
<div class="card-header">
|
||||
<span class="card-icon rule">${ICONS.rule}</span>
|
||||
<span class="card-title">Боссы главы 3</span>
|
||||
<span class="card-num">7</span>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<p>7 интегрированных задач по §§16–24. За каждого побеждённого босса: <b>+10 XP, +14% к прогрессу</b>. Победишь всех — ачивка <b>«Мастер электростатики»</b> и <b>+50 XP бонус</b>.</p>
|
||||
<p style="margin-top:6px;font-size:.92rem;color:var(--muted)">Константы: $k = 9 \\cdot 10^9$ Н·м²/Кл², $e = 1{,}6 \\cdot 10^{-19}$ Кл, $\\varepsilon_0 = 8{,}85 \\cdot 10^{-12}$ Ф/м. Допуск $\\pm 5\\%$.</p>
|
||||
</div>
|
||||
</div>`;
|
||||
|
||||
html += '<div id="ch3-bosses-container"></div>';
|
||||
|
||||
html += `<div style="margin-top:18px;padding:18px 20px;background:linear-gradient(135deg,var(--pri-soft),var(--sec-acc-soft));border-radius:14px;border:1.5px solid var(--pri);text-align:center" id="ch3-final-summary">
|
||||
<div style="font-family:'Unbounded',sans-serif;font-weight:800;color:var(--pri2);font-size:1.1rem;margin-bottom:6px">Прогресс по боссам</div>
|
||||
<div id="ch3-boss-overall" style="font-size:.95rem;color:var(--text);margin-bottom:10px">0 / 7 боссов побеждено</div>
|
||||
<div style="height:12px;background:var(--card);border-radius:8px;overflow:hidden;border:1px solid var(--border)">
|
||||
<div id="ch3-boss-overall-fill" style="height:100%;width:0%;background:linear-gradient(90deg,#7c3aed,#a78bfa);transition:width .35s"></div>
|
||||
</div>
|
||||
<div id="ch3-final-reward" style="margin-top:14px;display:none;padding:14px;background:var(--card);border-radius:11px;border:2px solid #7c3aed">
|
||||
<div style="font-family:'Unbounded',sans-serif;font-weight:800;color:#5b21b6;font-size:1.05rem;margin-bottom:6px">Мастер электростатики</div>
|
||||
<div style="font-size:.92rem;margin-bottom:10px">Глава 3 пройдена! Все 7 боссов повержены. +50 XP бонус.</div>
|
||||
<a class="btn primary" href="/textbook/physics-10-ch4" style="text-decoration:none">Дальше: Глава 4 <svg class="ic" viewBox="0 0 24 24"><polyline points="9 18 15 12 9 6"/></svg></a>
|
||||
</div>
|
||||
</div>`;
|
||||
|
||||
html += secNav('p24', null);
|
||||
html += readButton('final3');
|
||||
|
||||
box.innerHTML = html;
|
||||
renderMath(box);
|
||||
wireReadBtn('final3');
|
||||
|
||||
/* Боссы главы 3 */
|
||||
const BOSSES = [
|
||||
{
|
||||
n:1, color:'#dc2626',
|
||||
title:'Хранитель Заряда',
|
||||
tag:'§ 16',
|
||||
q:'Сколько электронов в заряде модулем $|q| = 3{,}2$ нКл? Введи коэффициент $a$ в записи $n = a \\cdot 10^{10}$.',
|
||||
ans:2, tol:0.1,
|
||||
hint:'$n = |q|/e = 3{,}2 \\cdot 10^{-9} / (1{,}6 \\cdot 10^{-19}) = 2 \\cdot 10^{10}$.'
|
||||
},
|
||||
{
|
||||
n:2, color:'#7c3aed',
|
||||
title:'Дракон Кулона',
|
||||
tag:'§ 17',
|
||||
q:'Два заряда по $+2$ мкКл в воздухе на $r = 0{,}3$ м. Найди модуль силы Кулона $F$ в Н (до сотых).',
|
||||
ans:0.4, tol:0.025,
|
||||
hint:'$F = k\\dfrac{q_1 q_2}{r^2} = 9\\cdot 10^9 \\cdot \\dfrac{4 \\cdot 10^{-12}}{0{,}09} = 0{,}4$ Н.'
|
||||
},
|
||||
{
|
||||
n:3, color:'#f59e0b',
|
||||
title:'Стражник Напряжённости',
|
||||
tag:'§ 19',
|
||||
q:'$E$ на расстоянии $r = 0{,}2$ м от точечного заряда $q = +5$ нКл. Ответ в В/м.',
|
||||
ans:1125, tol:60,
|
||||
hint:'$E = kq/r^2 = 9\\cdot 10^9 \\cdot 5\\cdot 10^{-9}/0{,}04 = 1125$ В/м.'
|
||||
},
|
||||
{
|
||||
n:4, color:'#8b5cf6',
|
||||
title:'Сторож Потенциала',
|
||||
tag:'§ 21 + § 22',
|
||||
q:'Заряд $q = +2$ мкКл перенесли между точками с $\\varphi_1 = 200$ В и $\\varphi_2 = 50$ В. Работа поля $A$ в мкДж?',
|
||||
ans:300, tol:15,
|
||||
hint:'$A = q(\\varphi_1 - \\varphi_2) = 2\\cdot 10^{-6} \\cdot 150 = 3\\cdot 10^{-4}$ Дж $= 300$ мкДж.'
|
||||
},
|
||||
{
|
||||
n:5, color:'#0891b2',
|
||||
title:'Капитан Конденсатор',
|
||||
tag:'§ 23',
|
||||
q:'Плоский конденсатор: $S = 0{,}02$ м², $d = 0{,}001$ м, воздух ($\\varepsilon = 1$). Найди $C$ в пФ.',
|
||||
ans:177, tol:9,
|
||||
hint:'$C = \\varepsilon\\varepsilon_0 S/d = 8{,}85\\cdot 10^{-12}\\cdot 0{,}02/0{,}001 = 1{,}77\\cdot 10^{-10}$ Ф $= 177$ пФ.'
|
||||
},
|
||||
{
|
||||
n:6, color:'#dc2626',
|
||||
title:'Энергетический Левиафан',
|
||||
tag:'§ 24',
|
||||
q:'$C = 500$ мкФ, $U = 100$ В. Найди энергию $W$ конденсатора в Дж (до десятых).',
|
||||
ans:2.5, tol:0.15,
|
||||
hint:'$W = CU^2/2 = 5\\cdot 10^{-4}\\cdot 10^4/2 = 2{,}5$ Дж.'
|
||||
},
|
||||
{
|
||||
n:7, color:'#a78bfa',
|
||||
title:'Магистр Электростатики',
|
||||
tag:'§ 16 + § 17',
|
||||
q:'Два одинаковых металлических шара с зарядами $+8$ нКл и $-4$ нКл соприкоснулись и были разведены на $r = 0{,}2$ м. Найди модуль силы между ними в мкН (до десятых).',
|
||||
ans:0.9, tol:0.06,
|
||||
hint:'После касания: $(8 + (-4))/2 = +2$ нКл на каждом. $F = k q^2/r^2 = 9\\cdot 10^9 \\cdot (2\\cdot 10^{-9})^2/0{,}04 = 9\\cdot 10^{-7}$ Н $= 0{,}9$ мкН.'
|
||||
},
|
||||
];
|
||||
|
||||
const cont = document.getElementById('ch3-bosses-container');
|
||||
const STATE_KEY = 'physics10_ch3_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)=>{
|
||||
return '<div class="boss-card" id="boss3-'+b.n+'-card" style="padding:16px;background:var(--card);border-radius:12px;border:2px solid '+b.color+';margin-bottom:14px">'
|
||||
+'<div style="display:flex;align-items:center;gap:10px;margin-bottom:10px;flex-wrap:wrap">'
|
||||
+'<svg viewBox="0 0 24 24" fill="none" stroke="'+b.color+'" stroke-width="2.2" style="width:28px;height:28px;flex-shrink:0"><polygon points="12,2 22,20 2,20"/></svg>'
|
||||
+'<div style="font-family:\'Unbounded\',sans-serif;font-weight:800;color:'+b.color+';font-size:1.05rem">Босс '+b.n+': '+b.title+'</div>'
|
||||
+'<div style="margin-left:auto;font-size:.78rem;color:var(--muted);padding:3px 8px;background:var(--sec-acc-soft);border-radius:6px">'+b.tag+'</div>'
|
||||
+'</div>'
|
||||
+'<div class="boss-q" id="boss3-'+b.n+'-q" style="padding:12px 14px;background:var(--sec-acc-soft);border-radius:9px;font-size:1rem;line-height:1.5;margin-bottom:10px">'+b.q+'</div>'
|
||||
+'<div style="display:flex;gap:8px;align-items:center;flex-wrap:wrap">'
|
||||
+'<span style="font-family:\'JetBrains Mono\',monospace;font-size:.92rem">ответ =</span>'
|
||||
+'<input type="number" id="boss3-'+b.n+'-ans" class="tinp" style="width:130px;text-align:center" step="0.01" placeholder="число">'
|
||||
+'<button class="btn primary" id="boss3-'+b.n+'-go" style="background:'+b.color+';border-color:'+b.color+'">Атаковать</button>'
|
||||
+'<button class="btn" id="boss3-'+b.n+'-hint">Подсказка</button>'
|
||||
+'</div>'
|
||||
+'<div class="feedback" id="boss3-'+b.n+'-fb"></div>'
|
||||
+'</div>';
|
||||
}).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))';
|
||||
card.classList.add('glow');
|
||||
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 raw = ansInp.value.replace(',', '.');
|
||||
const val = parseFloat(raw);
|
||||
if(isNaN(val)){ feedback(fb, false, '✗ Введи число.'); return; }
|
||||
const tol = (typeof b.tol === 'number') ? b.tol : Math.max(0.05 * Math.abs(b.ans), 0.05);
|
||||
if(Math.abs(val - b.ans) < tol + 0.001){
|
||||
BOSS_STATE[idx].defeated = true; saveBosses();
|
||||
feedback(fb, true, '✓ Босс '+b.n+' повержен! +10 XP. '+b.hint);
|
||||
addXp(10, 'boss-ch3-'+b.n);
|
||||
bumpProgress('final3', 14);
|
||||
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))';
|
||||
card.classList.add('glow','pulse');
|
||||
setTimeout(()=>card.classList.remove('pulse'), 900);
|
||||
refreshOverall();
|
||||
} else {
|
||||
feedback(fb, false, '✗ Промах. Попробуй ещё. Подсказка доступна.');
|
||||
}
|
||||
});
|
||||
hintBtn.addEventListener('click', ()=>{
|
||||
const fb = document.getElementById('boss3-'+b.n+'-fb');
|
||||
fb.className = 'feedback ok';
|
||||
fb.innerHTML = '<b>Подсказка:</b> '+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 ===== */
|
||||
|
||||
Reference in New Issue
Block a user