Тема «Гадалка на питоне» — это классический, но невероятно полезный учебный проект для начинающих разработчиков. Под этим названием скрывается не мистика, а практика работы с фундаментальными концепциями языка: генерацией случайных чисел (random), циклами (while, for), условными операторами (if/elif/else), функциями, а также работой с библиотеками для GUI и ботов.
В интернете часто встречаются запросы вроде «Угадай число Python» или «Создать игру Угадай число». По сути, это и есть простейшая «гадалка»: компьютер «загадывает» (генерирует) число, а пользователь пытается «предсказать» будущее. В этой статье мы пройдем путь от скрипта на 10 строк до полноценного интерактивного приложения.
Уровень 1: «Шар судьбы» (Magic 8-Ball), старт за 5 минут
Самый простой вариант гадалки, это аналог игрушки «Magic 8-Ball». Пользователь задает вопрос, программа выдает случайный ответ из заранее заготовленного списка. Идеально для понимания работы модуля random и списков (list).
Код базовой версии:
import random
import time
def magic_ball:
answers = [
"Бесспорно", "Предрешено", "Никаких сомнений", "Определенно да",
"Можешь быть уверен в этом", "Мне кажется — да", "Вероятнее всего",
"Хорошие перспективы", "Знаки говорят — да", "Да",
"Пока неясно, попробуй снова", "Спроси позже", "Лучше не рассказывать",
"Сейчас нельзя предсказать", "Сконцентрируйся и спроси опять",
"Даже не думай", "Мой ответ — нет", "По моим данным — нет",
"Перспективы не очень хорошие", "Весьма сомнительно"
]
print("🔮 Добро пожаловать в Цифровой Шар Судьбы!")
print("Задай свой вопрос, на который можно ответить 'Да' или 'Нет'.")
while True:
input("
❓ Твой вопрос (или нажми Enter для выхода): ")
if not input: break # Не сработает так, нужен ввод в переменную. Исправим ниже.
print("🌌 Гадаю...", end="", flush=True)
for _ in range(3):
time.sleep(0.5)
print(".", end="", flush=True)
print
print(f"💬 Ответ: {random.choice(answers)}")
print("-" * 40)
if __name__ == "__main__":
magic_ball
Что здесь важно:
- random.choice(sequence) — возвращает случайный элемент из непустой последовательности.
- time.sleep — добавляет «магическую» задержку для эффекта присутствия.
- Цикл while True — позволяет гадать бесконечно до принудительного выхода (Ctrl+C).
Уровень 2: Классика жанра — «Угадай число» (Guess the Number)
Согласно документации Python и множеству туториалов (например, «Глава 4. Пишем игру Угадай число на Python»), это «Hello World» алгоритмического мышления. Здесь компьютер — гадалка, загадавшая число, а человек пытается считать его мысли.
Алгоритм:
- Генерируем случайное число в диапазоне (например, 1–100).
- Запускаем цикл ввода.
- Сравниваем ввод пользователя с секретом.
- Даем подсказку: «Загаданное число больше» или «Загаданное число меньше».
- Считаем попытки.
Реализация с подсчетом попыток и валидацией:
import random
def guess_number_game:
secret = random.randint(1, 100)
attempts = 0
max_attempts = 10 # Добавляем сложность: лимит попыток
print(f"🎯 Я загадал число от 1 до 100. У тебя {max_attempts} попыток.")
while attempts < max_attempts:
try:
user_input = input(f"Попытка {attempts + 1}: Введи число: ")
guess = int(user_input)
except ValueError:
print("⚠️ Ошибка: нужно ввести целое число!")
continue
attempts += 1
if guess < secret:
print("📈 Мое число БОЛЬШЕ.")
elif guess > secret:
print("📉 Мое число МЕНЬШЕ.")
else:
print(f"🎉 Поздравляю! Ты угадал за {attempts} попыток!")
return
print(f"😢 Попытки кончились. Я загадал: {secret}.")
if __name__ == "__main__":
guess_number_game
Ключевые моменты для новичка:
- random.randint(a, b), включает оба конца диапазона (в отличие от
range). - try/except ValueError — защита от ввода текста вместо чисел (программа не упадет).
- Логика if/elif/else — основа ветвления.
Уровень 3: «Таро на каждый день» — работа со структурами данных
На этом этапе мы уходим от чисел к тексту и словарям (dict). Создадим генератор карты дня с трактовкой. Это учит работать с JSON-подобными структурами и форматированием строк (f-strings).
Пример структуры данных и логики:
import random
from datetime import date
TAROT_DECK = {
"Старшие Арканы": {
"Шут": {"meaning": "Начало пути, спонтанность, вера в неизвестность.", "advice": "Рискни начать новое дело."},
"Маг": {"meaning": "Воля, мастерство, манипуляция ресурсами.", "advice": "Используй свои навыки для решения задачи."},
"Верховная Жрица": {"meaning": "Интуиция, тайны, подсознание.", "advice": "Послушай внутренний голос."},
"Императрица": {"meaning": "Изобилие, забота, творчество.", "advice": "Окружи себя комфортом и красотой."},
"Император": {"meaning": "Структура, авторитет, контроль.", "advice": "Наведи порядок в делах."},
# ... можно добавить все 78 карт
}
}
def daily_tarot:
today = date.today.strftime("%d.%m.%Y")
arcana_type = "Старшие Арканы"
cards = list(TAROT_DECK[arcana_type].keys)
card_name = random.choice(cards)
card_info = TAROT_DECK[arcana_type][card_name]
print(f"🃏 Карта дня на {today}")
print(f"┌{'─' * 40}┐")
print(f"│ {card_name.center(38)} │")
print(f"├{'─' * 40}┤")
print(f"│ {card_info['meaning'][:38].ljust(38)} │")
print(f"├{'─' * 40}┤")
print(f"│ 💡 Совет: {card_info['advice'][:28].ljust(28)} │")
print(f"└{'─' * 40}┘")
if __name__ == "__main__":
daily_tarot
Уровень 4: GUI-гадалка на Tkinter (Десктопное приложение)
Консоль, это хорошо, но пользователи любят кнопки. tkinter входит в стандартную библиотеку Python. Создадим окно с полем для вопроса и кнопкой «Гадть».
Минимальный рабочий пример:
import tkinter as tk
from tkinter import messagebox
import random
ANSWERS = ["Да", "Нет", "Возможно", "Спроси позже", "Определенно", "Ни за что"]
def predict:
question = entry.get
if not question.strip:
messagebox.showwarning("Ошибка", "Сначала задай вопрос!")
return
# Анимация "думания" (упрощенно)
btn.config(state=tk.DISABLED, text="Гадаю...")
root.update
root.after(1000, lambda: show_result(question))
def show_result(question):
answer = random.choice(ANSWERS)
result_text = f"❓ Вопрос: {question}
🔮 Ответ: {answer}"
label_result.config(text=result_text)
btn.config(state=tk.NORMAL, text="Гадть снова")
root = tk.Tk
root.title("🔮 Python Гадалка PRO")
root.geometry("400x300")
root.resizable(False, False)
tk.Label(root, text="Задай вопрос Вселенной:", font=("Arial", 12)).pack(pady=10)
entry = tk.Entry(root, width=40, font=("Arial", 11), justify='center')
entry.pack(pady=5)
entry.bind('', lambda e: predict) # Ввод по Enter
btn = tk;Button(root, text="🔮 ГАДАТЬ", command=predict, font=("Arial", 14, "bold"), bg="#6a0dad", fg="white")
btn.pack(pady=15)
label_result = tk.Label(root, text="", font=("Arial", 11), wraplength=350, justify="center")
label_result.pack(pady=20)
root.mainloop
Теперь у вас есть полноценный .exe файл (после компиляции через pyinstaller --onefile --noconsole fortune.py), который можно скинуть другу.
Уровень 5: Telegram-бот «Гадалка» — выходим в продакшн
Самый актуальный формат 2026 года. Библиотеки aiogram 3.x (асинхронность) или python-telegram-bot. Пример на aiogram 3 с FSM (машиной состояний) для многошагового гадания (например, расклад «Кельтский крест»).
Структура бота:
- Handlers: Обработчики команд (/start, /tarot, /horoscope).
- Keyboards: Inline-кнопки для выбора расклада.
- Services: Модуль с логикой таро/нумерологии.
- Database (SQLite/PostgreSQL): Сохранение истории раскладов пользователя.
Пример хендлера для «Карты дня» (aiogram 3):
from aiogram import Router, types, F
from aiogram.filters import Command
from aiogram.utils.keyboard import InlineKeyboardBuilder
import random
from datetime import date
router = Router
CARDS = ["Шут", "Маг", "Верховная Жрица", "Императрица", "Император", "Иерофант", "Влюбленные", "Колесо Фортуны"]
@router.message(Command("tarot"))
async def cmd_tarot(message: types.Message):
builder = InlineKeyboardBuilder
builder.button(text="🃏 Карта дня", callback_data="tarot_daily")
builder.button(text="🔮 Расклад на 3 карты", callback_data="tarot_3")
builder.adjust(1)
await message.answer("Выбери тип расклада:", reply_markup=builder.as_markup)
@router.callback_query(F.data == "tarot_daily")
async def daily_tarot_callback(callback: types.CallbackQuery):
card = random.choice(CARDS)
today = date.today.strftime("%d.%m.%Y")
text = (
f"🗓 Расклад на {today}
"
f"Твоя карта: {card}
" f"Интерпретация генерируется ИИ или берется из базы..."
) await callback.answer
Плюсы бота: доступен с телефона, поддерживает кнопки, картинки карт, можно монетизировать (звезды/подписка), хранит историю.
Уровень 6: Архитектура «Профессиональной Гадалки» (Best Practices)
Если вы хотите сделать не просто учебный скрипт, а пет-проект для портфолио или стартап, обратите внимание на архитектуру:
Разделение ответственности (SoC)
fortune_teller/
├── main.py # Точка входа (CLI / Bot / GUI)
├── core/
│ ├── models.py # Dataclasses: Card, Spread, User
│ ├── logic.py # Чистая логика: shuffle, interpret, calculate_numerology
│ └── storage.py # Абстракция БД (SQLAlchemy / Tortoise ORM)
├── interfaces/
│ ├── cli.py # Аргументы argparse, цветной вывод (rich)
│ ├── tg_bot/ # Хендлеры, мидлвари, клавиатуры aiogram
│ └── gui/ # Tkinter / PyQt6 / Flet приложение
├── data/
│ └── tarot_meanings.json # База знаний (отдельно от кода)
├── tests/
│ └── test_logic.py # Pytest: тесты логики без UI
├── requirements.txt
└── README.md
Использование rich для красивой консоли
Больше никаких `print`. Таблицы, прогресс-бары, цветной текст, панели — делают CLI-гадалку приятной для глаза.
Асинхронность (asyncio)
Если гадалка ходит за гороскопами в API (например, horoscope-api), парсит сайты или генерирует картинки через Stable Diffusion API, async/await обязателен, чтобы не блокировать интерфейс.
Тестирование детерминированности
Как тестировать рандом? Используйте random.seed(42) в тетах или мокайте random.choice через unittest.mock.patch.
Идеи для расширения (Roadmap)
- Нумерология: Расчет числа судьбы, числа имени, матрицы Пифагора по дате рождения.
- Астрология: Интеграция с
kerykeionилиflatlibдля натальных карт (требует точного времени рождения). - ИИ-интерпретатор: Промпт в OpenAI/GigaChat/YandexGPT: «Ты опытный таролог. Расклад: [карты]. Вопрос: [вопрос]. Дай совет».
- Генерация изображений: Рендеринг расклада картинкой (Pillow / ReportLab) или генерация уникального арта под карту (Kandinsky / Midjourney API).
- Геймификация: Достижения («Угадал 10 раз подряд»), ежедневные бонусы, реферальная система в боте.
Написание «Гадалки на Python» — это идеальный полигон для прокача скиллов:
- Junior: Учим
random,input,if/else, циклы (Уровень 1-2). - Middle: ООП, работа с API, БД, GUI, боты, тесты, типизация (mypy), линтеры (ruff) (Уровень 3-5).
- Senior/Architect: Чистая архитектура, DI, микросервисы (отдельный сервис генерации, отдельный бот), CI/CD, мониторинг, нагрузочное тестирование.
Важное предупреждение (Disclaimer): Любая программа-гadalка, это всего лишь псевдослучайная генерация (PRNG) или работа с заранее заложенными шаблонами. Python не обладает экстрасенсорными способностями (пока что). Используйте такие проекты для обучения, развлечения и портфолио, но не для принятия жизненно важных решений.
«Компьютеры бесполезны. Они могут только давать ответы»., Пабло Пикассо (приписывается).
Наша задача как разработчиков, научить их задавать правильные вопросы и красиво оформлять ответы.
Начинайте с import random и через пару недель у вас будет свой Telegram-бот с таро, нумерологией и ИИ-интерпретатором. Удачи в кодинге! 🐍✨