用Python建模古三式:奇门遁甲、大六壬与太乙神数的算法实现
2026/9/20 23:37:35 网站建设 项目流程

简介:Python古三式开源编码分享,聚焦太乙神数、奇门遁甲、大六壬三大传统术数,作者以编程小白视角自2019年起边学边写,最终形成三个可通过pip安装的Python套件:kinliuren、kinqimen、kintaiyi。内容依托实际编码经验,逐一拆解三个套件的起盘逻辑与调用方式,并附带结构化输出示例。例如大六壬部分展示九宗门起盘中的贼克、元首格局,输出四课三传及天地盘映射;奇门遁甲包含时家转盘与金函玉镜两种盘式,太乙神数侧重积年推算与八将十六神框架,示例均附有API调用及返回字典解读,便于读者套用或二次开发。资源为单个PDF文件,大小仅150KB,但知识点覆盖较全,适合作为三式编程入门索引。目前已有1862人学习下载,适合对传统术数Python实现感兴趣的开发者和易学爱好者研读参考。 一直觉得,传统术数跟现代编程是两个极端的东西,一个讲天人感应,一个讲逻辑闭环。可真做起来才发现,越是玄学的体系,背后的规则越硬核,硬核到用代码去建模反而是最好的验证方式。这个开源项目用Python把古三式——太乙神数、奇门遁甲、大六壬——全部做了编码实现,不是简简单单排个盘就完事,而是从历法推算、干支换算、局数定式到盘面生成,全链路走了一遍算法化。

这篇文章我会从项目背后的算法建模思路出发,拆解三式各自的编程难点,重点讲代码实现中最容易翻车的历法换算、定时定局、天地盘生成这几个环节,顺便把我在测试和重构过程中踩过的坑一并交代清楚。

1. 从“玄学”到“可计算系统”:古三式数字建模的切入点

先说三式到底是什么,不是科普玄学,而是为了说清楚代码要处理的边界。

太乙神数、奇门遁甲、大六壬,并称“三式”。太乙推国运天时,奇门测军机人事,六壬占日用百事。它们共同的理论地基是:干支纪时系统、阴阳五行生克、九宫八卦方位、天体运行周期(尤其是太阳和太阴相对位置)。这些理论体系看似庞杂,但落到编程层面,其实是若干个可穷举的规则表。

我做这个项目的第一件事,不是写代码,而是列数据表。

  • 干支组合:10天干×12地支,共60组,即六十甲子;
  • 九宫八卦:坎一、坤二、震三、巽四、中五、乾六、兑七、艮八、离九;
  • 二十四节气:每个节气对应一个太阳黄经区间;
  • 六十甲子对应的局数:奇门里分阳遁九局、阴遁九局,共十八局,每局又分上中下三元。

把这几张表准备齐了,整个项目的骨架就出来了。Python里最核心的数据结构无非是列表和字典,但三式的算法用纯列表硬写会非常痛苦,因为大量操作是“循环位移”和“按宫取值”。

比如大六壬的天地盘,本质上是一个十二地支分布的循环矩阵,地盘是固定的子丑寅卯辰巳午未申酉戌亥,天盘则是根据月将加临地盘时支之后整体旋转了一个角度。这种旋转操作,如果用列表切片去实现,一行代码就能搞定,但如果你不理解旋转的本质,就很难写对。

所以这个项目的第一个价值,其实是帮我们建立了一个共识:所谓“玄学”,一旦要精确到某年某月某日某时,就变成了严密的历法+组合算法,容不得半点模糊。

2. 奇门遁甲的算法骨架:定局、超神接气与置闰

奇门遁甲的排盘大致分几步:确定干支年月日时,确定节气,确定阴阳遁与局数,继而排九星、八门、八神、三奇六仪。

这里面最容易写错的,就是“定局”。

