Содержание
- Правила игры
- Алгоритм угадывания (бинарный поиск)
- Образовательная ценность проекта
- Примеры реализации
- Консольная игра на Go
- Консольная игра на Python
- Веб‑версия на JavaScript
- Вариации и расширения
- Полезные советы и типичные ошибки
Игра «Угадай номер» (иногда «Угадай число») – классическая логическая игра‚ в которой один из участников (обычно компьютер) загадывает целое число в заданном диапазоне‚ а второй (игрок) пытается его отгадать‚ получая после каждой попытки подсказку «больше» или «меньше». Несмотря на простоту‚ игра позволяет познакомиться с фундаментальными понятиями программирования: генерация случайных чисел‚ условные операторы‚ циклы‚ работа с вводом‑выводом и‚ что особенно важно‚ с алгоритмом бинарного поиска.
В учебных проектах «Угадай номер» часто используют в качестве PET‑проекта (Project for Educational Training)‚ потому что она сочетает в себе развлекательный элемент и практику решения реальной задачи.
Правила игры
- Компьютер случайным образом выбирает целое число N в диапазоне [A; B] (например‚ от 1 до 100).
- Игрок вводит предположение X.
- Программа сравнивает X с N и выводит одну из трёх реакций:
- «Меньше»‚ если X > N;
- «Больше»‚ если X < N;
- «Поздравляем! Вы угадали»‚ если X = N.
- Игра продолжается‚ пока игрок не угадает число или не исчерпает ограничение по количеству попыток (если такое задано).
Вариантов правил множество: ограничение по попыткам‚ подсказка о «расстоянии» (например‚ «на 5 ближе к загаданному»)‚ несколько уровней сложности и т.д.
Алгоритм угадывания (бинарный поиск)
Самый эффективный способ угадывать число – использовать алгоритм бинарного поиска. Идея проста: каждый раз делим текущий диапазон пополам и выбираем середину в качестве следующей попытки.
Пошаговый процесс
- Установить границы:
low = A‚high = B. - Пока
low ≤ high:- Вычислить
mid = (low + high) / 2(целочисленное деление). - Сделать предположение
mid. - Если
mid=N– игра завершена. - Если
mid>N‚ установитьhigh = mid ― 1(исключаем правую часть). - Если
mid<N‚ установитьlow = mid + 1(исключаем левую часть).
- Вычислить
При диапазоне от 1 до 100 алгоритм гарантирует угадывание за максимум ⌈log₂(100)⌉ = 7 попыток.
Образовательная ценность проекта
Работа над игрой «Угадай номер» охватывает несколько учебных целей:
- Работа с библиотеками и функциями. Студенты изучают‚ как подключать стандартные библиотеки (например‚
math/randв Go илиrandomв Python). - Условные операторы. Оператор
if‑elseиспользуется для сравнения предположения с загаданным числом. - Циклы.
whileилиforреализуют процесс многократных попыток. - Алгоритмическое мышление. Понимание бинарного поиска развивает навыки оптимального деления задачи.
- Ввод‑вывод. Ученики учатся принимать данные от пользователя и выводить результат в консоль или в веб‑интерфейс.
- Тестирование и отладка. Проект легко расширяется: добавление ограничения по попыткам‚ проверка корректности ввода и т.д.
Примеры реализации
Консольная игра на Go
Go – отличный язык для демонстрации работы с функциями и случайными числами. Ниже минимальный вариант.
package main
import (
"bufio"
"fmt"
"math/rand"
"os"
"time"
)
func main {
rand.Seed(time.Now.UnixNano)
const min = 1
const max = 100
secret := rand.Intn(max-min+1) + min // загадываем число
fmt.Printf("Я загадал число от %d до %d. Попробуйте его угадать!
"‚ min‚ max)
scanner := bufio.NewScanner(os.Stdin)
attempts := 0
for {
fmt.Print("Ваше предположение: ")
if !scanner.Scan {
fmt.Println("
Ввод завершён.")
return
}
var guess int
_‚ err := fmt.Sscanf(scanner.Text‚ "%d"‚ &guess)
if err != nil {
fmt.Println("Введите корректное целое число.")
continue
}
attempts++
if guess == secret {
fmt.Printf("Поздравляем! Вы угадали число %d за %d попыток.
"‚ secret‚ attempts)
break
} else if guess > secret {
fmt.Println("Меньше.")
} else {
fmt.Println("Больше.")
}
}
}
Ключевые моменты:
- Функция
rand.Intnгенерирует случайное число; - Для чтения ввода используется
bufio.Scanner. - Алгоритм угадывания полностью полагается на игрока; если хотите автоматизировать‚ замените ввод на бинарный поиск.
Консольная игра на Python
import random
def guess_number:
low‚ high = 1‚ 100
secret = random.randint(low‚ high)
attempts = 0
print(f"Я загадал число от {low} до {high}. Попробуйте отгадать.")
while True:
try:
guess = int(input("Ваше предположение: "))
except ValueError:
print("Введите целое число.")
continue
attempts += 1
if guess == secret:
print(f"Поздравляем! Вы угадали число {secret} за {attempts} попыток.")
break
elif guess > secret:
print("Меньше.")
else:
print("Больше.")
if __name__ == "__main__":
guess_number
Эта версия позволяет играть в браузере‚ а также демонстрирует работу с DOM.
<html lang=»ru»>
<head>
<meta charset=»UTF-8″>
<title>Угадай номер</title>
<style>
body {font-family: Arial‚ sans-serif; margin: 2rem;}
#log {margin-top: 1rem; white-space: pre-line;}
</style>
</head>
<body>
<h1>Угадай номер</h1>
<p>Я загадал число от 1 до 100. Введите ваш вариант ниже.</p>
<input type=»number» id=»guessInput» min=»1″ max=»100″>
<button id=»guessBtn»>Проверить</button>
<div id=»log»></div>
<script>
const min = 1‚ max = 100;
const secret = Math.floor(Math.random * (max ― min + 1)) + min;
let attempts = 0;
const log = document.getElementById(‘log’);
document.getElementById(‘guessBtn’).addEventListener(‘click’‚ => {
const guess = Number(document.getElementById(‘guessInput’).value);
if (!guess || guess < min || guess > max) {
log.textContent += «Введите число от 1 до 100.
«;
return;
}
attempts++;
if (guess === secret) {
log.textContent += `Поздравляем! Вы угадали число ${secret} за ${attempts} попыток.
`;
document.getElementById(‘guessBtn’).disabled = true;
} else if (guess > secret) {
log.textContent += «Меньше.
«;
} else {
log.textContent += «Больше.
«;
}
});
</script>
</body>
Вариации и расширения
Чтобы сделать игру более интересной или учебной‚ можно добавить:
- Ограничение по попыткам. Например‚ 7 попыток – идеальное для демонстрации эффективности бинарного поиска.
- Режим «бота». Программа сама угадывает число‚ используя бинарный поиск‚ а пользователь задаёт ответы «больше/меньше».
- Диапазон с отрицательными числами. Позволит обсудить работу с знаковыми типами.
- Графический интерфейс. Использовать библиотеки Tkinter (Python)‚ Swing (Java) или Qt (C++).
- Мультиплеер. Два игрока поочерёдно загадывают числа друг другу.
Полезные советы и типичные ошибки
- Проверка ввода. Пользователь может ввести нечисловое значение или число вне диапазона – всегда проверяйте и выводите понятное сообщение.
- Инициализация генератора случайных чисел. В Go и Python необходимо «посеять» генератор (seed)‚ иначе при каждом запуске будет одно и то же число.
- Корректное вычисление середины. При больших диапазонах используйте формулу
mid = low + (high ౼ low) / 2‚ чтобы избежать переполнения. - Отладка. При реализации бота‑угадывателя выводите текущие границы
lowиhigh– это помогает понять‚ где происходит ошибка. - Не забывайте о закрытии ресурсов. В Go‚ если используете
bufio.NewReader‚ закрывайтеos.Stdinтолько если открывали отдельный файл. - Тестирование граничных случаев. Попробуйте загадать минимальное (A) и максимальное (B) числа – убедитесь‚ что игра их корректно обрабатывает.
Игра «Угадай номер» – это простейший‚ но мощный учебный проект. Она позволяет новичкам освоить базовые конструкции языка‚ а более продвинутым студентам продемонстрировать применение алгоритма бинарного поиска‚ который в реальных задачах часто используется для ускорения поиска в отсортированных данных.
С помощью представленных примеров на Go‚ Python и JavaScript любой желающий может быстро собрать рабочую версию игры‚ а затем расширять её‚ добавляя новые режимы‚ графический интерфейс или сетевую многопользовательскую поддержку.
Помните: главное в обучении – практиковаться. Попробуйте написать свою версию‚ изменить правила и посмотреть‚ как меняется сложность. Удачной разработки!