利用Python实现科学式占卜

一直以来,中式占卜都是基于算命先生手工实现,程序繁琐(往往需要沐浴、计算天时、静心等等流程)。准备工作复杂(通常需要铜钱等道具),计算方法复杂,需要纯手工计算二进制并转换为最终的卦象,为了解决这个问题,笔者基于python实现了一套科学算命工具,用于快速进行占卜。

本文的算命方式采用八卦 + 周易+ 梅花易数实现,脚本基于python3.9.0开发。本人对于周易五行研究较浅,如有疏漏请见谅。

最终效果如图,在运行程序之后,会根据当前的运势自动获取你心中所想之事的卦象(本卦、互卦、变卦)

前置知识

基础原理

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

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

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

  • 太极:代表一个绝对混沌的状态,是一个哲学观念,非要套用我们的客观世界,可以理解为是大爆炸之前宇宙的状态,所有的物理法则都不生效,当我们还未起卦时就处于这个状态。

  • 两仪:同样是一个哲学观念,代表一个事物的两个对立状态,套用到客观世界可以是“生-死”、“黑-白”、“清-浊”,在占卜的过程中,我们通常会有“阴-阳”两个状态,为了方便记录,古人发明了两个符号代表这两个状态,在占卜的时候,一个这样的状态我们称之为一爻(yao)

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

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

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

目前,国内的主流占卜基本都是通过不同的取数方式得到不同的别卦,最终判断事情的走向。其实对于程序员来说,可以吧两仪当做一个一位二进制数,有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#别挂配置数据
# 源代码,Python学习资料都在这个群啦 924040232
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_mapgua_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 1gua //= 2result.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 = 0for i in range(len(array)):if array[i] == 0:continueresult += pow(2, i)return result#打印一个挂
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)) % 8up_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) % 8down_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_arraygua = 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_listhu_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)) % 6change_yao_list = yao_list[:]change_yao_list[change_index] = 0 if change_yao_list[change_index] == 1 else 1up_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 = 0for 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 += 1time.sleep(0.1)init_gua_data(gua_data_path)
calculate_with_plum_flower()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/694470.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2023年12月 Python(六级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,共50分) 第1题 运行以下程序,输出的结果是?( ) class A():def __init__(self,x):self.x=x

手机连接电脑后资源管理器无法识别(识别设备但无法访问文件)

问题描述 小米8刷了pixel experience系统,今天用电脑连接后无法访问手机文件,但是手机选择了usb传输模式为文件传输 解决办法 在设备和打印机页面中右键选择属性 点击改变设置 卸载驱动,注意勾选删除设备的驱动程序软件 卸载后重新连接手机,电脑弹出希望对设备进行什么操作时…

Code-Audit(代码审计)习题记录4-5

4、习题4 题目内容如下&#xff1a; <?php error_reporting(0); show_source(__FILE__); $a $_REQUEST[hello]; eval("var_dump($a);"); 函数解释 $REQUEST — HTTP Request 变量&#xff0c;默认情况下包含了 [$GET]&#xff0c;[$POST] 和 [$COOKIE]的数…

HTML知识点

HTML 【一】HTML简介 【1】什么是HTML HTML是一种用于创建网页结构和内容的超文本标记语言&#xff0c;它是构建网页的基础。为了让浏览器正确渲染页面&#xff0c;我们必须遵循HTML的语法规则。浏览器在解析网页时会将HTML代码转换为可视化的页面&#xff0c;所以我们在浏览…

python接口测试实践:参数化测试、数据驱动测试和断言的使用

在Python接口测试实践中&#xff0c;参数化测试、数据驱动测试和断言是常用的技术手段。 参数化测试 参数化测试是指将测试用例中的某些部分&#xff08;如输入数据或配置&#xff09;作为参数传递给测试函数&#xff0c;以便于复用和减少代码重复。 例如&#xff0c;使用uni…

2024年最新腾讯云轻量4核8G12M服务器CPU内存性价比如何?

4核8G服务器支持多少人同时在线访问&#xff1f;阿腾云的4核8G服务器可以支持20个访客同时访问&#xff0c;关于4核8G服务器承载量并发数qps计算测评&#xff0c;云服务器上运行程序效率不同支持人数在线人数不同&#xff0c;公网带宽也是影响4核8G服务器并发数的一大因素&…

设计模式--组合模式(Composite Pattern)

组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构,并且能像使用独立对象一样使用它们。 组合模式主要包含以下几个角色: Component:这是组合中对象声明接口,在适当的情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理C…

oracle数据库事务的四大特性与隔离级别与游标

数据库事务的四大特性: 这里提到了 ACID 四个特性&#xff0c;分别是&#xff1a; A&#xff08;Atomicity&#xff09;&#xff1a; 原子性&#xff0c;确保事务中的所有操作要么全部执行成功&#xff0c;要么全部不执行&#xff0c;不存在部分执行的情况。 C&#xff08;…