奇门定局的口诀是“冬至后阳遁,夏至后阴遁”,而具体局数由日干支和节气共同决定。一个节气分上中下三元,每元五日,按日干支的甲子、甲午、己卯、己酉等符头来定上一元还是下一元。但这些规则在程序里的实现,远比口诀复杂,因为有“超神接气”和“置闰”两个例外。

项目里处理这个问题的思路很直白:先计算当前时刻距离最近的一个甲子日的天数,然后用这个天数对60取模,拿到符头信息,再匹配当前节气所在的上中下三元。对绝大多数情况,这个算法是准确的。真正的坑在于,若当时辰正好落在符头与节气交接的临界点附近,需要额外判断“正授”“超神”“接气”“置闰”。

我的建议是:第一版代码不要碰置闰。先用拆补法,也就是直接把日干支对应到该节气的三元里,不处理多余天数的顺延。拆补法在所谓“日用百事”的精度范围内已经足够稳定,而且代码量能砍掉三分之一。

具体定局的伪代码可以这样设计:

def get_ju_info(lunar_date, ganzhi_day): # 根据节气确定阴阳遁 yang_ju = is_yang_dun(solar_term) # 根据日干支确定上中下元 element = get_sanyuan(ganzhi_day) # 局数表: 每个节气对应一个局数表,三元分别取值 ju = ju_table[solar_term][element] return yang_ju, ju

这个函数看起来简单,背后其实藏着一张24×3的局数映射表。很多初学者把这个表当成“死数据”直接抄进去,但如果你对奇门研究到了一定深度,就能从九宫飞星的轨迹里把这个表推导出来,这样出错的概率会小很多,也方便以后扩展到置闰法时调整。

3. 太乙神数的算法难点:积年推算是最大的硬骨头

太乙神数在所有术数里,历法计算复杂度排第一,因为它的核心是“太乙积年”。

积年是什么?是一个从上古甲子年甲子月甲子日甲子时开始的巨大纪年系统,太乙神数要靠这个积年来推算太乙的所在宫位。算法书上说,太乙积年数大约从公元前几百万年开始算,乍一看很唬人,但翻译成代码就一句话:找一个已知的甲子年,然后按60年一循环往回推。

真正繁琐的不是积年本身,而是积年推到具体的年月日之后,还需要换算成干支三元,再推太乙“六元五纪”的局数。这部分涉及一大套术语:太乙在九宫中的顺行逆行、主客大小将的计数、十六神所主吉凶事类。

我实现的时候,为了降低理解成本,没有直接从古籍里的“太乙历”推起,而是先做了一个标准公历到干支纪日的转换模块,再把太乙积年换算成标准时刻。这样至少保证了“输入一个公历时间,能稳定输出一个可复现的盘面”。后来验证了几个历史上的经典案例,发现结果和文献记载是一致的,这个方向才算走通。

代码结构上,建议把“历法层”和“术数层”严格分离。

  • 历法层:负责公历、农历、干支、节气、真太阳时的换算;
  • 术数层:负责根据干支与节气推导宫位、星神、门将。

一旦混在一起写,后期每改一个历法基准,整个盘面计算结果就全崩了。这个项目里最稳定的一条经验,就是把“历法”当成地基,所有术数推算都只依赖历法层输出的标准数据,而不允许术数层自己去查日历表。

4. 大六壬的地盘、天盘与四课三传:循环位移的算法之美

大六壬的核心算法最贴近程序员的思维模式,因为它本质上就是数组旋转加组合索引。

地盘是固定不动的:子丑寅卯辰巳午未申酉戌亥,按十二地支排列在圆周上。天盘则随月将和占时旋转。所谓“月将”,是太阳所在的宫位,古代用二十四节气所在的中气来定月将,比如春分前后日月将戌,又或者秋分前后日日月将辰。

