我用Python擺攤算命
文 | 酷頭
來源:印象python「ID: python_logic」
歡迎來到學(xué)習(xí)python的寶藏基地~~~

長按下方二維碼可以添加我為好友哦

背景
一直以來,中式占卜都是基于算命先生手工實(shí)現(xiàn),程序繁瑣(往往需要沐浴、計(jì)算天時(shí)、靜心等等流程)。準(zhǔn)備工作復(fù)雜(通常需要銅錢等道具),計(jì)算方法復(fù)雜,需要純手工計(jì)算二進(jìn)制并轉(zhuǎn)換為最終的卦象,為了解決這個(gè)問題,筆者基于python實(shí)現(xiàn)了一套科學(xué)算命工具,用于快速進(jìn)行占卜。
本文的算命方式采用八卦 + 周易+ 梅花易數(shù)實(shí)現(xiàn),腳本基于python3.9.0開發(fā)。本人對于周易五行研究較淺,如有疏漏請見諒 最終效果如圖,在運(yùn)行程序之后,會(huì)根據(jù)當(dāng)前的運(yùn)勢自動(dòng)獲取你心中所想之事的卦象(本卦、互卦、變卦)

前置知識
基礎(chǔ)原理
首先我們需要了解一些最基本的占卜知識,目前我國幾種比較主流的占卜方式基本都是基于易演化而來。總體而言都是根據(jù)某些現(xiàn)象,得到不同的卦象,而不同的卦象最終會(huì)代表所占卜事情的開端,發(fā)展和結(jié)果。
太極生兩儀,兩儀生四象,四象生八卦
這句話相信大家在很多影視作品中都聽說過,但很少有人知道它的真正含義,這句話其實(shí)概括了卦象產(chǎn)生的流程。
太極:代表一個(gè)絕對混沌的狀態(tài),是一個(gè)哲學(xué)觀念,非要套用我們的客觀世界,可以理解為是大爆炸之前宇宙的狀態(tài),所有的物理法則都不生效,當(dāng)我們還未起卦時(shí)就處于這個(gè)狀態(tài)。
兩儀:同樣是一個(gè)哲學(xué)觀念,代表一個(gè)事物的兩個(gè)對立狀態(tài),套用到客觀世界可以是“生-死”、“黑-白”、“清-濁”,在占卜的過程中,我們通常會(huì)有“陰-陽”兩個(gè)狀態(tài),為了方便記錄,古人發(fā)明了兩個(gè)符號代表這兩個(gè)狀態(tài),在占卜的時(shí)候,一個(gè)這樣的狀態(tài)我們稱之為一爻(yao)

- 四象:當(dāng)我們將陰陽兩兩組合時(shí),就可以得到四種不同的組合,古人稱之為四象,注意,這里的四象同樣是哲學(xué)層面的狀態(tài),它可以是“青龍白虎朱雀玄武”,也可以是東南西北四個(gè)方位,在占卜的時(shí)候,我們通常會(huì)用“太陰”、“少陰”、“太陽”、“少陽”來稱呼這四象

- 八卦:當(dāng)給我們在四象中增加一爻,也就是三個(gè)陰陽組合在一起的時(shí)候,我們可以得到八個(gè)組合,古人認(rèn)為這八個(gè)組合可以代表自然界中的八類事物(八中狀態(tài)),即是為八卦

當(dāng)然,八個(gè)狀態(tài)用來代表事情的發(fā)展方向還是不夠用,于是古人又將八卦(單獨(dú)的八卦稱之為經(jīng)卦)兩兩組合,從而得到了64個(gè)不同的別卦,易經(jīng)中的六十四卦就是這么產(chǎn)生的