时序分析深入必学的时序模型详细讲解

目录 一、前言 二、时序建模 2.1 反相器 2.2 线性时序模型 2.3 非线性时序模型 三、时序模块 3.1 组合单元 3.2 时序单元 3.3 同步检查&#xff1a;setup和hold 3.4 异步检查&#xff1a;recovery和removal 3.5 脉冲宽度检查Pulse width check 3.6 传输时延 3.7 …

微信小程序配置文件

目录 小程序配置文件 1. 配置文件介绍 2. 全局配置 2.1 pages 2.2 window 2.3 tabBar 3. 页面配置 4. 项目配置文件 5. 支持使用 sass/less 6. sitemap.json 小程序配置文件 1. 配置文件介绍 JSON是一种轻量级的数据格式&#xff0c;常用于前后端数据的交互&#xf…

LDRA Testbed软件静态分析_软件质量度量

系列文章目录 LDRA Testbed软件静态分析_操作指南 LDRA Testbed软件静态分析_自动提取静态分析数据生成文档 LDRA Testbed软件静态分析_Jenkins持续集成_(1)自动进行静态分析的环境搭建 LDRA Testbed软件静态分析_Jenkins持续集成_(2)配置邮件自动发送静态分析结果 LDRA Testb…

python数据类型-集合set

1 集合&#xff08;set&#xff09;的定义 1.1 集合是一个无序且不重复元素的序列&#xff1a; 1&#xff09;无序&#xff1a;存储顺序和添加的顺序不一定相同&#xff0c;不支持索引、切片 2&#xff09;元素不重复&#xff1a;当添加重复元素时&#xff0c;集合会自动去重…

scss导出颜色变量为空对象

scss导出颜色变量为空对象 scss文件 $base-menu-color:#bfcbd9; :export {menuColor: $base-menu-color }页面使用 import variables from "/assets/styles/variables.scss";然后打印发现 console.log(variables) // {} 打印值为空对象此时我们需要将文件名varia…

typescript映射类型

ts映射类型简介 TypeScript中的映射类型&#xff08;Mapped Type&#xff09;是一种高级类型&#xff0c;它允许我们基于现有类型创建新的类型&#xff0c;同时对新类型的每个属性应用一个转换函数。通过使用映射类型&#xff0c;我们可以方便地对对象的属性进行批量操作&…

BeautifulSoup的使用与入门

1. 介绍 BeautifulSoup是用来从HTML、XML文档中提取数据的一个python库&#xff0c;安装如下: pip install beautifulsoup4 它支持多种解析器&#xff0c;包括python标准库、lxml HTML解析器、lxml XML解析器、html5lib等。结合稳定性和速度&#xff0c;这里推荐使用lxml HT…

typescript 索引签名类型

ts索引类型简介 在TypeScript中&#xff0c;索引签名类型&#xff08;Index Signature Type&#xff09;是一种特殊的类型&#xff0c;它定义了对象中键的类型以及相应的值的类型。通过使用索引签名类型&#xff0c;我们可以表示一个对象&#xff0c;该对象的键可以是任意类型…

spring boot Mybatis Plus分页

文章目录 Mybatis Plus自带分页和PageHelper有什么区别&#xff1f;Mybatis Plus整合PageHelper分页 springboot自定义拦截器获取分页参数spring boot下配置mybatis-plus分页插件单表分页查询自定义sql分页查询PageHelper 参考 Mybatis Plus自带分页和PageHelper有什么区别&…

python3 flask 实现对config.yaml文件的内容的增删改查,并重启服务

config.yaml配置文件内容 功能就是userpass下的用户名和密码做增删改查&#xff0c;并重启hy2服务 auth:type: userpassuserpass:csdn: csdnlisten: :443 masquerade:proxy:rewriteHost: trueurl: https://www.bing.com/type: proxy tls:cert: /root/hyst*****马赛克******er…

开源大数据管理平台选型

随着CDH和HDP的闭源&#xff0c;还有国内信创需求&#xff0c;经过前期调研和后期实践&#xff0c;目前主要有两个产品满足要求&#xff1a;apache bigtop 和 DataSophon 符合要求。因为这两个产品都是完全开源的&#xff0c;自助可控。 一 apache bigtop 项目地址&#xff1…

【算法2-1】前缀和、差分与离散化

一、【P3406】海底高铁&#xff08;差分贪心&#xff09;​​​​​​ 由于本题涉及到线路问题&#xff0c;需要统计Uim途径每条线路的次数&#xff0c;而且Uim每次的轨迹都是很长一段路径&#xff0c;所以需要使用一个合理的数据结构来维护区间的变化&#xff0c;首先想到线段…