有“月将加占时”这一步之后,天盘的地支序列在程序看来,就变成了一个简单的列表循环左移或右移操作。比如地盘序列是[子, 丑, 寅, 卯, 辰, 巳, 午, 未, 申, 酉, 戌, 亥],若月将加临的地支是卯,那么天盘序列就是[卯, 辰, 巳, 午, 未, 申, 酉, 戌, 亥, 子, 丑, 寅]。

从代码的角度来看,这不过是一行:

def rotate(lst, n): return lst[n:] + lst[:n]

但这行代码背后,是天地盘结构的全部逻辑。理解了这一点,四课三传就不再玄乎了,它们只是从天地盘地支取对应关系后,再根据刑冲合害规则做的组合。四课是日干、日支分别与天盘对应地支的组合,三传则是从四课中根据克、害、合、冲关系递推出来的。

用代码建模六壬,最重要的是把十二地支“生旺墓绝、六亲、神煞、三传”的规则表都定义成数据驱动,而不是到处硬编码判断条件。

我最初的实现里,把贵人顺逆、三传取法写到长长的if-elif里,后果就是改一个规则就可能把另外两个盘面带偏。后来完整重构,把神煞、十二天将、月将表都整理成了独立的Python模块,数据表统一用字典维护,逻辑只负责查表和组合运算,整个代码的可维护性提升了一个量级。

5. 干支纪时的时差陷阱:为什么同一个时辰,排盘结果会不一样

排盘程序的时差坑,十个里有八个会踩,因为它涉及的不是代码语法,而是历法概念。

干支纪日是严格按子时换日的,也就是23点之前还是今天,到23点整就开始算第二天的干支。但现代人习惯按0点换日。这个差异如果处理不当,排出来的盘面就完全不同。尤其在奇门遁甲和大六壬里,时辰直接决定了值符值使、旬首、三传的逻辑起点,一旦时柱错,后面全错。

项目里对此的处理很明确:所有输入时间先统一转成东八区标准时间,然后判断是否进入当日的子时区间,若小时数在23点到24点之间,则日柱干支先取“后天”的干支,而时柱继续按“前夜子时”或“后夜子时”进行双轨制处理。

再往细了说,还有个真太阳时的校正问题。中国古代用的是每个地方自己的地方时,像北京和成都,同样的钟表时间,对应的太阳位置可能差出近一个小时。这意味着同一个公历时间,在东经120度标准和东经104度标准下,排出来的盘可能落在不同的时辰。这个项目在最初的版本里忽略了这个因素,后来对照古籍案例时发现偏差,才在历法层加了一个经度校正函数。

如果你也想做类似项目,我建议第一版先统一用北京时间,不做真太阳时校正,但架构上预留好经度参数。直接加校正会导致你拿网上扒来的案例数据做验证时对不上号,因为很多案例本身用的是标准时辰或已经换算后的信息,二次校正反而越校越偏。

6. 代码落地时的工程取舍:数据表驱动、单元测试与可视化

聊完了三式的算法本身,最后说说这个项目工程化的经验,也是我在复跑过程中觉得最值得分享的部分。

第一点是“数据表驱动”这套思路。三式体系里有大量固定规则,比如六十甲子纳音、十二长生、二十四节气对应局数等等,这些规则用字典存好即可,不要试图写公式推导。虽然六十甲子纳音可以用公式算,但公式的可读性极差,而且边界情况特别容易出错。用一张手工验证过的表,简单高效,也方便后人校验。

第二点是单元测试在“神秘学算法”中的作用。传统上,这类代码的验证方式是拿古籍案例去对盘。我在项目里整理了几十个典型案例,每个案例都写成单元测试用例,覆盖冬至阳遁、夏至阴遁、置闰、节气交接、子时换日等几个大的边界类型。事实证明,这比任何文档都有用。改过历法层的代码之后,跑一遍全部用例,几秒钟就知道哪些盘面偏移了。

下面是一个简化版的测试用例结构:

