Разработка проекта Угадай число в Python

Раздел: Приложения на Python -> Игровые программы

Основные принципы игры Угадай число

Наиболее эффективное решение, сочетающее простоту и читаемость, использует модуль random, цикл while и обработку исключений. Такой код подходит для обучения и быстрого запуска.

import random

number = random.randint(1, 100)
attempts = 0
while True:
    try:
        guess = int(input("Ваше предположение: "))
        attempts += 1
        if guess < number:
            print("Загаданное число больше.")
        elif guess > number:
            print("Загаданное число меньше.")
        else:
            print(f"Поздравляю! Вы угадали за {attempts} попыток.")
            break
    except ValueError:
        print("Введите целое число.")

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

Пояснение: после импорта модуля генерируется случайное число от 1 до 100. Цикл while True продолжает запрашивать ввод, пока не будет угадано. При каждой итерации увеличивается счетчик попыток. В случае неверного ввода (строка, символ) блок except перехватывает исключение и выводит сообщение. При правильном ответе выводится количество попыток и цикл прерывается.

Типичные ошибки: отсутствие импорта random, незавершающийся цикл (если не поставить break), потеря счетчика попыток при неверном вводе (увеличивается даже при ошибке ввода, что некорректно).

Решение: импортировать random в начале; всегда предусматривать break при угадывании; переместить увеличение attempts после успешного преобразования int или внутрь блока else.

Как сделать ограничение числа попыток?

Для введения лимита попыток добавляется условие while attempts < max_attempts. После превышения лимита выводится проигрышное сообщение.

max_attempts = 7
attempts = 0
while attempts < max_attempts:
    # ввод и проверка
    attempts += 1
else:
    print(f"Попытки закончились. Загадано было {number}.")

Цель: сделать игру более соревновательной. Используется, когда необходимо задать фиксированное количество ходов.

Ошибка: неверное расположение увеличения attempts (например, до проверки ввода). Это приведет к неверному счету.

Исправление: увеличивать счетчик только после успешного ввода числа.

Как дать пользователю возможность задать диапазон чисел?

Пользователь вводит нижнюю и верхнюю границы. Затем в этом диапазоне генерируется случайное число.

low = int(input("Нижняя граница: "))
high = int(input("Верхняя граница: "))
number = random.randint(low, high)

Вариант подходит для настройки сложности. Реализуется в начале программы.

Проблема: возможен ввод low > high; отсутствие проверки на отрицательные значения.

Решение: добавить проверку if low > high: поменять местами или запросить повторно.

Как реализовать уровни сложности?

Создается словарь или if-elif для выбора уровня, который определяет диапазон и количество попыток.

levels = {
    'easy': (1, 50, 10),
    'medium': (1, 100, 7),
    'hard': (1, 200, 5)
}
choice = input("Выберите уровень (easy/medium/hard): ").lower()
low, high, max_attempts = levels.get(choice, (1, 100, 7))

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

Ошибка: неверный ввод уровня (не из списка).

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

Как добавить сохранение лучшего результата?

Результат (количество попыток) сохраняется в файл (например, JSON или текстовый). При новом запуске сравнивается с предыдущим.

import json
best = None
try:
    with open('best.json') as f:
        best = json.load(f).get('best')
except FileNotFoundError:
    pass
# после игры
if best is None or attempts < best:
    best = attempts
    with open('best.json', 'w') as f:
        json.dump({'best': best}, f)
    print("Новый рекорд!")

Цель: повышение мотивации. Используется в законченных проектах.

Проблема: необработанное исключение при повреждении файла; попытка записи без прав.

Решение: использовать try-except при чтении и записи, проверять доступность файла.

Как сделать игру, в которой компьютер угадывает число человека?

Пользователь загадывает число, компьютер пытается угадать, используя бинарный поиск или случайные числа. Бинарный поиск эффективнее.

low = 1
high = 100
while low <= high:
    guess = (low + high) // 2
    answer = input(f"Вы загадали {guess}? (больше/меньше/да): ").lower()
    if answer == 'да':
        print("Компьютер угадал!")
        break
    elif answer == 'больше':
        low = guess + 1
    elif answer == 'меньше':
        high = guess - 1

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

Ошибка: неверный ввод ответа (не 'больше', 'меньше', 'да'). Может привести к бесконечному циклу.

Решение: проверять ответ с помощью цикла while и списка допустимых значений.

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

Полноценная игра с меню и двумя режимами

Данный пример объединяет режим 'человек угадывает' и 'компьютер угадывает' в одной программе с выбором через меню.