目前,國內(nèi)的主流占卜基本都是通過不同的取數(shù)方式得到不同的別卦,最終判斷事情的走向。其實(shí)對于程序員來說,可以吧兩儀當(dāng)做一個(gè)一位二進(jìn)制數(shù),有0、1兩個(gè)狀態(tài)。四象就是兩位二進(jìn)制數(shù),有00,01,10,11四個(gè)狀態(tài)。八卦則是三位二進(jìn)制數(shù),有000,、001、010、011、100、101、110、111四個(gè)狀態(tài)
如何產(chǎn)生卦象
現(xiàn)在我們知道了卦象是如何演變的,但是我們還沒有能夠得到卦象的方式,其實(shí)在占卜的過程中,不同的占卜方式往往最大的區(qū)別就是起卦方式不同,我們這里采用梅花易數(shù)的方式起卦。
梅花易數(shù)起卦法(這里只截取兩種起卦方式):
1、年月日時(shí)起卦
即以農(nóng)歷之年月日總和除以八,以余數(shù)為卦數(shù)求上卦;以年月日時(shí)總和除以八,以余數(shù)為卦數(shù)求下卦,再以年月日時(shí)總和除以六,以余數(shù)為動(dòng)爻。
例:農(nóng)歷壬申年四月十一日巳時(shí)起卦:申年9數(shù),巳時(shí)6數(shù)。
上卦為:(年+月+日)÷8,取余數(shù)。即:(9+4+11)÷8,此處無余數(shù)。
下卦為:(年+月+日+時(shí))÷8,取余數(shù)。即:(9+4+11+6)÷8,余數(shù)為6為坎卦。
動(dòng)爻數(shù)為:(年+月+日+時(shí))÷6,取余數(shù)。即:(9+4+11+6)除以6,此處無余數(shù)。
此卦為:上卦為坤,下卦為坎,動(dòng)爻為上爻。
2、直接以數(shù)起卦
這是一種簡便而準(zhǔn)確率極高的起卦方法。當(dāng)有人求測某事時(shí),可以讓來人隨意說出兩個(gè)數(shù),第一個(gè)數(shù)取為上卦,第二個(gè)數(shù)取為下卦,兩數(shù)之和除以6,余數(shù)為動(dòng)爻,或者可以隨便借用其他能得到兩數(shù)的辦法起卦,如翻書、日歷等等。
開發(fā)
我們將梅花易數(shù)的起卦方式流程用程序員的話總結(jié)一下,流程如下
- 獲取一個(gè)隨機(jī)數(shù)(我們這里用當(dāng)前的時(shí)間戳)對8取模,當(dāng)做上掛(一個(gè)三位二進(jìn)制數(shù))
- 再獲取一個(gè)隨機(jī)數(shù),對八取模,當(dāng)做下掛(一個(gè)三位二進(jìn)制數(shù))
- 將上述兩個(gè)隨機(jī)數(shù)進(jìn)行組合,得到一個(gè)六位二進(jìn)制數(shù)
- 六位二進(jìn)制數(shù)轉(zhuǎn)化為十進(jìn)制數(shù)并查表,得到本卦
- 取一個(gè)隨機(jī)數(shù),對6取模,將上述六位二進(jìn)制數(shù)對應(yīng)位數(shù)的0變?yōu)?,1變?yōu)?,然后轉(zhuǎn)化為十進(jìn)制數(shù)并查表,得到變卦
- 根據(jù)本卦和變卦查表,得到占卜結(jié)果
import?json
import?random
import?time
#別掛配置數(shù)據(jù)
gua_data_path?=?"data.json"
#別卦數(shù)據(jù)
gua_data_map?=?{
????????
}
fake_delay?=?10
#讀取別卦數(shù)據(jù)
def?init_gua_data(json_path):
?with?open(gua_data_path,'r',encoding='utf8')as?fp:
??global?gua_data_map
??gua_data_map?=?json.load(fp)
#爻圖標(biāo)映射
yao_icon_map?=?{
?0:"-?-",
?1:"---"
}
#經(jīng)卦名
base_gua_name_map?=?{
?0:"坤",1:"震",2:"坎",3:"兌",4:"艮",5:"離",6:"巽",7:"乾"
}
#數(shù)字轉(zhuǎn)化為二進(jìn)制數(shù)組
def?base_gua_to_yao(gua,?yao_length=3):
?result?=?[]
?while?gua?>=?1:
??level?=?0?if?gua?%?2?==?0?else?1
??gua?//=?2
??result.append(level)
?while?len(result)???result.append(0)
?return?result
#二進(jìn)制數(shù)組轉(zhuǎn)化為數(shù)字
def?base_yao_to_gua(array):
?array?=?array[:]
?while?len(array)?>?0?and?array[-1]?==?0:
??array.pop()
?result?=?0
?for?i?in?range(len(array)):
??if?array[i]?==?0:
???continue
??result?+=?pow(2,?i)
????????????????
?return?result
#打印一個(gè)掛
def?print_gua(gua):
?yao_list?=?base_gua_to_yao(gua,?6)
?up_yao_list?=?yao_list[0:3]
?up?=?base_yao_to_gua(up_yao_list)
?print(yao_icon_map[up_yao_list[2]])
?print(yao_icon_map[up_yao_list[1]]?+?"?"?+?base_gua_name_map[up])
?print(yao_icon_map[up_yao_list[0]])
????????
?print("")
?down_yao_list?=?yao_list[3:6]
?down?=?base_yao_to_gua(down_yao_list)
?print(yao_icon_map[down_yao_list[2]])
?print(yao_icon_map[down_yao_list[1]]?+?"?"?+?base_gua_name_map[down])
?print(yao_icon_map[down_yao_list[0]])
#使用梅花易數(shù)
def?calculate_with_plum_flower():
?#起上卦
?print("使用梅花易數(shù)??????????????????????????????????????????????????????????????????????????????????????????")
?print_a_wait_animation("卜上卦:",?fake_delay)
?up_base_gua?=?int(round(time.time()?*?1000))?%?8
?up_yao_array?=?base_gua_to_yao(up_base_gua)
?print("上卦獲取成功,上卦為:",?base_gua_name_map[up_base_gua])
?#起下卦
?print_a_wait_animation("正在獲取下卦:",?fake_delay)
?down_base_gua?=?random.randint(0,?999999999999)?%?8
?down_yao_array?=?base_gua_to_yao(down_base_gua)
?print("上卦獲取成功,下卦為:",?base_gua_name_map[down_base_gua])
?#組成卦象
?print_a_wait_animation("正在組成本卦:",?fake_delay)
?print("------------------------------------------------本卦------------------------------------------------")
?yao_list?=?up_yao_array?+?down_yao_array
?gua?=?base_yao_to_gua(yao_list)
?print_gua(gua)
?#讀取本卦象信息
?gua_code?=?str(base_gua_name_map[up_base_gua])?+?str(base_gua_name_map[down_base_gua])
?gua_data?=?gua_data_map[gua_code]
?print("本卦為:",?gua_data['name'])
?print("辭:",?gua_data['words'],"譯:",gua_data['white_words'])
?print("象:",?gua_data['picture'],"譯:",gua_data['white_picture'])
?print_a_wait_animation("正在組成互卦:",?fake_delay)
?print("------------------------------------------------互卦------------------------------------------------")
?#讀取互卦象信息
?up_hu_yao_list?=?[yao_list[4],yao_list[5],yao_list[0]]
?up_hu_gua?=?base_yao_to_gua(up_hu_yao_list)
?down_hu_yao_list?=[yao_list[5],yao_list[0],yao_list[1]]
?down_hu_gua?=?base_yao_to_gua(down_hu_yao_list)
?hu_yao_list?=?up_hu_yao_list?+?down_hu_yao_list
?hu_gua?=?base_yao_to_gua(hu_yao_list)
?hu_gua_code?=?str(base_gua_name_map[up_hu_gua])?+?str(base_gua_name_map[down_hu_gua])
?hu_gua_data?=?gua_data_map[hu_gua_code]
?print_gua(hu_gua)
?print("互卦為:",?hu_gua_data['name'])
?print("辭:",?hu_gua_data['words'],"譯:",hu_gua_data['white_words'])
?print("象:",?hu_gua_data['picture'],"譯:",hu_gua_data['white_picture'])
?print_a_wait_animation("正在組成變卦:",?fake_delay)
?print("------------------------------------------------變卦------------------------------------------------")
?change_index?=?int(round(time.time()?*?1000))?%?6
?change_yao_list?=?yao_list[:]
?change_yao_list[change_index]?=?0?if?change_yao_list[change_index]?==?1?else?1
?up_change_yao_list?=?change_yao_list[0:3]
?up_change_gua?=?base_yao_to_gua(up_change_yao_list)
?down_change_yao_list?=change_yao_list[3:5]
?down_change_gua?=?base_yao_to_gua(down_change_yao_list)
?
?change_gua?=?base_yao_to_gua(change_yao_list)
?print_gua(change_gua)
?change_gua_code?=?str(base_gua_name_map[up_change_gua])?+?str(base_gua_name_map[down_change_gua])
?change_gua_data?=?gua_data_map[change_gua_code]
?print("變卦為:",?change_gua_data['name'])
?print("辭:",?change_gua_data['words'],"譯:",change_gua_data['white_words'])
?print("象:",?change_gua_data['picture'],"譯:",change_gua_data['white_picture'])
def?print_a_wait_animation(tips,times):
?animation?=?"|/-\\"
?idx?=?0
?for?i?in?range(times):
??print(tips?+?animation[idx?%?len(animation)],animation[idx?%?len(animation)],animation[idx?%?len(animation)],animation[idx?%?len(animation)],animation[idx?%?len(animation)],?end="\r"),
??idx?+=?1
??time.sleep(0.1)
init_gua_data(gua_data_path)
calculate_with_plum_flower()
源代碼
源碼在公眾號印象python后臺(tái)回復(fù)占卜獲取~
▼
往期精彩回顧▼?Scrapy爬取B站666張小姐姐美照并存入Mysql和Excel答應(yīng)我以后不要再用print打印了,冰淇淋來了!讓人無法拒絕的pandas技巧,簡單卻好用到爆!實(shí)戰(zhàn)| 全國鴻星爾克門店分布圖,你的城市是最多的那個(gè)嗎?我用Python爬取了B站3948評論,圍觀最近超火的“殺瘋了!這就是國家隊(duì)的美貌嗎?”評論區(qū)
分享

收藏

點(diǎn)贊

在看

