Разработка проекта Угадай число в 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.