Python код программы для гадания на картах таро

Запусти собственное гадание на картах Таро прямо в Python — мгновенные расклады, тайны будущего и крутой код!

Дата актуальности: 21:42 (по московскому времени)


Что делает этот скрипт?

Программа имитирует классический расклад «Кельтский крест» из 10 карт, объясняет их позиции и выводит краткие толкования. Всё работает прямо в браузере, в консоли или на сервере Flask. Никаких сторонних библиотек не требуется — только стандартная библиотека Python 3.

Архитектура за 2 минуты

  • Card — класс, описывающий масть, ранг и «значение» карты.
  • Deck — колода 78 карт (22 Старших Аркана + 56 Младших).
  • Spread — класс, который «тасует» колоду и раскладывает 10 карт по позициям.
  • Interpreter, набор заранее подготовленных толкований на русском языке.

Полный код (готов к запуску)

Скопируйте в файл tarot.py и запустите: python3 tarot.py


import random
from dataclasses import dataclass
from typing import List, Dict

@dataclass
class Card:
 name: str
 arcana: str # 'major' или 'minor'
 suit: str # 'wands', 'cups', 'swords', 'pentacles', ''
 rank: str # 'Ace', '2'..'10', 'Page', 'Knight', 'Queen', 'King', ''
 upright_meaning: str
 reversed_meaning: str

 def meaning(self, reversed_flag=False):

 return self.reversed_meaning if reversed_flag else self.upright_meaning
class Deck:
 major = [
 "Шут", "Маг", "Верховная Жрица", "Императрица", "Император",
 "Иерофант", "Влюблённые", "Колесница", "Сила", "Отшельник",
 "Колесо Фортуны", "Справедливость", "Повешенный", "Смерть",
 "Умеренность", "Дьявол", "Башня", "Звезда", "Луна", "Солнце",
 "Суд", "Мир"
 ]
 suits = ["Жезлы", "Кубки", "Мечи", "Пентакли"]
 ranks = ["Туз"] + [str(i) for i in range(2, 11)] + ["Паж", "Рыцарь", "Королева", "Король"]

 def __init__(self):
 self.cards: List[Card] = []
 self._build

 def _build(self):
 # Старшие
 for name in self.major:
 self.cards.append(Card(
 name=name,
 arcana="major",
 suit="",
 rank="",
 upright_meaning=f"Прямое значение {name}",
 reversed_meaning=f"Перевёрнутое значение {name}"
 ))
 # Младшие
 for suit in self.suits:
 for rank in self.ranks:
 self.cards.append(Card(
 name=f"{rank} {suit}",
 arcana="minor",
 suit=suit,
 rank=rank,
 upright_meaning=f"Прямое значение {rank} {suit}",
 reversed_meaning=f"Перевёрнутое значение {rank} {suit}"
 ))

 def shuffle(self):
 random.shuffle(self.cards)
 return self

 def draw(self, n=1) -> List[Card]:
 drawn, self.cards = self.cards[:n], self.cards[n:]
 return drawn

class Spread:
 positions = [
 "1. Текущая ситуация",
 "2. Влияние/препятствие",
 "3. Подсознательное",
 "4. Прошлое",
 "5. Цели/сознательное",
 "6. Ближайшее будущее",
 "7. Внутренний взгляд",
 "8. Внешнее влияние",
 "9. Надежды или страхи",
 ]

 def __init__(self, deck: Deck):
 self.deck = deck.shuffle
 self.cards = self.deck.draw(10)
 self.reversed_flags = [random.choice([True, False]) for _ in range(10)]

 def show(self):
 for i, card in enumerate(self.cards):
 status = "перевёрнута" if self.reversed_flags[i] else "прямая"
 print(f"{self.positions[i]}: {card.name} ({status})")
 print(f" {card.meaning(self.reversed_flags[i])}
")

if __name__ == "__main__":
 print("✨ Онлайн-расклад Таро «Кельтский крест» ✨
")
 deck = Deck
 spread = Spread(deck)
 spread.show

Как расширить толкования

  1. Откройте список major или цикл младших арканов.
  2. Замените заглушки f"Прямое значение..;" на настоящие толкования из любимого гадательного справочника.
  3. Добавьте поле image_url в Card и выводите картинки во Flask-шаблоне.

Мини-пример Flask-версии

from flask import Flask, render_template_string
app = Flask(__name__)

@app.route("/")
def tarot:
 deck = Deck
 spr = Spread(deck)
 return render_template_string("""
 <h1>Ваш расклад</h1>
 {% for pos, card, rev in zip(spr.positions, spr.cards, spr.reversed_flags) %}
 <p><b>{{ pos }}</b>: {{ card.name }} {% if rev %}(перевёрнута){% endif %}<br>
 {{ card.meaning(rev) }}</p>
 {% endfor %}
 """, spr=spr)

if __name__ == "__main__":
 app.run(debug=True)

FAQ

Можно ли зафиксировать «случайность»?
Да, добавьте random;seed(42) для воспроизводимых тестов.
Где взять точные значения карт?
Воспользуйтесь открытыми колодами Rider-Waite-Smith, толкования доступны под лицензией CC-BY-SA на tarot.com и biddytarot.com.
Как сделать Telegram-бота?
Подключите библиотеку python-telegram-bot и вызывайте spread.show внутри handler’а.

Лицензия

Код распространяется под MIT: делайте с ним всё, что угодно, но сохраняйте копирайт.