Replace placeholder question sets

This commit is contained in:
2026-06-27 14:26:14 +03:00
parent 272a9834ac
commit df2c4f0434
5 changed files with 252 additions and 478 deletions
+16 -9
View File
@@ -31,14 +31,21 @@ npm run check # проверка типов (svelte-check)
- **Засчитать частично +N/2** — для «почти правильного» ответа ведущий может
дать половину стоимости вопроса;
- **Не засчитывать** — без очков, но вопрос закрыт.
- Штрафов и минусов нет.
4. У некоторых вопросов есть необязательная **подсказка** 💡. Ведущий может
- Для обычных вопросов штрафов и минусов нет.
4. Иногда вместо обычного вопроса открывается **аукцион** — спецвопрос в стиле
«Своей игры». Ведущий назначает ставку и открывает случайный вопрос, затем
решает:
- **Засчитать +N** — команде идут очки;
- **Не засчитать** — с команды **снимается ставка**, но счёт не уходит в минус.
Пока аукцион не разрешён, ведущий может его отменить и вернуться к табло
без потерь.
5. У некоторых вопросов есть необязательная **подсказка** 💡. Ведущий может
показать её по желанию. Если подсказка показана — ответ засчитывается только
за половину стоимости: мягкая помощь без давления.
5. Для творческих вопросов (type `creative`) кнопка мягче:
6. Для творческих вопросов (type `creative`) кнопка мягче:
«Засчитать творческий ответ +N».
6. Сыгранный вопрос затемняется и больше не выбирается.
7. Когда сыграны все вопросы — экран результата с мягкой финальной фразой.
7. Сыгранный вопрос затемняется и больше не выбирается.
8. Когда сыграны все вопросы — экран результата с мягкой финальной фразой.
Прогресс сохраняется автоматически — после перезагрузки игра продолжится с того же места.
@@ -82,8 +89,9 @@ npm run check # проверка типов (svelte-check)
2. Зарегистрируйте набор в `src/lib/question-sets/index.ts`:
```ts
import { familyKnowledgeJourneySet } from './family-knowledge-journey';
import { mySet } from './my-set';
export const questionSets = [animalsSet, cozySet, mySet];
export const questionSets = [familyKnowledgeJourneySet, mySet];
```
Готово — набор автоматически появится на экране выбора.
@@ -97,9 +105,8 @@ src/
├─ lib/
│ ├─ types.ts # Доменные типы (Question, Category, QuestionSet, GameState)
│ ├─ question-sets/ # ДАННЫЕ (отделены от UI)
│ │ ├─ animals.ts # набор-заглушка
│ │ cozy.ts # набор-заглушка
│ │ └─ index.ts # реестр наборов + хелперы поиска
│ │ ├─ family-knowledge-journey.ts # набор вопросов
│ │ index.ts # реестр наборов + хелперы поиска
│ ├─ stores/
│ │ └─ game.ts # СОСТОЯНИЕ игры (Svelte store + localStorage)
│ └─ components/ # UI-компоненты
-234
View File
@@ -1,234 +0,0 @@
import type { QuestionSet } from '$lib/types';
/**
* Тестовый набор-заглушка: «Животные».
*
* Это пример структуры данных и НЕ содержит реального контента —
* только простые вопросы-заглушки. Реальные наборы добавляются отдельно
* по той же схеме. В каждой категории ровно 5 вопросов с очками
* 100 / 200 / 300 / 500 / 1000.
*/
export const animalsSet: QuestionSet = {
id: 'animals',
title: 'Животные',
description: 'Знакомые звери и птицы — тёплый разогрев для всей семьи.',
ageRange: '6+ лет',
categories: [
{
id: 'who',
title: 'Кто это?',
questions: [
{
id: 'q1',
points: 100,
question: 'Кто говорит «мяу»?',
answer: 'Кошка',
type: 'strict'
},
{
id: 'q2',
points: 200,
question: 'У какой крупной дикой кошки самец носит пышную гриву?',
answer: 'Лев',
optionalHint: 'Его часто называют царём зверей.',
type: 'strict'
},
{
id: 'q3',
points: 300,
question: 'Какое животное носит дом на спине?',
answer: 'Улитка (или черепаха)',
type: 'strict'
},
{
id: 'q4',
points: 500,
question: 'Какое самое крупное наземное животное?',
answer: 'Африканский слон',
optionalHint: 'У него большие уши и хобот.',
type: 'strict'
},
{
id: 'q5',
points: 1000,
question: 'Какое морское животное — млекопитающее, а не рыба?',
answer: 'Кит или дельфин',
optionalHint: 'Оно дышит воздухом и кормит детёнышей молоком.',
type: 'strict'
}
]
},
{
id: 'where',
title: 'Где живут?',
questions: [
{
id: 'q1',
points: 100,
question: 'Где живёт аквариумная рыбка?',
answer: 'В аквариуме (в воде)',
type: 'strict'
},
{
id: 'q2',
points: 200,
question: 'Как называется домик для пчёл?',
answer: 'Улей (или пасека)',
type: 'strict'
},
{
id: 'q3',
points: 300,
question: 'В каком холодном месте живут белые медведи?',
answer: 'В Арктике (на Северном полюсе / во льдах)',
type: 'strict'
},
{
id: 'q4',
points: 500,
question: 'Где можно встретить стаю диких обезьян?',
answer: 'В тропическом лесу / джунглях',
optionalHint: 'Там тепло, влажно и много деревьев.',
type: 'strict'
},
{
id: 'q5',
points: 1000,
question: 'В какой природной зоне живут верблюды?',
answer: 'В пустыне',
optionalHint: 'Их называют «кораблями» этих мест.',
type: 'strict'
}
]
},
{
id: 'invent',
title: 'Придумай сам',
questions: [
{
id: 'q1',
points: 100,
question: 'Придумай ласковое прозвище для котёнка.',
answer: 'Любое тёплое имя (например: Пушок, Мурлык)',
type: 'creative'
},
{
id: 'q2',
points: 200,
question: 'Каким голосом, по-твоему, разговаривает собака?',
answer: 'Любой творческий ответ',
optionalHint: 'Это фантазийный вопрос — поощряй воображение.',
type: 'creative'
},
{
id: 'q3',
points: 300,
question: 'Придумай, чем хобот слона может быть полезен.',
answer: 'Любая идея (пить, обниматься, душ, рисовать)',
type: 'creative'
},
{
id: 'q4',
points: 500,
question: 'Опиши воображаемого зверя, который живёт на диване.',
answer: 'Любой фантазийный ответ',
optionalHint: 'Чем нелепее и добрее — тем лучше.',
type: 'creative'
},
{
id: 'q5',
points: 1000,
question: 'Придумай короткую сказку про дружбу кота и пчелы.',
answer: 'Любой связный рассказ',
type: 'creative'
}
]
},
{
id: 'babies',
title: 'Кто чей детёныш?',
questions: [
{
id: 'q1',
points: 100,
question: 'Как называется детёныш кошки?',
answer: 'Котёнок',
type: 'strict'
},
{
id: 'q2',
points: 200,
question: 'Как называют детёныша собаки?',
answer: 'Щенок',
type: 'strict'
},
{
id: 'q3',
points: 300,
question: 'Как называется детёныш коровы?',
answer: 'Телёнок',
type: 'strict'
},
{
id: 'q4',
points: 500,
question: 'Как называют детёныша лягушки, пока он ещё не стал взрослым?',
answer: 'Головастик',
optionalHint: 'Он живёт в воде и у него есть хвостик.',
type: 'strict'
},
{
id: 'q5',
points: 1000,
question: 'Как называется детёныш лошади?',
answer: 'Жеребёнок',
optionalHint: 'Мама у него — кобыла, а папа — жеребец.',
type: 'strict'
}
]
},
{
id: 'food',
title: 'Чем питаются?',
questions: [
{
id: 'q1',
points: 100,
question: 'Какой оранжевый овощ любят грызть кролики?',
answer: 'Морковку (и капусту)',
type: 'strict'
},
{
id: 'q2',
points: 200,
question: 'Какой корм чаще всего нравится кошке?',
answer: 'Рыба (и молоко)',
type: 'strict'
},
{
id: 'q3',
points: 300,
question: 'Чем питается бабочка, когда садится на цветы?',
answer: 'Нектаром (сладким соком цветов)',
type: 'strict'
},
{
id: 'q4',
points: 500,
question: 'Каким высоким растением почти полностью питается большая панда?',
answer: 'Бамбуком',
optionalHint: 'Он зелёный, высокий и немного похож на траву.',
type: 'strict'
},
{
id: 'q5',
points: 1000,
question: 'Какое животное почти всю жизнь ест только листья эвкалипта?',
answer: 'Коала',
optionalHint: 'Она живёт в Австралии и подолгу спит на деревьях.',
type: 'strict'
}
]
}
]
};
-232
View File
@@ -1,232 +0,0 @@
import type { QuestionSet } from '$lib/types';
/**
* Тестовый набор-заглушка: «Уютные вечера».
*
* Содержит простые вопросы-заглушки без реального контента — структура
* данных и форматирование. Каждая категория содержит ровно 5 вопросов
* с очками 100 / 200 / 300 / 500 / 1000.
*/
export const cozySet: QuestionSet = {
id: 'cozy-evenings',
title: 'Уютные вечера',
description: 'Спокойные вопросы про дом, сон и вечерние ритуалы.',
ageRange: 'вся семья',
categories: [
{
id: 'bedtime',
title: 'Перед сном',
questions: [
{
id: 'q1',
points: 100,
question: 'Что мы надеваем перед тем, как лечь спать?',
answer: 'Пижаму',
type: 'strict'
},
{
id: 'q2',
points: 200,
question: 'Как называется мягкая подушка-одеяло, в которую закутываются?',
answer: 'Плед',
type: 'strict'
},
{
id: 'q3',
points: 300,
question: 'Что светит в окно ночью на небе?',
answer: 'Луна (и звёзды)',
type: 'strict'
},
{
id: 'q4',
points: 500,
question: 'Как называется горячий вечерний напиток из молока?',
answer: 'Какао (или горячий шоколад / тёплое молоко)',
optionalHint: 'Его часто пьют перед сном.',
type: 'strict'
},
{
id: 'q5',
points: 1000,
question: 'Что нужно сделать с кроватью, чтобы в ней было уютно спать?',
answer: 'Заправить / застелить / взбить подушку',
optionalHint: 'Это вечерний ритуал порядка.',
type: 'strict'
}
]
},
{
id: 'home',
title: 'Дом и семья',
questions: [
{
id: 'q1',
points: 100,
question: 'Кто будит всех по утрам в семье самым первым? (по-твоему)',
answer: 'Любой правдоподобный ответ (мама, папа, кот, будильник)',
type: 'creative'
},
{
id: 'q2',
points: 200,
question: 'Где семья чаще всего ужинает вместе?',
answer: 'На кухне / за столом',
type: 'strict'
},
{
id: 'q3',
points: 300,
question: 'Что висит на стене и показывает время в доме?',
answer: 'Часы',
type: 'strict'
},
{
id: 'q4',
points: 500,
question: 'Как называется лампа на прикроватной тумбочке?',
answer: 'Настольная лампа / ночник',
optionalHint: 'Она даёт мягкий свет вечером.',
type: 'strict'
},
{
id: 'q5',
points: 1000,
question: 'Какой домашний вечерний ритуал помогает уснуть спокойнее?',
answer: 'Чтение сказки / тёплый напиток / тёплый душ / тишину',
optionalHint: 'Главное — чтобы было тихо и тепло.',
type: 'creative'
}
]
},
{
id: 'dreams',
title: 'Фантазии перед сном',
questions: [
{
id: 'q1',
points: 100,
question: 'Если бы ты мог летать во сне, куда бы ты полетел?',
answer: 'Любой творческий ответ',
type: 'creative'
},
{
id: 'q2',
points: 200,
question: 'Какой цвет ты бы выбрал для звёзд?',
answer: 'Любой цвет с объяснением',
optionalHint: 'Может быть даже необычный.',
type: 'creative'
},
{
id: 'q3',
points: 300,
question: 'Придумай имя для доброго ночного облачка.',
answer: 'Любое мягкое имя',
type: 'creative'
},
{
id: 'q4',
points: 500,
question: 'Опиши самый уютный сон, который ты можешь представить.',
answer: 'Любой тёплый рассказ',
optionalHint: 'Мягкие цвета, тёплое место, добрые герои.',
type: 'creative'
},
{
id: 'q5',
points: 1000,
question: 'Сочини доброе пожелание перед сном для всей семьи.',
answer: 'Любое искреннее пожелание',
type: 'creative'
}
]
},
{
id: 'morning',
title: 'Доброе утро',
questions: [
{
id: 'q1',
points: 100,
question: 'Что мы чистим по утрам зубной щёткой?',
answer: 'Зубы',
type: 'strict'
},
{
id: 'q2',
points: 200,
question: 'Как называется приём пищи, который бывает первым после сна?',
answer: 'Завтрак',
type: 'strict'
},
{
id: 'q3',
points: 300,
question: 'Что нужно сделать с постелью, когда ты встал утром?',
answer: 'Заправить / застелить кровать',
type: 'strict'
},
{
id: 'q4',
points: 500,
question: 'Как называются лёгкие упражнения, которые делают по утрам?',
answer: 'Зарядка',
optionalHint: 'Она помогает проснуться и взбодриться.',
type: 'strict'
},
{
id: 'q5',
points: 1000,
question: 'Что приятно увидеть в окно ясным утром?',
answer: 'Солнце (солнечный свет)',
optionalHint: 'Оно медленно поднимается над горизонтом.',
type: 'strict'
}
]
},
{
id: 'tales',
title: 'Сказки и истории',
questions: [
{
id: 'q1',
points: 100,
question: 'Как зовут сказочную девочку с красной шапочкой?',
answer: 'Красная Шапочка',
type: 'strict'
},
{
id: 'q2',
points: 200,
question: 'Как зовут деревянного мальчика, которого выстругал папа Карло?',
answer: 'Буратино',
type: 'strict'
},
{
id: 'q3',
points: 300,
question: 'На чём Золушка отправилась на бал?',
answer: 'В карете из тыквы (в хрустальных туфельках)',
type: 'strict'
},
{
id: 'q4',
points: 500,
question: 'Какой волшебный цветок исполнял семь желаний?',
answer: 'Цветик-семицветик',
optionalHint: 'У него было семь разноцветных лепестков.',
type: 'strict'
},
{
id: 'q5',
points: 1000,
question: 'Придумай название для доброй новой сказки про домашнего любимца.',
answer: 'Любое тёплое творческое название',
optionalHint: 'Пусть оно звучит уютно и приглашает послушать историю.',
type: 'creative'
}
]
}
]
};
@@ -0,0 +1,234 @@
import type { QuestionSet } from '$lib/types';
/**
* Основной набор вопросов: «Большое семейное путешествие».
*
* Тёплый набор про космос, природу, Землю, книги и добрые фантазии для
* спокойной семейной игры. Каждая категория содержит ровно 5 вопросов с очками
* 100 / 200 / 300 / 500 / 1000. id вопросов уникальны в пределах категории.
*/
export const familyKnowledgeJourneySet: QuestionSet = {
id: 'family-knowledge-journey',
title: 'Большое семейное путешествие',
description:
'Тёплый набор вопросов про космос, природу, Землю, книги и добрые фантазии для спокойной семейной игры.',
ageRange: '6+ лет / вся семья',
categories: [
{
id: 'space-nearby',
title: 'Космос рядом',
questions: [
{
id: 'q1',
points: 100,
question: 'Как называется звезда, вокруг которой вращается Земля?',
answer: 'Солнце',
type: 'strict'
},
{
id: 'q2',
points: 200,
question: 'Сколько планет в Солнечной системе?',
answer: 'Восемь',
optionalHint: 'Плутон сейчас относят к карликовым планетам.',
type: 'strict'
},
{
id: 'q3',
points: 300,
question: 'Как называется естественный спутник Земли?',
answer: 'Луна',
type: 'strict'
},
{
id: 'q4',
points: 500,
question: 'Какую планету часто называют Красной планетой?',
answer: 'Марс',
optionalHint: 'Её цвет связан с ржавчиной в грунте.',
type: 'strict'
},
{
id: 'q5',
points: 1000,
question: 'Какая планета самая большая в Солнечной системе?',
answer: 'Юпитер',
type: 'strict'
}
]
},
{
id: 'living-nature',
title: 'Живая природа',
questions: [
{
id: 'q1',
points: 100,
question: 'Какое домашнее животное обычно мурлычет, когда ему спокойно?',
answer: 'Кошка',
type: 'strict'
},
{
id: 'q2',
points: 200,
question: 'Какая птица не летает, зато отлично плавает?',
answer: 'Пингвин',
optionalHint: 'Её крылья похожи на ласты.',
type: 'strict'
},
{
id: 'q3',
points: 300,
question: 'Дельфин — это рыба или млекопитающее?',
answer: 'Млекопитающее',
optionalHint: 'Он поднимается к поверхности, чтобы вдохнуть воздух.',
type: 'strict'
},
{
id: 'q4',
points: 500,
question: 'Какое млекопитающее умеет по-настоящему летать, а не просто планировать?',
answer: 'Летучая мышь',
type: 'strict'
},
{
id: 'q5',
points: 1000,
question: 'У какого морского животного три сердца и голубоватая кровь?',
answer: 'У осьминога',
optionalHint: 'У него восемь щупалец.',
type: 'strict'
}
]
},
{
id: 'earth-and-water',
title: 'Земля и вода',
questions: [
{
id: 'q1',
points: 100,
question: 'Что падает с неба каплями во время дождя?',
answer: 'Вода',
type: 'strict'
},
{
id: 'q2',
points: 200,
question: 'Как называется процесс, когда вода превращается в пар?',
answer: 'Испарение',
optionalHint: 'Так бывает с лужей в солнечный день.',
type: 'strict'
},
{
id: 'q3',
points: 300,
question: 'Как называется самый большой океан на Земле?',
answer: 'Тихий океан',
type: 'strict'
},
{
id: 'q4',
points: 500,
question: 'Как называется самая высокая гора над уровнем моря?',
answer: 'Эверест',
optionalHint: 'Она находится в Гималаях.',
type: 'strict'
},
{
id: 'q5',
points: 1000,
question: 'Назовите три главные части круговорота воды.',
answer: 'Испарение, конденсация и осадки',
optionalHint: 'Вода поднимается, собирается в облака и возвращается обратно.',
type: 'strict'
}
]
},
{
id: 'books-and-tales',
title: 'Книги и сказки',
questions: [
{
id: 'q1',
points: 100,
question: 'Кто ушёл от бабушки и дедушки и покатился по дорожке?',
answer: 'Колобок',
type: 'strict'
},
{
id: 'q2',
points: 200,
question: 'Что тянули дед, бабка, внучка, Жучка, кошка и мышка?',
answer: 'Репку',
type: 'strict'
},
{
id: 'q3',
points: 300,
question: 'Как зовут девочку, которая попала в Страну чудес?',
answer: 'Алиса',
type: 'strict'
},
{
id: 'q4',
points: 500,
question: 'Кто написал сказку в стихах про доброго доктора Айболита?',
answer: 'Корней Чуковский',
optionalHint: 'Этот автор написал ещё «Мойдодыра».',
type: 'strict'
},
{
id: 'q5',
points: 1000,
question: 'В какой сказке маленькая девочка появилась из цветка?',
answer: '«Дюймовочка»',
type: 'strict'
}
]
},
{
id: 'kind-imagination',
title: 'Добрая фантазия',
questions: [
{
id: 'q1',
points: 100,
question: 'Придумайте доброе название для команды путешественников.',
answer: 'Любое доброе и семейное название команды.',
type: 'creative'
},
{
id: 'q2',
points: 200,
question: 'Назовите три вещи, которые можно взять в спокойное семейное путешествие.',
answer: 'Любые три безопасные и подходящие вещи.',
type: 'creative'
},
{
id: 'q3',
points: 300,
question: 'Придумайте короткое вежливое правило для викторины.',
answer: 'Любое дружелюбное правило, которое помогает играть честно и спокойно.',
type: 'creative'
},
{
id: 'q4',
points: 500,
question: 'Опишите необычное животное, которое могло бы жить на мирной сказочной планете.',
answer: 'Любое доброе творческое описание без страшных, грубых или спорных деталей.',
optionalHint: 'Можно придумать внешний вид, характер и любимое занятие.',
type: 'creative'
},
{
id: 'q5',
points: 1000,
question:
'Составьте мини-загадку про один предмет в комнате так, чтобы другие могли его отгадать.',
answer: 'Любая понятная загадка с ответом, которую игроки действительно могут отгадать.',
type: 'creative'
}
]
}
]
};
+2 -3
View File
@@ -1,6 +1,5 @@
import type { Category, Question, QuestionRef, QuestionSet } from '$lib/types';
import { animalsSet } from './animals';
import { cozySet } from './cozy';
import { familyKnowledgeJourneySet } from './family-knowledge-journey';
/**
* Реестр всех доступных наборов вопросов.
@@ -14,7 +13,7 @@ import { cozySet } from './cozy';
* │ Всё — на экране выбора набор появится автоматически. │
* └───────────────────────────────────────────────────────────────────────┘
*/
export const questionSets: QuestionSet[] = [animalsSet, cozySet];
export const questionSets: QuestionSet[] = [familyKnowledgeJourneySet];
/* ----------------------------------------------------------------------- */
/* Хелперы поиска по данным (без состояния). */