Python实现科学占卜 让视频自动打码


Posted in Python onApril 09, 2022

背景

一直以来,中式占卜都是基于算命先生手工实现,程序繁琐(往往需要沐浴、计算天时、静心等等流程)。准备工作复杂(通常需要铜钱等道具),计算方法复杂,需要纯手工计算二进制并转换为最终的卦象,为了解决这个问题,笔者基于python实现了一套科学算命工具,用于快速进行占卜
本文的算命方式采用八卦 + 周易+ 梅花易数实现,脚本基于python3.9.0开发。本人对于周易五行研究较浅,如有疏漏请见谅
最终效果如图,在运行程序之后,会根据当前的运势自动获取你心中所想之事的卦象(本卦、互卦、变卦)

Python实现科学占卜 让视频自动打码

前置知识

基础原理

首先我们需要了解一些最基本的占卜知识,目前我国几种比较主流的占卜方式基本都是基于易演化而来。总体而言都是根据某些现象,得到不同的卦象,而不同的卦象最终会代表所占卜事情的开端,发展和结果。

太极生两仪,两仪生四象,四象生八卦

这句话相信大家在很多影视作品中都听说过,但很少有人知道它的真正含义,这句话其实概括了卦象产生的流程。

  • 太极:代表一个绝对混沌的状态,是一个哲学观念,非要套用我们的客观世界,可以理解为是大爆炸之前宇宙的状态,所有的物理法则都不生效,当我们还未起卦时就处于这个状态。
  • 两仪:同样是一个哲学观念,代表一个事物的两个对立状态,套用到客观世界可以是“生-死”、“黑-白”、“清-浊”,在占卜的过程中,我们通常会有“阴-阳”两个状态,为了方便记录,古人发明了两个符号代表这两个状态,在占卜的时候,一个这样的状态我们称之为一爻(yao)

Python实现科学占卜 让视频自动打码

  • 四象:当我们将阴阳两两组合时,就可以得到四种不同的组合,古人称之为四象,注意,这里的四象同样是哲学层面的状态,它可以是“青龙白虎朱雀玄武”,也可以是东南西北四个方位,在占卜的时候,我们通常会用“太阴”、“少阴”、“太阳”、“少阳”来称呼这四象

Python实现科学占卜 让视频自动打码

  • 八卦:当给我们在四象中增加一爻,也就是三个阴阳组合在一起的时候,我们可以得到八个组合,古人认为这八个组合可以代表自然界中的八类事物(八中状态),即是为八卦

Python实现科学占卜 让视频自动打码

当然,八个状态用来代表事情的发展方向还是不够用,于是古人又将八卦(单独的八卦称之为经卦)两两组合,从而得到了64个不同的别卦,易经中的六十四卦就是这么产生的

Python实现科学占卜 让视频自动打码

目前,国内的主流占卜基本都是通过不同的取数方式得到不同的别卦,最终判断事情的走向。其实对于程序员来说,可以吧两仪当做一个一位二进制数,有0、1两个状态。四象就是两位二进制数,有00,01,10,11四个状态。八卦则是三位二进制数,有000,、001、010、011、100、101、110、111四个状态

如何产生卦象

现在我们知道了卦象是如何演变的,但是我们还没有能够得到卦象的方式,其实在占卜的过程中,不同的占卜方式往往最大的区别就是起卦方式不同,我们这里采用梅花易数的方式起卦

梅花易数起卦法(这里只截取两种起卦方式)
一、年月日时起卦:
即以农历之年月日总和除以八,以余数为卦数求上卦;以年月日时总和除以八,以余数为卦数求下卦,再以年月日时总和除以六,以余数为动爻。
例:农历壬申年四月十一日巳时起卦:申年9数,巳时6数。
上卦为:(年+月+日)÷8,取余数。 即:(9+4+11)÷8,此处无余数。
下卦为:(年+月+日+时)÷8,取余数。 即:(9+4+11+6)÷8,余数为6为坎卦。
动爻数为:(年+月+日+时)÷6,取余数。 即:(9+4+11+6)除以6,此处无余数。
此卦为:上卦为坤,下卦为坎,动爻为上爻。
二、直接以数起卦
这是一种简便而准确率极高的起卦方法。当有人求测某事时,可以让来人随意说出两个数,第一个数取为上卦,第二个数取为下卦,两数之和除以6,余数为动爻,或者可以随便借用其他能得到两数的办法起卦,如翻书、日历等等。

开发

我们将梅花易数的起卦方式流程用程序员的话总结一下,流程如下

  • 获取一个随机数(我们这里用当前的时间戳)对8取模,当做上挂(一个三位二进制数)
  • 再获取一个随机数,对八取模,当做下挂(一个三位二进制数)
  • 将上述两个随机数进行组合,得到一个六位二进制数
  • 六位二进制数转化为十进制数并查表,得到本卦
  • 取一个随机数,对6取模,将上述六位二进制数对应位数的0变为1,1变为0,然后转化为十进制数并查表,得到变卦
  • 根据本卦和变卦查表,得到占卜结果
