medium

Конец ретроградному Меркурию! Пишем собственный гороскоп на Python

Наш гороскоп точен и прост! Сбросим иго астрологов!

Если вы верите в гороскопы, для вас плохая новость: все гороскопы основаны на психологическом эффекте Барнума (осторожно, ссылка ведёт на Википедию). Поэтому любая пространная фраза, сказанная конкретно для вашего знака зодиака, может восприниматься как достоверный сигнал судьбы. А значит, в гороскопах можно писать любую чушь при условии, что она достаточно неконкретная и приписана к знакам зодиака.

Но зачем писать чушь, когда её можно запрограммировать? Сегодня мы напишем программу, которая будет выдавать нам персональный гороскоп по запросу. Работать она будет так:

  • выводит 12 чисел, рядом с каждым написан свой знак зодиака;
  • вы вводите число, которое соответствует вашему знаку;
  • получаете в ответ персональный гороскоп на сегодняшний день.

Звучит просто, делается тоже быстро. Летс код.

Логика гороскопа

Если помните, мы уже писали программу, которая выдаёт более-менее осмысленный текст. Сегодня мы не будем настолько глубоко погружаться в код, а сделаем попроще. Но никто не мешает взять логику из той программы и прикрутить к этой: если сделаете это сами, то заработаете +100 к новой профессии.

Гороскоп будет работать так:

  • текст гороскопа состоит из трёх предложений;
  • первое предложение выбирается случайным образом из пяти заготовок;
  • второе предложение состоит из двух частей, каждая из которых тоже выбирается случайным образом;
  • третье предложение делается так же, как и первое;
  • программа выводит числа и ждёт ответ;
  • если пользователь ввёл число от 1 до 12, выдаёт текст гороскопа, иначе выводит сообщение об ошибке.

Готовим текст

Задача этого этапа — написать текстовые заготовки, из которых будет собираться наш гороскоп. Главная сложность в том, чтобы сделать их связными по звучанию между собой, в каком порядке они бы ни были.

Первое предложение делаем вводным, оно задаёт тон всему гороскопу. Второе предложение разбиваем на две части и каждую из них пишем отдельно. Проблема та же самая — написать окончания предложений так, чтобы они подходили ко всем началам. Это сложнее, чем кажется, поэтому уделите этому побольше времени.

К третьему предложению мы устали и решили написать там полную дичь. Основное условие — дичь должна звучать гармонично и казаться логичным продолжением гороскопа.

Мы остановились на трёх предложениях, но можно сделать и тридцать три, если есть время и желание поупражняться в написании текста ни о чём.

Последнее, что сделаем в самом начале — подключим модуль, который отвечает за случайные события. Именно с его помощью мы будем выбирать, какие предложения показывать в готовом тексте.

# Подключаем модуль случайных чисел 
import random
# Заготовка для первого предложения
first = ["Сегодня — идеальный день для новых начинаний.","Оптимальный день для того, чтобы решиться на смелый поступок!","Будьте осторожны, сегодня звёзды могут повлиять на ваше финансовое состояние.","Лучшее время для того, чтобы начать новые отношения или разобраться со старыми.","Плодотворный день для того, чтобы разобраться с накопившимися делами."]

second = ["Но помните, что даже в этом случае нужно не забывать про","Если поедете за город, заранее подумайте про","Те, кто сегодня нацелен выполнить множество дел, должны помнить про","Если у вас упадок сил, обратите внимание на","Помните, что мысли материальны, а значит вам в течение дня нужно постоянно думать про"]

second_add = ["отношения с друзьями и близкими.","работу и деловые вопросы, которые могут так некстати помешать планам.","себя и своё здоровье, иначе к вечеру возможен полный раздрай.","бытовые вопросы — особенно те, которые вы не доделали вчера.","отдых, чтобы не превратить себя в загнанную лошадь в конце месяца."]

third = ["Злые языки могут говорить вам обратное, но сегодня их слушать не нужно.","Знайте, что успех благоволит только настойчивым, поэтому посвятите этот день воспитанию духа.","Даже если вы не сможете уменьшить влияние ретроградного Меркурия, то хотя бы доведите дела до конца.","Не нужно бояться одиноких встреч — сегодня то самое время, когда они значат многое.","Если встретите незнакомца на пути — проявите участие, и тогда эта встреча посулит вам приятные хлопоты."]

Выбираем знак зодиака

Для этого мы выводим на экран все 12 знаков зодиака и ставим перед каждым число. Затем спрашиваем у пользователя, кто он по гороскопу, чтобы получить от него соответствующее число.

Чтобы текст вопроса не сливался с предыдущим выводом списка, раскрасим наш вопрос в синий цвет. Для этого используем свойство format — оно определяет, как будет визуально выглядеть наш текст.

Следующий момент — по умолчанию Python любой введённый ответ будет считать строкой, а не числом. Чтобы нам получить именно число, преобразуем сразу ввод в числовой формат командой int(). Она принудительно переводит строку в число, которое мы дальше будем проверять на правильность.

