Игра Угадай номер


Содержание

  1. Правила игры
  2. Алгоритм угадывания (бинарный поиск)
  3. Образовательная ценность проекта
  4. Примеры реализации
    • Консольная игра на Go
    • Консольная игра на Python
    • Веб‑версия на JavaScript
  5. Вариации и расширения
  6. Полезные советы и типичные ошибки

Игра «Угадай номер» (иногда «Угадай число») – классическая логическая игра‚ в которой один из участников (обычно компьютер) загадывает целое число в заданном диапазоне‚ а второй (игрок) пытается его отгадать‚ получая после каждой попытки подсказку «больше» или «меньше». Несмотря на простоту‚ игра позволяет познакомиться с фундаментальными понятиями программирования: генерация случайных чисел‚ условные операторы‚ циклы‚ работа с вводом‑выводом и‚ что особенно важно‚ с алгоритмом бинарного поиска.

В учебных проектах «Угадай номер» часто используют в качестве PET‑проекта (Project for Educational Training)‚ потому что она сочетает в себе развлекательный элемент и практику решения реальной задачи.


Правила игры

  • Компьютер случайным образом выбирает целое число N в диапазоне [A; B] (например‚ от 1 до 100).
  • Игрок вводит предположение X.
  • Программа сравнивает X с N и выводит одну из трёх реакций:
    • «Меньше»‚ если X > N;
    • «Больше»‚ если X < N;
    • «Поздравляем! Вы угадали»‚ если X = N.
  • Игра продолжается‚ пока игрок не угадает число или не исчерпает ограничение по количеству попыток (если такое задано).

Вариантов правил множество: ограничение по попыткам‚ подсказка о «расстоянии» (например‚ «на 5 ближе к загаданному»)‚ несколько уровней сложности и т.д.


Алгоритм угадывания (бинарный поиск)

Самый эффективный способ угадывать число – использовать алгоритм бинарного поиска. Идея проста: каждый раз делим текущий диапазон пополам и выбираем середину в качестве следующей попытки.

Пошаговый процесс

  1. Установить границы: low = A‚ high = B.
  2. Пока 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++).
  • Мультиплеер. Два игрока поочерёдно загадывают числа друг другу.

Полезные советы и типичные ошибки

  1. Проверка ввода. Пользователь может ввести нечисловое значение или число вне диапазона – всегда проверяйте и выводите понятное сообщение.
  2. Инициализация генератора случайных чисел. В Go и Python необходимо «посеять» генератор (seed)‚ иначе при каждом запуске будет одно и то же число.
  3. Корректное вычисление середины. При больших диапазонах используйте формулу mid = low + (high ౼ low) / 2‚ чтобы избежать переполнения.
  4. Отладка. При реализации бота‑угадывателя выводите текущие границы low и high – это помогает понять‚ где происходит ошибка.
  5. Не забывайте о закрытии ресурсов. В Go‚ если используете bufio.NewReader‚ закрывайте os.Stdin только если открывали отдельный файл.
  6. Тестирование граничных случаев. Попробуйте загадать минимальное (A) и максимальное (B) числа – убедитесь‚ что игра их корректно обрабатывает.

Игра «Угадай номер» – это простейший‚ но мощный учебный проект. Она позволяет новичкам освоить базовые конструкции языка‚ а более продвинутым студентам продемонстрировать применение алгоритма бинарного поиска‚ который в реальных задачах часто используется для ускорения поиска в отсортированных данных.

С помощью представленных примеров на Go‚ Python и JavaScript любой желающий может быстро собрать рабочую версию игры‚ а затем расширять её‚ добавляя новые режимы‚ графический интерфейс или сетевую многопользовательскую поддержку.

Помните: главное в обучении – практиковаться. Попробуйте написать свою версию‚ изменить правила и посмотреть‚ как меняется сложность. Удачной разработки!