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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
language: Python 3
# Подключаем модуль случайных чисел 

import random

 

# Заготовка для первого предложения

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

 

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

 

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

 

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


Ско­пи­ро­вать код
Код ско­пи­ро­ван

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

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

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

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

Важ­ное заме­ча­ние: у нас в про­грам­ме нет про­вер­ки на пра­виль­ность пере­во­да стро­ки в чис­ло. Если поль­зо­ва­тель вме­сто чис­ла напи­шет «При­вет!», то про­грам­ма оста­но­вит­ся и выдаст ошиб­ку. Мы наде­ем­ся на то, что все будут вво­дить имен­но чис­ла, но это непра­виль­ный под­ход. В сле­ду­ю­щей вер­сии мы доба­вим такую про­вер­ку и пока­жем, как это сде­лать.

    
language: Python 3
# выводим знаки зодиака

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() — она воз­вра­ща­ет слу­чай­ный эле­мент из спис­ка (мас­си­ва), кор­те­жа или любой дру­гой пере­мен­ной с одно­тип­ны­ми дан­ны­ми. В нашем слу­чае мы поло­жим в неё назва­ния наших пере­мен­ных с пред­ло­же­ни­я­ми, и она слу­чай­ным обра­зом выбе­рет их отту­да.

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

    
language: Python 3
# Если число введено верно — выдаём гороскоп

if 0 < zodiac < 13:

    print(random.choice(first), random.choice(second), random.choice(second_add), random.choice(third))

else:

    print("Вы ошиблись с числом, запустите программу ещё раз")


Ско­пи­ро­вать код
Код ско­пи­ро­ван
Готовый код

    
language: Python 3
# Подключаем модуль случайных чисел 

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("Вы ошиблись с числом, запустите программу ещё раз")


Ско­пи­ро­вать код
Код ско­пи­ро­ван

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

Что дальше

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

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