Гадалка на питоне

Тема «Гадалка на питоне» — это классический, но невероятно полезный учебный проект для начинающих разработчиков. Под этим названием скрывается не мистика, а практика работы с фундаментальными концепциями языка: генерацией случайных чисел (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. Генерируем случайное число в диапазоне (например, 1–100).
  2. Запускаем цикл ввода.
  3. Сравниваем ввод пользователя с секретом.
  4. Даем подсказку: «Загаданное число больше» или «Загаданное число меньше».
  5. Считаем попытки.

Реализация с подсчетом попыток и валидацией:

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)

  1. Нумерология: Расчет числа судьбы, числа имени, матрицы Пифагора по дате рождения.
  2. Астрология: Интеграция с kerykeion или flatlib для натальных карт (требует точного времени рождения).
  3. ИИ-интерпретатор: Промпт в OpenAI/GigaChat/YandexGPT: «Ты опытный таролог. Расклад: [карты]. Вопрос: [вопрос]. Дай совет».
  4. Генерация изображений: Рендеринг расклада картинкой (Pillow / ReportLab) или генерация уникального арта под карту (Kandinsky / Midjourney API).
  5. Геймификация: Достижения («Угадал 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-бот с таро, нумерологией и ИИ-интерпретатором. Удачи в кодинге! 🐍✨