import json
import random
import time
#别挂配置数据
gua_data_path = "data.json"
#别卦数据
gua_data_map = {
        
}
fake_delay = 10
#读取别卦数据
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)
#爻图标映射
yao_icon_map = {
	0:"- -",
	1:"---"
#经卦名
base_gua_name_map = {
	0:"坤",1:"震",2:"坎",3:"兑",4:"艮",5:"离",6:"巽",7:"乾"
#数字转化为二进制数组
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) < yao_length:
		result.append(0)
	return result
#二进制数组转化为数字
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)
                
#打印一个挂
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]])
#使用梅花易数
def calculate_with_plum_flower():
	#起上卦
	print("使用梅花易数♣️♣️♣️♣️♣️♣️♣️♣️♣️♣️♣️♣️♣️♣️♣️♣️♣️♣️♣️♣️♣️♣️♣️♣️♣️♣️♣️♣️♣️♣️♣️♣️♣️♣️♣️♣️♣️♣️♣️♣️♣️♣️♣️♣️♣️")
	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()

源代码

https://github.com/MrFengGG/ToChange/tree/master

到此这篇关于基于Python的科学占卜的文章就介绍到这了,更多相关python科学占卜内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python3 能振兴 Python的原因分析
Nov 28 Python
Python AES加密模块用法分析
May 22 Python
python中 chr unichr ord函数的实例详解
Aug 06 Python
Django框架设置cookies与获取cookies操作详解
May 27 Python
python数据挖掘需要学的内容
Jun 23 Python
学python安装的软件总结
Oct 12 Python
Pandas实现dataframe和np.array的相互转换
Nov 30 Python
详解Python中pyautogui库的最全使用方法
Apr 01 Python
python实现处理mysql结果输出方式
Apr 09 Python
keras多显卡训练方式
Jun 10 Python
Python脚本实现Zabbix多行日志监控过程解析
Aug 26 Python
python 实现ping测试延迟的两种方法
Dec 10 Python
Python自动化工具之实现Excel转Markdown表格
Python加密技术之RSA加密解密的实现
Apr 08 #Python
Python识别花卉种类鉴定网络热门植物并自动整理分类
请求模块urllib之PYTHON爬虫的基本使用
用Python仅20行代码编写一个简单的端口扫描器
Python实现视频自动打码的示例代码
Apr 08 #Python
Python OpenCV实现图形检测示例详解
You might like
DIY一个适配电脑声卡的动圈话筒放大器
2021/03/02 无线电
PHP性能分析工具xhprof的安装使用与注意事项
2017/12/19 PHP
JavaScript 学习笔记(十六) js事件
2010/02/01 Javascript
javascript jscroll模拟html元素滚动条
2012/12/18 Javascript
JQuery表格内容过滤的实现方法
2013/07/05 Javascript
JavaScript onkeypress事件入门实例(按下或按住一个键盘按键)
2014/10/17 Javascript
javascript实现验证IP地址等相关信息代码
2015/05/10 Javascript
JS实现网页右侧带动画效果的伸缩窗口代码
2015/10/29 Javascript
Bootstrap每天必学之折叠
2016/04/12 Javascript
JavaScript_object基础入门(必看篇)
2016/06/13 Javascript
jQuery实现表格隔行及滑动,点击时变色的方法【测试可用】
2016/08/20 Javascript
JS解决iframe之间通信和自适应高度的问题
2016/08/24 Javascript
JS闭包与延迟求值用法示例
2016/12/22 Javascript
jQuery实现圣诞节礼物传送(花式轮播)
2016/12/25 Javascript
简单实现js无缝滚动效果
2017/02/05 Javascript
Javascript创建类和对象详解
2017/05/31 Javascript
解决Vue2.x父组件与子组件之间的双向绑定问题
2018/03/06 Javascript
vue+springmvc导出excel数据的实现代码
2018/06/27 Javascript
解决Vue2.0 watch对象属性变化监听不到的问题
2018/09/11 Javascript
使用JavaScript通过前端发送电子邮件
2020/05/22 Javascript
通过vue.extend实现消息提示弹框的方法记录
2021/01/07 Vue.js
简单介绍Python下自己编写web框架的一些要点
2015/04/29 Python
Windows中使用wxPython和py2exe开发Python的GUI程序的实例教程
2016/07/11 Python
wxPython的安装图文教程(Windows)
2017/12/28 Python
对python dataframe逻辑取值的方法详解
2019/01/30 Python
win10下python2和python3共存问题解决方法
2019/12/23 Python
css3中用animation的steps属性制作帧动画
2019/04/25 HTML / CSS
Soft Cotton捷克:来自爱琴海棉花的浴袍
2017/02/01 全球购物
New Balance澳大利亚官网:运动鞋和健身服装
2019/02/23 全球购物
计算s=f(f(-1.4))的值
2014/05/06 面试题
什么是事务?事务有哪些性质?
2012/03/11 面试题
C#如何进行LDAP用户校验
2012/11/21 面试题
厨房工作人员岗位职责
2013/11/15 职场文书
资料员岗位职责范本
2015/04/13 职场文书
go语言中切片与内存复制 memcpy 的实现操作
2021/04/27 Golang
MYSQL 运算符总结
2021/11/11 MySQL