Важное замечание: у нас в программе нет проверки на правильность перевода строки в число. Если пользователь вместо числа напишет «Привет!», то программа остановится и выдаст ошибку. Мы надеемся на то, что все будут вводить именно числа, но это неправильный подход. В следующей версии мы добавим такую проверку и покажем, как это сделать.
# выводим знаки зодиака
print("1 — Овен")
print("2 — Телец")
print("3 — Близнецы")
print("4 — Рак")
print("5 — Лев")
print("6 — Дева")
print("7 — Весы")
print("8 — Скорпион")
print("9 — Стрелец")
print("10 — Козерог")
print("11 — Водолей")
print("12 — Рыбы")
# Спрашиваем у пользователя про его знак
zodiac = int(input("{blue}Введите число с номером знака зодиака: {endcolor}".format(blue="\033[96m", endcolor="\033[0m")))

Выводим готовый текст

Наша задача — проверить, попадает ли введённое число в интервал от 1 до 12. Python умеет делать множественное сравнение — это значит, что мы можем узнать, лежит ли наше число в нужных границах или нет.

Если лежит — выводим текст гороскопа, предложение за предложением. Для этого используем команду random.choice() — она возвращает случайный элемент из списка (массива), кортежа или любой другой переменной с однотипными данными. В нашем случае мы положим в неё названия наших переменных с предложениями, и она случайным образом выберет их оттуда.

Если введённое число в нужный диапазон не попало, то говорим пользователю, что он ошибся, и на этом программа заканчивается.

# Если число введено верно — выдаём гороскоп
if 0 < zodiac < 13:
    print(random.choice(first), random.choice(second), random.choice(second_add), random.choice(third))
else:
    print("Вы ошиблись с числом, запустите программу ещё раз")

# Подключаем модуль случайных чисел 
import random
# Заготовка для первого предложения
first = ["Сегодня — идеальный день для новых начинаний.","Оптимальный день для того, чтобы решиться на смелый поступок!","Будьте осторожны, сегодня звёзды могут повлиять на ваше финансовое состояние.","Лучшее время для того, чтобы начать новые отношения или разобраться со старыми.","Плодотворный день для того, чтобы разобраться с накопившимися делами."]
second = ["Но помните, что даже в этом случае нужно не забывать про","Если поедете за город, заранее подумайте про","Те, кто сегодня нацелен выполнить множество дел, должны помнить про","Если у вас упадок сил, обратите внимание на","Помните, что мысли материальны, а значит вам в течение дня нужно постоянно думать про"]
second_add = ["отношения с друзьями и близкими.","работу и деловые вопросы, которые могут так некстати помешать планам.","себя и своё здоровье, иначе к вечеру возможен полный раздрай.","бытовые вопросы — особенно те, которые вы не доделали вчера.","отдых, чтобы не превратить себя в загнанную лошадь в конце месяца."]
third = ["Злые языки могут говорить вам обратное, но сегодня их слушать не нужно.","Знайте, что успех благоволит только настойчивым, поэтому посвятите этот день воспитанию духа.","Даже если вы не сможете уменьшить влияние ретроградного Меркурия, то хотя бы доведите дела до конца.","Не нужно бояться одиноких встреч — сегодня то самое время, когда они значат многое.","Если встретите незнакомца на пути — проявите участие, и тогда эта встреча посулит вам приятные хлопоты."]
# выводим знаки зодиака
print("1 — Овен")
print("2 — Телец")
print("3 — Близнецы")
print("4 — Рак")
print("5 — Лев")
print("6 — Дева")
print("7 — Весы")
print("8 — Скорпион")
print("9 — Стрелец")
print("10 — Козерог")
print("11 — Водолей")
print("12 — Рыбы")
# Спрашиваем у пользователя про его знак
zodiac = int(input("{blue}Введите число с номером знака зодиака: {endcolor}".format(blue="\033[96m", endcolor="\033[0m")))
# Если число введено верно — выдаём гороскоп
if 0 < zodiac < 13:
    print(random.choice(first), random.choice(second), random.choice(second_add), random.choice(third))
else:
    print("Вы ошиблись с числом, запустите программу ещё раз")

Результат работы программы.

Что дальше

Дальше мы сделаем такое:

  • добавим проверку на правильность введённого значения при выборе знака зодиака;
  • добавим больше текста в гороскоп;
  • прикрутим к нему телеграм-бота, который по запросу будет присылать вам гороскоп на компьютер или телефон.

Любишь Python? Зарабатывай на нём!
Изучите самый модный язык программирования и станьте крутым бэкенд-разработчиком. Старт — бесплатно.
Попробовать бесплатно
Любишь Python? Зарабатывай на нём! Любишь Python? Зарабатывай на нём! Любишь Python? Зарабатывай на нём! Любишь Python? Зарабатывай на нём!
Получите ИТ-профессию
В «Яндекс Практикуме» можно стать разработчиком, тестировщиком, аналитиком и менеджером цифровых продуктов. Первая часть обучения всегда бесплатная, чтобы попробовать и найти то, что вам по душе. Дальше — программы трудоустройства.
Начать карьеру в ИТ
Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию
Еще по теме
medium