Разработка числовой угадайки на Python: от простого к сложному

Раздел: Практические задачи -> Игры

Основные подходы к реализации игры «Угадай число»

Базовое решение с ограничением попыток

Этот вариант включает защиту от неверного ввода и лимит попыток, что делает игру законченной. Используется модуль random для генерации числа, цикл while с счётчиком и try-except для обработки ошибок.

import random

number = random.randint(1, 100)
max_attempts = 7
attempts = 0

while attempts < max_attempts:
    attempts += 1
    try:
        guess = int(input(f'Попытка {attempts}/{max_attempts}. Введите число: '))
    except ValueError:
        print('Ошибка: введите целое число.')
        attempts -= 1
        continue
    if guess == number:
        print(f'Поздравляем! Вы угадали за {attempts} попыток.')
        break
    elif guess < number:
        print('Загаданное число больше.')
    else:
        print('Загаданное число меньше.')
else:
    print(f'Вы проиграли. Загаданное число было {number}.')

игра угадай число на python (игра «угадай число» на python)

Пояснения: функция random.randint(1,100) даёт случайное целое. Переменная max_attempts задаёт лимит. Ввод преобразуется в int; при ошибке попытка не засчитывается (attempts -= 1). Цикл продолжается, пока не исчерпаны попытки или число не угадано. После завершения цикла (если break не сработал) выполняется блок else.

Возможные проблемы

  • Неверный ввод числа – если ввести буквы, возникнет ValueError. Решение: обработка в try-except с пропуском текущей попытки.
  • Выход за диапазон – число может быть меньше 1 или больше 100. Решение: добавить условие if guess < 1 or guess > 100.
  • Увеличение счётчика при ошибочном вводе – если не откатывать attempts, лимит исчерпается быстрее.

Как организовать игру без ограничения количества попыток?

Цель: дать пользователю неограниченное число попыток, что полезно для тренировки или когда важно угадать любой ценой.

import random
number = random.randint(1, 100)
attempts = 0
while True:
    attempts += 1
    try:
        guess = int(input('Введите число: '))
    except ValueError:
        print('Ошибка: введите целое число.')
        continue
    if guess == number:
        print(f'Угадали за {attempts} попыток!')
        break
    elif guess < number:
        print('Больше')
    else:
        print('Меньше')

Python games py (создание игр на python)

Отличие от предыдущего – отсутствие проверки на лимит. Цикл while True выполняется до угадывания. При ошибочном вводе попытка засчитывается (continue не уменьшает счётчик).

Проблема: нет возможности закончить игру досрочно. Решение: добавить проверку на спецкоманду, например 'exit'.

Как добавить подсказки «горячо-холодно»?

Цель: дать более информативную обратную связь на основе разницы между введённым и загаданным числом.

import random
number = random.randint(1, 100)
attempts = 0
while True:
    attempts += 1
    try:
        guess = int(input('Ваше предположение: '))
    except ValueError:
        print('Ошибка')
        continue
    diff = abs(guess - number)
    if diff == 0:
        print(f'Угадали за {attempts} попыток!')
        break
    elif diff <= 10:
        print('Горячо!')
    elif diff <= 25:
        print('Тепло')
    else:
        print('Холодно')

Здесь вычисляется абсолютная разница. Если она меньше порогов, выдаются подсказки. Можно настроить проценты или другие диапазоны.

Ошибка: подсказки не учитывают направление. Для улучшения можно комбинировать «горячо-холодно» с «больше-меньше».

Как реализовать возможность играть несколько раз подряд?

Цель: после завершения раунда предложить сыграть снова, чтобы не перезапускать программу.

import random

while True:
    number = random.randint(1, 100)
    attempts = 0
    print('Новый раунд!')
    while True:
        attempts += 1
        try:
            guess = int(input('Введите число: '))
        except ValueError:
            print('Ошибка')
            continue
        if guess == number:
            print(f'Угадали! Попыток: {attempts}')
            break
        elif guess < number:
            print('Больше')
        else:
            print('Меньше')
    answer = input('Ещё раунд? (да/нет): ')
    if answer.lower() != 'да':
        break

Внешний цикл заново генерирует число и обнуляет счётчик. Внутренний цикл – игра. После угадывания запрашивается желание продолжить.

Проблема: если ввести не 'да', считается отказ. Решение: обработать все варианты (да, нет, y, n).

Как сделать настраиваемый диапазон чисел (уровни сложности)?

Цель: позволить игроку выбирать сложность, влияющую на количество попыток.

import random

difficulty = input('Выберите уровень: 1 (лёгкий 1-50), 2 (средний 1-100), 3 (сложный 1-200): ')
if difficulty == '1':
    max_num = 50
elif difficulty == '2':
    max_num = 100
elif difficulty == '3':
    max_num = 200
else:
    max_num = 100