def test_winter_solstice_yang_dun(): dt = datetime(2024, 12, 21, 12, 0) result = QimenBoard(dt).generate() assert result.ju == 1 # 阳遁一局 assert result.zhifu == "天蓬" # 值符星

这类断言看着简单,实则需要把整个规则表吃得很透才能写出来。但一旦建立了这批测试,后续迭代就有了锚点。

第三点是可视化。古三式的排盘结果,字面上就是一大堆干支、星神、门将的罗列。对于代码开发者来说,最直观的呈现方式就是九宫格的图形界面。我在实验版本里用html表格和简单的CSS画了九宫布局,每宫填上星、门、神、遁甲等条目,对比传统排盘文献几乎一致,这样调试起来比看纯文本输出高效得多。后续如果你想做大六壬的天地盘视图,甚至可以用Canvas画圆环,把地盘天盘叠加显示,效果更好。

最后再说一点,这类项目的“开源价值”并不在于排盘本身,而是把一整套古代历法推算规则用现代工程手段做了验证。每个想入手的开发者,建议先从某一个门类开始,比如先做六壬的天地盘,再做奇门定局,最后才碰太乙积年。一上来就想三式全通,很容易在历法换算里就失去耐心。

7. 测试过程中的意外收获与边界问题处理

做这个项目期间,最让我意外的事是:奇门遁甲里“超神接气”的边界问题,居然没有出现在大量古籍案例里,而是出现在我自己生成随机日期验证时。

任意给一个公历时间,比如2032年9月14日,我第一版程序稳定输出了一个连续分配的三元局。但几乎每个节气的前一两天,都会出现“符头在节气前”的超神现象。这时如果按拆补法处理,盘面勉强能看,但从古籍理论上说,这种时辰按传统算法应该考虑置闰。

边界处理我最终采用了一个折中策略:保留拆补法作为默认引擎,同时在配置项里允许开启“置闰模式”。置闰模式的实现并不复杂——当符头落后节气一定天数时,把对应节气划入上一个节气的局,连续重复若干天。但它的引入会让局数表在跨年时出现非规律的跳跃,测试用例也要相应增加。

这个取舍过程让我意识到,很多所谓“玄学”的规则模糊地带,并不是因为古人不懂精确,而是因为历法本身不是完美的整数周期,必须用人为手段去修正误差。和现代编程里的“闰秒”本质上是一码事。理解了这一点,排盘程序就不再是背诵口诀,而是真正理解了历法为什么会这样设计。

如果你想把这种边界处理做得更好,建议在代码里把每一步推算的“中间量”都打印出来,比如当前的符头、节气日期、距下一个甲子日的天数差。这类调试信息在做边界对齐时价值无量,否则你只会看到一个错误结果,却不知道错在前半路还是后半路。

8. 我有话直说:这类项目真正的价值在哪

如果只把眼光放在“排盘准不准”上,那这个项目的上限也就是个冷门工具。但它真正让我着迷的点,是古代干支历法与现代计算逻辑之间存在的高度可翻译性。

六十甲子就是一个六十进制的有限状态机,九宫飞星的路径就是一个图遍历算法,月将加时本质上就是一次数组旋转。你不需要相信这套预测体系,但你不能否认,它的内部规则自洽、结构严密,堪称古人用符号系统构建的一台“思维计算机”。

用Python重写一遍这些规则,对理解中国传统历法的底层设计极有帮助。你能亲眼看到,为什么农历要搭配二十四节气才能精确定位农时,为什么干支纪日可以连续纪日不中断,为什么奇门遁甲要把一年分成阴阳两遁、各九局。这些不是背出来的知识点,而是在调试代码的过程中真正“长”出来的认知。

所以如果你也对传统历法或古典符号系统感兴趣,但又没想清楚从何入手,我的建议是:别从哲学讲义开始,直接从排一个盘、调一个bug开始。过程也许枯燥,但一旦跑通第一个完整的九宫盘面,那种“原来如此”的爽感,比任何理论书都给力。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询