Pythonでコマンドプロンプトにサヨナラする(3)
簡単に入出力ができたので、さっそく簡単にプログラムを作成してみたいと思います!
バイオリズム占いプログラム
バイオリズム診断はご存知でしょうか。
人が生まれてから、体調・感情・知性の調子が一定の周期で繰り替えしていると考えて、その日の体調などを知ろうという診断方法です。(それはそれは眉唾モノですが、占いとしては乙なものですはい)
詳細はWikipediaなどを参照。。。
誕生日からの日数が計算できれば、あとは身体・感情・知性がそれぞれ23日・28日・33日周期で繰り替えすように三角関数のSIN関数で計算します。
入力はtkinterのsimpledialogを使うとして、年月日の文字列を入力してもらった後は、どのように変換すればいいでしょうか?
サンプルプログラム
メモ帳などにコピペして試してみてください。
Windows、Linuxsどちらでも使えます。
モジュールのインストール(pip)は必要に応じて。
import tkinter as tk
from tkinter import messagebox, simpledialog
import math
from datetime import datetime
def message(score):
if score<10:
return "ど低調"
elif score<30:
return "低調"
elif score<45:
return "やや低調"
elif score<55:
return "不安定(注意)"
elif score<70:
return "やや好調"
elif score<90:
return "好調!"
else:
return "絶好調!!"
root= tk.Tk()
root.withdraw()
strday= simpledialog.askstring("バイオリズム占い","誕生日を入力してください(yyyy/mm/dd)")
lstymd= strday.split('/')
y= int(lstymd[0])
m= int(lstymd[1])
d= int(lstymd[2])
if y>0 and m>0 and d>0:
Today= datetime.now()
Birthday= datetime(y, m, d)
Days= Today -Birthday
p= int(math.sin(Days.days/23*2*math.pi)*50+50)
s= int(math.sin(Days.days/28*2*math.pi)*50+50)
i= int(math.sin(Days.days/33*2*math.pi)*50+50)
result = f"誕生日が{y}/{m}/{d}の人は\n"
result+= f"今日は生まれてから{Days.days}日目です\n"
result+= f"今日のバイオリズム診断結果は\n"
result+= f"身体:{message(p)} ({p}%)\n感情:{message(s)} ({s}%)\n知性:{message(i)} ({i}%)"
messagebox.showinfo("占い結果", result)
プログラム中盤あたりで、simpledialogを使って、誕生日を入力してもらいます。
入力文字列は「2001/12/25」のように、「/」スラッシュで区切ってある(と、信じているw)ので、splitをつかって「2001」「12」「25」のリストに分割しています。
年月日の文字列はそのままでは数値計算に使えないので、int関数を使って整数に変換します。
if文は、年・月・日がすべて1以上であれば計算を実行する分岐です。
計算ではまず、datetimeを使って「誕生日(Birthday)」「今日(Today)」の2つのオブジェクトを作り、それらを引き算して、生まれてからの日数(Days)を求めました。
次に周期の波を計算します。SIN関数は高校で習うと思います。360°で波が一周するアレです。Pythonでは角度をラジアンで表現する関数で、360°=2πで換算してsin関数に渡します。(mathの使い方はまた別途…)
あとは、メッセージを作って完了です。
前半にあるdef messageはここで使っていますが、0〜100の数値を受けて、メッセージの文字列を返すサブルーチンでした。
実行してみると
入力ボックスが現れて誕生日を入力するよう促します。
誕生日を入力すると、結果がちゃんと現れましたでしょうか?
(下の図はLubuntu(LXDE)で実行した結果。誕生日は適当。2021/1/19の結果)
さて、ここまできて、まだ実行はコマンドプロンプトで行ったと思います。せっかくなので、exe化してみましょうか。(後日)