- Цель․ Предоставить пользователю интерактивный способ «погадать», т․е․ угадать задуманное число (или карту, знак зодиака и т․п․) за минимальное количество ходов․
- Требования к функционалу․
- Ввод/задание тайного значения (пользователь загадывает число от 1 до N)․
- Алгоритм угадывания (обычно бинарный поиск)․
- Интерфейс с кнопками «Больше», «Меньше», «Угадал!»․
- Отображение количества оставшихся попыток․
- Обработка ошибок (жульничество, выход за пределы диапазона)․
- Технические ограничения․ Всё должно работать в браузере без серверных запросов, чтобы упростить размещение (GitHub Pages, Netlify, любой обычный хостинг)․
Структура проекта
style․css ← стили (можно встроить в <style>)
script․js ← логика игры
README․md ← описание проекта (необязательно)
В дальнейшем, если захотите добавить более «магический» контент (текст предсказаний, генерацию карт Таро и т․д․), можно подключить серверный язык (PHP, Node․js) и базу данных, но для базовой версии это не требуется․
Ниже – минимальная разметка, покрывающая все необходимые элементы․ Обратите внимание, что мы используем только те теги, которые разрешены в условии (h1‑h4, p, ul, ol, li, b, pre, code)․
<head>
<meta charset=»UTF-8″>
<>Угадай число за 7 попыток</>
<link rel=»stylesheet» href=»style․css»>
</head>
<body>
<h1>Угадай число от 1 до 100</h1>
<p id=»intro»>Загадайте целое число от 1 до 100, а я постараюсь угадать его за 7 попыток или меньше!</p>
<button id=»startBtn»>Начать игру</button>
<!— Блок вопросов, скрыт до старта —>
<p id=»question» class=»hidden»></p>
<!— Кнопки‑ответы, тоже скрыты —>
<button id=»lessBtn» class=»hidden»>Меньше</button>
<button id=»equalBtn» class=»hidden»>Угадал!></button>
<button id=»moreBtn» class=»hidden»>Больше</button>
<script src=»script․js»></script>
</body>
Стилизация (CSS)
Для простоты стили можно разместить в отдельном файле style․css или в блоке <style> внутри head․ Ниже пример базовых стилей, которые делают страницу приятной для глаз․
/* style․css */
body {
text-align: center;
background:#fafafa;
color:#2c3e50;
}
button {
font-size:16px;
padding:10px 20px;
margin:10px;
cursor:pointer;
}
․hidden {display:none;}
Логика игры (JavaScript)
Самый важный кусок – алгоритм бинарного поиска․ Он гарантирует, что за ⌈log₂(N) попыток (для N=100 – 7) мы найдём загаданное число․
// script․js
// ---------- глобальные переменные ----------
let min = 1; // нижняя граница диапазона
let max = 100; // верхняя граница диапазона
let attempts = 0; // текущий номер попытки
const maxAttempts = 7;
// ---------- элементы DOM ----------
const intro = document․getElementById('intro');
const startBtn = document․getElementById('startBtn');
const question = document․getElementById('question');
const lessBtn = document․getElementById('lessBtn');
const equalBtn = document․getElementById('equalBtn');
const moreBtn = document․getElementById('moreBtn');
// ---------- вспомогательные функции ----------
function show(elem){ elem․classList․remove('hidden'); }
function hide(elem){ elem․classList․add('hidden'); }
function nextGuess{
if (attempts >= maxAttempts){
// Пользователь «жульничает» – попыток больше, чем должно быть hide(lessBtn); hide(equalBtn); hide(moreBtn);
return;
}
attempts++;
const middle = Math․floor((min + max) / 2); show(lessBtn); show(equalBtn); show(moreBtn);
}
// ---------- обработчики ----------
startBtn․addEventListener('click', => {
hide(intro); hide(startBtn);
attempts = 0;
min = 1; max = 100;
nextGuess;
});
lessBtn․addEventListener('click', => {
// Загаданное число меньше текущего предположения
max = Math․floor((min + max) / 2) ─ 1;
if (max < min) { hide(lessBtn); hide(equalBtn); hide(moreBtn);
return;
} nextGuess;
});
moreBtn․addEventListener('click', => {
// Загаданное число больше текущего предположения
min = Math․floor((min + max) / 2) + 1;
if (min > max) { hide(lessBtn); hide(equalBtn); hide(moreBtn);
return;
}
nextGuess;
});
equalBtn․addEventListener('click', => {
const guessed = Math;floor((min + max) / 2); hide(lessBtn); hide(equalBtn); hide(moreBtn);
});
Кратко о работе скрипта:
- При старте диапазон задаётся
min=1, max=100․ - Функция
nextGuessвычисляет среднее значение (middle) и выводит вопрос․ - Кнопки «Меньше», «Больше», «Угадал!» меняют границы диапазона и вызывают
nextGuessснова․ - Если попыток становится больше
maxAttempts, выводится сообщение о «жульничестве»․
Расширение проекта: от «числа» к «гаданию»
После того как базовый механизм готов, его легко адаптировать под любые «магические» задачи:
- Таро‑гадание․ Вместо чисел храните массив из 78 названий карт․ При старте случайным образом выбирайте одну карту, а затем предлагайте пользователю «угадать» её, используя те же кнопки «Больше/Меньше» (по порядку колоды) или «Угадал!»․ Можно добавить изображения карт․
- Знак зодиака․ Список из 12 знаков, каждый со своим диапазоном дат․ Пользователь вводит свою дату рождения, а скрипт «угадывает» знак, задавая вопросы о месяце/дне․
Важные нюансы и рекомендации
- Адаптивность․ Добавьте медиазапросы, чтобы кнопки удобно размещались на мобильных устройствах․
- Доступность․ Используйте атрибут
aria-labelдля кнопок, чтобы скрин‑ридеры могли правильно их озвучить․ - Защита от «жульничества»․ Ограничьте количество попыток, проверяйте, чтобы границы
minиmaxне пересекались, и выводите предупреждение, если пользователь вводит противоречивые ответы․ - Кеширование․ Если планируете хранить статистику (сколько попыток потребовалось в среднем), используйте
localStorageили серверный API․ - SEO․ Добавьте мета‑теги
descriptionиkeywords, чтобы поисковики понимали, что ваш сайт – «игра‑угадайка», «онлайн‑гадание»․
Деплой (размещение) сайта
- Создайте репозиторий на GitHub․
- Включите GitHub Pages (Settings → Pages → branch
main)․ - После нескольких минут ваш сайт будет доступен по адресу
https://ваш_логин․github․io/имя_репозитория/․
Альтернативные варианты: Netlify, Vercel, любой обычный FTP‑хостинг․
Полный пример готового проекта
<head>
<meta charset=»UTF-8″>
<>Угадай число за 7 попыток</>
<style>
body {font-family:Verdana,Arial,sans-serif; text-align:center; background:#fafafa; color:#2c3e50;}
button {font-size:16px; padding:10px 20px; margin:10px; cursor:pointer;}
․hidden {display:none;}
</style>
</head>
<body>
<h1>Угадай число от 1 до 100</h1>
<p id=»intro»>Загадайте целое число от 1 до 100, а я постараюсь угадать его за 7 попыток!</p>
<button id=»startBtn»>Начать игру</button>
<p id=»question» class=»hidden»></p>
<button id=»lessBtn» class=»hidden»>Меньше</button>
<button id=»equalBtn» class=»hidden»>Угадал!</button>
<button id=»moreBtn» class=»hidden»>Больше</button>
<script>
let min = 1, max = 100, attempts = 0, maxAttempts = 7;
const intro = document․getElementById(‘intro’);
const startBtn = document․getElementById(‘startBtn’);
const question = document․getElementById(‘question’);
const lessBtn = document․getElementById(‘lessBtn’);
const equalBtn = document․getElementById(‘equalBtn’);
const moreBtn = document․getElementById(‘moreBtn’);
function show(el){ el․classList․remove(‘hidden’); }
function hide(el){ el․classList․add(‘hidden’); }
function nextGuess{
if (attempts >= maxAttempts){ hide(lessBtn); hide(equalBtn); hide(moreBtn);
return;
}
attempts++;
const middle = Math․floor((min + max) / 2); show(lessBtn); show(equalBtn); show(moreBtn);
}
startBtn․addEventListener(‘click’, => {
hide(intro); hide(startBtn);
attempts = 0; min = 1; max = 100;
nextGuess;
});
lessBtn․addEventListener(‘click’, => {
max = Math․floor((min + max) / 2) ⸺ 1;
if (max < min){ hide(lessBtn); hide(equalBtn); hide(moreBtn); return; } nextGuess; }); moreBtn․addEventListener('click', => {
min = Math․floor((min + max) / 2) + 1;
if (min > max){ hide(lessBtn); hide(equalBtn); hide(moreBtn);
return;
}
nextGuess;
});
equalBtn․addEventListener(‘click’, => {
const guessed = Math․floor((min + max) / 2); hide(lessBtn); hide(equalBtn); hide(moreBtn);
});
</script>
</body>
Что дальше?
После того как базовый «угадай‑число» готов, вы можете:
- Добавить анимацию (CSS‑переходы, небольшие эффекты появления)․
- Встроить базу предсказаний (JSON‑файл с 100 различными текстами, которые выводятся после угадывания)․
- Создать мульти‑язычную версию, используя объект
const LANG = {ru:{․․․}, en:{․․․}}․ - Подключить Google Analytics для отслеживания количества сыгранных игр․
- Разработать мобильное приложение на базе Cordova/Capacitor, используя тот же код․
Создание сайта, где пользователи могут «погадать», – это отличное упражнение для отработки навыков фронтенда и алгоритмического мышления․ Мы разобрали весь процесс от планирования до готового к публикации кода, а также показали, как легко адаптировать простую игру «Угадай число» под любые другие виды гаданий․
Теперь вы знаете, как:
- Спроектировать пользовательский интерфейс․
- Реализовать бинарный поиск на JavaScript․
- Обработать ввод пользователя и защитить игру от ошибок․
- Опубликовать готовый проект в интернете․
Удачной разработки и приятных «магических» экспериментов!