Пример
import random

def user_guess():
    low, high = 1, 100
    number = random.randint(low, high)
    attempts = 0
    while True:
        try:
            guess = int(input('Ваше предположение: '))
            attempts += 1
            if guess < number:
                print('Больше')
            elif guess > number:
                print('Меньше')
            else:
                print(f'Угадали за {attempts} попыток')
                return attempts
        except ValueError:
            print('Введите число')

def computer_guess():
    low, high = 1, 100
    attempts = 0
    print('Загадайте число от 1 до 100')
    while low <= high:
        guess = (low + high) // 2
        attempts += 1
        answer = input(f'{guess}? (больше/меньше/да): ').lower()
        if answer == 'да':
            print(f'Компьютер угадал за {attempts} попыток')
            return attempts
        elif answer == 'больше':
            low = guess + 1
        elif answer == 'меньше':
            high = guess - 1
        else:
            print('Ответьте: больше, меньше или да')
    print('Кажется, вы загадали не то число')

def main():
    print('1 - Человек угадывает')
    print('2 - Компьютер угадывает')
    choice = input('Выберите режим: ')
    if choice == '1':
        user_guess()
    elif choice == '2':
        computer_guess()
    else:
        print('Неверный выбор')

if __name__ == '__main__':
    main()
Пример вывода:
1 - Человек угадывает
2 - Компьютер угадывает
Выберите режим: 2
Загадайте число от 1 до 100
50? (больше/меньше/да): больше
75? (больше/меньше/да): меньше
62? (больше/меньше/да): да
Компьютер угадал за 3 попыток

Пояснение: каждая функция возвращает количество попыток. При желании можно добавить сравнение результатов.

Игра с сохранением статистики в JSON и серией раундов

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

Пример
import json, random, os

STATS_FILE = 'stats.json'

def load_stats():
    if os.path.exists(STATS_FILE):
        with open(STATS_FILE, 'r') as f:
            return json.load(f)
    return {'best': None, 'total_games': 0, 'total_attempts': 0}

def save_stats(stats):
    with open(STATS_FILE, 'w') as f:
        json.dump(stats, f)

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

def main():
    stats = load_stats()
    print(f'Всего игр сыграно: {stats["total_games"]}')
    if stats['best']:
        print(f'Лучший результат: {stats["best"]} попыток')
    while True:
        input('Нажмите Enter для новой игры (или введите exit для выхода): ')
        attempts = play_round()
        stats['total_games'] += 1
        stats['total_attempts'] += attempts
        if stats['best'] is None or attempts < stats['best']:
            stats['best'] = attempts
            print('Новый рекорд!')
        save_stats(stats)
        print(f'Среднее количество попыток: {stats["total_attempts"]/stats["total_games"]:.1f}')
        if input('Продолжить? (да/нет): ').lower() != 'да':
            break

if __name__ == '__main__':
    main()
Пример вывода:
Всего игр сыграно: 0
Нажмите Enter для новой игры (или введите exit для выхода): 
... (игра) ...
Новый рекорд!
Среднее количество попыток: 5.0
Продолжить? (да/нет): да
...

Пояснение: используется модуль os для проверки существования файла. Статистика сохраняется после каждого раунда.

Игра с графическим интерфейсом на tkinter (краткий обзор)

Для разнообразия можно создать простую версию с окном. Ниже приведен минимальный пример с полем ввода и кнопкой.

Пример
import random
import tkinter as tk
from tkinter import messagebox

class GuessGame:
    def __init__(self):
        self.root = tk.Tk()
        self.root.title('Угадай число')
        self.number = random.randint(1, 100)
        self.attempts = 0
        
        self.label = tk.Label(self.root, text='Введите число от 1 до 100:')
        self.label.pack()
        self.entry = tk.Entry(self.root)
        self.entry.pack()
        self.btn = tk.Button(self.root, text='Проверить', command=self.check)
        self.btn.pack()
        self.root.mainloop()
    
    def check(self):
        try:
            guess = int(self.entry.get())
            self.attempts += 1
            if guess < self.number:
                messagebox.showinfo('Результат', 'Больше')
            elif guess > self.number:
                messagebox.showinfo('Результат', 'Меньше')
            else:
                messagebox.showinfo('Результат', f'Угадали за {self.attempts} попыток')
                self.root.destroy()
        except ValueError:
            messagebox.showerror('Ошибка', 'Введите число')

if __name__ == '__main__':
    GuessGame()

Графическая версия упрощает взаимодействие с игроком. Используется для знакомства с библиотекой tkinter.

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

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