number = random.randint(1, max_num)
max_attempts = max(5, max_num // 20)
attempts = 0
while attempts < max_attempts:
    attempts += 1
    try:
        guess = int(input(f'Попытка {attempts}/{max_attempts} (1-{max_num}): '))
    except ValueError:
        print('Ошибка')
        attempts -= 1
        continue
    if guess == number:
        print(f'Угадали!')
        break
    elif guess < number:
        print('Больше')
    else:
        print('Меньше')
else:
    print(f'Проигрыш. Число было {number}')

Здесь max_num выбирается на основе ввода, а лимит попыток вычисляется. Можно также задать фиксированное количество для каждого уровня.

Ошибка: при неверном выборе уровня программа использует значение по умолчанию. Решение: запрашивать повторно до корректного ввода.

Как реализовать запись рекордов в файл?

Цель: сохранять лучший результат (минимальное количество попыток) между запусками.

import random
import json

def save_record(record):
    with open('records.json', 'w') as f:
        json.dump(record, f)

def load_record():
    try:
        with open('records.json', 'r') as f:
            return json.load(f)
    except FileNotFoundError:
        return None

number = random.randint(1, 100)
attempts = 0
record = load_record()
if record:
    print(f'Рекорд: {record} попыток')

while True:
    attempts += 1
    try:
        guess = int(input('Введите число: '))
    except ValueError:
        print('Ошибка')
        continue
    if guess == number:
        print(f'Угадали за {attempts} попыток!')
        if record is None or attempts < record:
            save_record(attempts)
            print('Новый рекорд!')
        break
    elif guess < number:
        print('Больше')
    else:
        print('Меньше')

Для хранения рекорда используется JSON-файл. Функции save_record и load_record обеспечивают чтение и запись.

Проблема: при первом запуске файл отсутствует – исключение FileNotFoundError обрабатывается и возвращается None. Решение: использовать try-except как показано.

Как применить объектно-ориентированный подход?

Цель: структурировать код, выделив логику игры в отдельный класс.

import random

class GuessGame:
    def __init__(self, low=1, high=100, max_attempts=7):
        self.low = low
        self.high = high
        self.max_attempts = max_attempts
        self.number = random.randint(low, high)
        self.attempts = 0

    def guess(self, num):
        self.attempts += 1
        if num == self.number:
            return True, self.attempts
        elif num < self.number:
            return False, 'больше'
        else:
            return False, 'меньше'

game = GuessGame()
while game.attempts < game.max_attempts:
    try:
        user_input = int(input(f'Попытка {game.attempts+1}/{game.max_attempts}: '))
    except ValueError:
        print('Ошибка')
        continue
    done, msg = game.guess(user_input)
    if done:
        print(f'Угадали за {msg} попыток!')
        break
    else:
        print(f'Загаданное число {msg}.')
else:
    print(f'Проигрыш. Число было {game.number}')

Класс GuessGame инкапсулирует данные и методы. Метод guess возвращает результат и сообщение.

Проблема: отсутствует проверка ввода на принадлежность диапазону. Можно добавить метод validate.

Расширенные примеры реализации игры

Пример с библиотекой Rich для цветного консольного вывода

Библиотека Rich позволяет выводить текст с цветами и стилями, делая игру более привлекательной.

Пример
import random
from rich.console import Console
from rich.prompt import Prompt

console = Console()
number = random.randint(1, 100)
attempts = 0

while True:
    attempts += 1
    guess = Prompt.ask('Введите число от 1 до 100')
    if not guess.isdigit():
        console.print('[red]Ошибка: введите число[/]')
        continue
    guess = int(guess)
    if guess == number:
        console.print(f'[green]Поздравляем! Угадали за {attempts} попыток[/]')
        break
    elif guess < number:
        console.print('[yellow]Загаданное число больше[/]')
    else:
        console.print('[yellow]Загаданное число меньше[/]')

Пояснения: Prompt.ask выводит приглашение и читает строку. Проверка isdigit() заменяет try-except. Цвета задаются в тегах [color]...[/].

Введите число от 1 до 100: 50
Загаданное число больше
Введите число от 1 до 100: 75
Загаданное число меньше
...

Многопользовательская игра: один загадывает, другой отгадывает

Программа выступает посредником: первый игрок вводит загаданное число (оно не показывается), второй игрок пытается угадать с подсказками.

Пример
import os

def clear_screen():
    os.system('cls' if os.name == 'nt' else 'clear')

print('Режим: два игрока.')
print('Игрок 1, загадайте число от 1 до 100.')
number = int(input('Введите число (оно не будет показано второму игроку): '))
clear_screen()

attempts = 0
while True:
    attempts += 1
    guess = int(input(f'Игрок 2, попытка {attempts}. Ваше предположение: '))
    if guess == number:
        print(f'Поздравляем! Угадано за {attempts} попыток.')
        break
    elif guess < number:
        print('Загаданное число больше.')
    else:
        print('Загаданное число меньше.')

Пояснения: функция clear_screen очищает экран, чтобы второй игрок не увидел введённое число. Ввод первого игрока сохраняется в переменную.

Игрок 1, загадайте число от 1 до 100.
Введите число (оно не будет показано второму игроку): 42
[экран очищен]
Игрок 2, попытка 1. Ваше предположение: 50
Загаданное число меньше.
...

Игра «Угадай число» на Python - comments

En
игра угадай число на python (python)