UI: справка — раздел «Рейтинг» свёрнут под кнопку
Вся информация об очках раскрывается кнопкой-карточкой (шеврон вниз/вверх, стиль карточек списка партий) — задел под будущие разделы справки. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,8 +1,12 @@
|
|||||||
|
import { ChevronDown, ChevronUp } from "lucide-react";
|
||||||
|
import { useState } from "react";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Справка. Пока — только как считаются очки игроков (рейтинг). В дальнейшем сюда
|
* Справка — разделы, раскрывающиеся по кнопке. Пока раздел один: «Рейтинг»
|
||||||
* добавятся правила, подсказки и прочее. Текст соответствует backend/app/services/scoring.py.
|
* (как считаются очки игроков). Текст соответствует backend/app/services/scoring.py.
|
||||||
*/
|
*/
|
||||||
export function HelpPage() {
|
export function HelpPage() {
|
||||||
|
const [showRating, setShowRating] = useState(false);
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
{/* Название страницы уже в верхней панели — в теле только пояснение. */}
|
{/* Название страницы уже в верхней панели — в теле только пояснение. */}
|
||||||
@@ -13,72 +17,88 @@ export function HelpPage() {
|
|||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="card">
|
{/* Кнопка-карточка раздела — как карточки списка партий. */}
|
||||||
<h3>Очки игроков (рейтинг)</h3>
|
<button
|
||||||
<p className="small">
|
className="card"
|
||||||
Рейтинг считается только по <b>завершённым</b> партиям. Незавершённые и отменённые
|
style={{ textAlign: "left", width: "100%" }}
|
||||||
в зачёт не идут.
|
onClick={() => setShowRating((v) => !v)}
|
||||||
</p>
|
>
|
||||||
<p className="small">
|
<div className="row-between">
|
||||||
За каждую партию игрок получает «очки за место» — они нормированы по числу игроков
|
<h3 style={{ margin: 0 }}>Рейтинг</h3>
|
||||||
за столом, поэтому победа за большим столом ценится выше, чем за маленьким:
|
{showRating ? <ChevronUp size={18} /> : <ChevronDown size={18} />}
|
||||||
</p>
|
|
||||||
<div className="formula">
|
|
||||||
очки = (N − место − (размер_ничьей − 1) / 2) / (N − 1)
|
|
||||||
</div>
|
</div>
|
||||||
<p className="small" style={{ marginTop: 10 }}>
|
</button>
|
||||||
где <b>N</b> — число игроков в партии. Первое место даёт <b>1.0</b>, последнее — <b>0.0</b>.
|
|
||||||
</p>
|
|
||||||
<ul className="small" style={{ marginTop: 0, paddingLeft: 18 }}>
|
|
||||||
<li>Если несколько игроков делят место (ничья) — они делят сумму очков поровну.</li>
|
|
||||||
<li>Выбывшие из партии считаются как последнее место.</li>
|
|
||||||
</ul>
|
|
||||||
<p className="small">
|
|
||||||
Итоговый <b>рейтинг</b> игрока — сглаженное среднее: к реальным партиям
|
|
||||||
«дописываются» 10 виртуальных со средним результатом 0.5 (шкала от 0 до 100):
|
|
||||||
</p>
|
|
||||||
<div className="formula">
|
|
||||||
рейтинг = (10 × 0.5 + сумма очков) / (10 + число партий) × 100
|
|
||||||
</div>
|
|
||||||
<p className="small" style={{ marginTop: 10 }}>
|
|
||||||
Пока партий мало, рейтинг держится около 50 и с опытом сходится к реальному
|
|
||||||
среднему — стабильные результаты на длинной дистанции ценятся выше короткой
|
|
||||||
удачной серии.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="card">
|
{showRating && (
|
||||||
<h3>Пример (стол на 4 игроков)</h3>
|
<>
|
||||||
<div className="stack" style={{ gap: 6 }}>
|
<div className="card">
|
||||||
<div className="row-between small"><span>1-е место</span><b>(4−1−0)/3 = 1.00 → 100</b></div>
|
<h3>Очки игроков (рейтинг)</h3>
|
||||||
<div className="row-between small"><span>2-е место</span><b>(4−2−0)/3 = 0.67 → 67</b></div>
|
<p className="small">
|
||||||
<div className="row-between small"><span>3-е место</span><b>(4−3−0)/3 = 0.33 → 33</b></div>
|
Рейтинг считается только по <b>завершённым</b> партиям. Незавершённые и отменённые
|
||||||
<div className="row-between small"><span>4-е место</span><b>(4−4−0)/3 = 0.00 → 0</b></div>
|
в зачёт не идут.
|
||||||
<div className="row-between small">
|
</p>
|
||||||
<span>Ничья за 1-е (двое)</span><b>(4−1−0.5)/3 = 0.83 каждому</b>
|
<p className="small">
|
||||||
|
За каждую партию игрок получает «очки за место» — они нормированы по числу игроков
|
||||||
|
за столом, поэтому победа за большим столом ценится выше, чем за маленьким:
|
||||||
|
</p>
|
||||||
|
<div className="formula">
|
||||||
|
очки = (N − место − (размер_ничьей − 1) / 2) / (N − 1)
|
||||||
|
</div>
|
||||||
|
<p className="small" style={{ marginTop: 10 }}>
|
||||||
|
где <b>N</b> — число игроков в партии. Первое место даёт <b>1.0</b>, последнее — <b>0.0</b>.
|
||||||
|
</p>
|
||||||
|
<ul className="small" style={{ marginTop: 0, paddingLeft: 18 }}>
|
||||||
|
<li>Если несколько игроков делят место (ничья) — они делят сумму очков поровну.</li>
|
||||||
|
<li>Выбывшие из партии считаются как последнее место.</li>
|
||||||
|
</ul>
|
||||||
|
<p className="small">
|
||||||
|
Итоговый <b>рейтинг</b> игрока — сглаженное среднее: к реальным партиям
|
||||||
|
«дописываются» 10 виртуальных со средним результатом 0.5 (шкала от 0 до 100):
|
||||||
|
</p>
|
||||||
|
<div className="formula">
|
||||||
|
рейтинг = (10 × 0.5 + сумма очков) / (10 + число партий) × 100
|
||||||
|
</div>
|
||||||
|
<p className="small" style={{ marginTop: 10 }}>
|
||||||
|
Пока партий мало, рейтинг держится около 50 и с опытом сходится к реальному
|
||||||
|
среднему — стабильные результаты на длинной дистанции ценятся выше короткой
|
||||||
|
удачной серии.
|
||||||
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="card">
|
<div className="card">
|
||||||
<h3>Попадание в топ</h3>
|
<h3>Пример (стол на 4 игроков)</h3>
|
||||||
<p className="small">
|
<div className="stack" style={{ gap: 6 }}>
|
||||||
Чтобы попасть в ранжированный топ, нужно сыграть минимум <b>10 партий</b>. До этого
|
<div className="row-between small"><span>1-е место</span><b>(4−1−0)/3 = 1.00 → 100</b></div>
|
||||||
игрок показывается в блоке «Новички» — предварительно, без места в рейтинге.
|
<div className="row-between small"><span>2-е место</span><b>(4−2−0)/3 = 0.67 → 67</b></div>
|
||||||
</p>
|
<div className="row-between small"><span>3-е место</span><b>(4−3−0)/3 = 0.33 → 33</b></div>
|
||||||
</div>
|
<div className="row-between small"><span>4-е место</span><b>(4−4−0)/3 = 0.00 → 0</b></div>
|
||||||
|
<div className="row-between small">
|
||||||
|
<span>Ничья за 1-е (двое)</span><b>(4−1−0.5)/3 = 0.83 каждому</b>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div className="card">
|
<div className="card">
|
||||||
<h3>Другие показатели</h3>
|
<h3>Попадание в топ</h3>
|
||||||
<ul className="small" style={{ margin: 0, paddingLeft: 18 }}>
|
<p className="small">
|
||||||
<li><b>Винрейт (WR)</b> — доля партий, в которых игрок занял 1-е место.</li>
|
Чтобы попасть в ранжированный топ, нужно сыграть минимум <b>10 партий</b>. До этого
|
||||||
<li><b>Среднее место</b> — среднее по завершённым партиям.</li>
|
игрок показывается в блоке «Новички» — предварительно, без места в рейтинге.
|
||||||
<li>
|
</p>
|
||||||
При равенстве рейтинга топ сортируется по: винрейту, числу игр, среднему месту
|
</div>
|
||||||
и затем по нику.
|
|
||||||
</li>
|
<div className="card">
|
||||||
</ul>
|
<h3>Другие показатели</h3>
|
||||||
</div>
|
<ul className="small" style={{ margin: 0, paddingLeft: 18 }}>
|
||||||
|
<li><b>Винрейт (WR)</b> — доля партий, в которых игрок занял 1-е место.</li>
|
||||||
|
<li><b>Среднее место</b> — среднее по завершённым партиям.</li>
|
||||||
|
<li>
|
||||||
|
При равенстве рейтинга топ сортируется по: винрейту, числу игр, среднему месту
|
||||||
|
и затем по нику.
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user