Разработка числовой угадайки на 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 Загаданное число меньше. ...