
简介这是一套面向易学爱好者与前端开发者的学习型六爻占卜工具源码解决传统起卦流程繁琐、卦象理解门槛高、移动端适配差等问题适用于自学研究、教学演示或轻量级占卜应用二次开发。资源包共23个文件含10个TypeScriptX组件如HexagramLines.tsx、Coin.tsx、5个核心TS逻辑文件iching.ts、storage.ts等、3个配置类JSONpackage.json、vite.config.ts、metadata.json以及HTML入口页、README说明文档和环境变量文件整体仅31KB轻量易读。已有152人学习下载源码采用纯前端架构无后端依赖结构清晰模块化内置时间排盘、六亲伏神计算、本变卦图文解析等完整功能并预留扩展接口支持快速集成卦辞解读、历史记录等定制能力。1. 项目概述从“玄学”到“数字工具”的转变最近在整理一些老项目时翻到了一个挺有意思的东西——一个用Python写的六爻起卦工具。这玩意儿乍一听有点“玄”但本质上就是一个基于传统规则的随机数生成与卦象解析程序。我把它重新整理了一下优化了代码结构加上了更详细的注释现在开源出来。无论你是对传统文化感兴趣想自己算着玩还是想学习如何将一套复杂的规则系统用代码实现甚至是想做个相关的小程序或App这份源码都能提供一个非常清晰的参考骨架。它完全剥离了任何“神秘”色彩就是一个纯粹的逻辑工具输入问题或随机生成程序按照《周易》纳甲筮法的标准流程模拟摇卦过程输出对应的卦名、爻象、世应、六亲、六神等全套信息。下面我就把这个工具的完整实现思路、核心代码逻辑以及我踩过的一些坑毫无保留地分享出来。2. 核心设计思路与规则拆解2.1 为什么选择“纳甲筮法”作为实现标准市面上起卦方法很多比如梅花易数、数字卦等。我选择实现“纳甲筮法”也叫“金钱卦”或“六爻卦”主要是因为它规则最系统、最公开几乎完全程式化非常适合用代码来模拟。它的核心流程非常清晰通过三次投掷三枚铜钱或等效的随机行为产生一个爻阴爻或阳爻重复六次得到一个完整的六爻卦。然后根据固定的规则为这个卦装上“干支”、“六亲”、“世应”、“六神”等一套完整的分析符号体系。整个过程不涉及任何“灵感”或“外应”就是纯粹的数学和规则映射这是它能被完美代码化的前提。2.2 核心规则的数据化建模要把这套体系变成代码首先得把各种规则表“翻译”成数据结构。这是整个项目最基础也最繁琐的一步。八卦与六十四卦映射表这是根基。需要两个字典或列表。一个是“八卦”字典包含乾、兑、离、震、巽、坎、艮、坤八个经卦的二进制表示如乾为111坤为000和五行属性。另一个是“六十四卦”字典由上下两个经卦组合而成每个卦需要记录其序号、卦名、宫属属于八宫中的哪一宫、以及六爻的世应位置。这部分数据是静态的可以直接硬编码在代码里。天干地支与五行、六亲规则这是装卦的核心。每个卦的六个爻位需要装上“干支”。规则是根据卦所在的“宫”的五行属性以及每个爻位的地支来推导出该爻的“六亲”父母、兄弟、子孙、妻财、官鬼。例如乾宫属金那么地支为申、酉的爻就是“兄弟”同我者为兄弟地支为巳、午的爻就是“官鬼”克我者为官鬼。这套生克关系必须用代码清晰地定义出来。起卦的随机性模拟用random库模拟投掷三枚铜钱。约定三枚铜钱有字一面为“正面”阴无字一面为“背面”阳。三枚结果求和3个背面老阳记为O为93个正面老阴记为X为6两正一背少阳记为—为7两背一正少阴记为- -为8。这个“9、6、7、8”就是爻的“营数”。起卦时记录下六个营数。这里有一个关键老阳9和老阴6是“变爻”它们意味着这一爻未来会发生变化阳变阴阴变阳从而产生一个“变卦”也叫“之卦”。本卦代表现状变卦代表发展趋势这是六爻分析的一个重要维度。注意随机数的质量很重要。在Python中random模块对于此类应用完全足够不需要用到secrets。但如果你追求更“纯净”的随机性可以考虑引入时间毫秒、系统熵等作为种子的一部分或者让用户自己输入一组随机数。我在源码里提供了两种模式全自动随机生成和手动输入营数。3. 代码架构与核心模块解析我的工具主要分为四个核心模块结构清晰方便理解和修改。3.1 模块一gua_data.py- 静态数据库这个文件存放所有不变的规则数据。就像一本易经工具书。# 示例八卦基础数据 EIGHT_GUAS { 乾: {binary: 111, wu_xing: 金, symbol: ☰}, 坤: {binary: 000, wu_xing: 土, symbol: ☷}, 震: {binary: 001, wu_xing: 木, symbol: ☳}, 巽: {binary: 110, wu_xing: 木, symbol: ☴}, 坎: {binary: 010, wu_xing: 水, symbol: ☵}, 离: {binary: 101, wu_xing: 火, symbol: ☲}, 艮: {binary: 100, wu_xing: 土, symbol: ☶}, 兑: {binary: 011, wu_xing: 金, symbol: ☱}, } # 六十四卦数据简略示例 SIXTYFOUR_GUAS [ { id: 1, name: 乾为天, upper_gua: 乾, lower_gua: 乾, palace: 乾宫, # 所属宫 shi_ying: (6, 3), # 世爻在第6爻应爻在第3爻 full_name: 乾宫一世卦 }, # ... 其余63卦数据 ]此外这里还定义了天干、地支、五行生克表、六亲规则表、六神排列顺序表根据起卦日天干决定等。把所有“查表”的内容都放在这里主逻辑代码会非常干净。3.2 模块二qigua_core.py- 核心起卦引擎这是大脑负责协调所有流程。class QiGuaCore: def __init__(self): self.yao_numbers [] # 存储6个营数如[7,8,9,7,8,6] self.ben_gua_name # 本卦名 self.bian_gua_name # 变卦名 self.yao_details [] # 每个爻的详细信息列表 def generate_yao_numbers(self): 模拟摇卦生成6个营数7,8,9,6 import random self.yao_numbers [] for _ in range(6): # 模拟三枚铜钱0为阴正面1为阳背面 coins [random.randint(0, 1) for _ in range(3)] total sum(coins) # 背面阳面的数量 # 映射规则3背为9(老阳)0背为6(老阴)2背为7(少阳)1背为8(少阴) if total 3: self.yao_numbers.append(9) elif total 0: self.yao_numbers.append(6) elif total 2: self.yao_numbers.append(7) else: # total 1 self.yao_numbers.append(8) def determine_guas(self): 根据营数确定本卦和变卦 # 1. 将营数转化为爻象9(老阳) - 阳动爻 6(老阴) - 阴动爻 7 - 阳静爻 8 - 阴静爻 ben_yao_symbols [] bian_yao_symbols [] for num in self.yao_numbers: if num 9: ben_yao_symbols.append(yang) # 本卦为阳爻 bian_yao_symbols.append(yin) # 变卦为阴爻老阳变阴 elif num 6: ben_yao_symbols.append(yin) # 本卦为阴爻 bian_yao_symbols.append(yang) # 变卦为阳爻老阴变阳 elif num 7: ben_yao_symbols.append(yang) bian_yao_symbols.append(yang) # 静爻不变 else: # num 8 ben_yao_symbols.append(yin) bian_yao_symbols.append(yin) # 静爻不变 # 2. 根据爻象查找卦需要与gua_data中的二进制表示匹配 # 此处简化逻辑实际需要将yang/yin序列转换成二进制如111000再去SIXTYFOUR_GUAS中查找对应的卦名。 self.ben_gua_name self._find_gua_by_symbols(ben_yao_symbols) self.bian_gua_name self._find_gua_by_symbols(bian_yao_symbols) def _find_gua_by_symbols(self, yao_symbols): # 实现根据爻象序列查找卦名的逻辑 # 将yang-1, yin-0组成二进制字符串与数据中卦的二进制表示比对 binary_str .join([1 if y yang else 0 for y in yao_symbols]) # 遍历SIXTYFOUR_GUAS找到上下卦组合与此二进制串匹配的卦 # ... (具体查找逻辑) return found_gua_name这个类的generate_yao_numbers方法就是摇卦过程。determine_guas方法是核心中的核心它完成了从“营数”到“本卦”、“变卦”的判定。这里有一个容易出错的点爻的顺序。六爻卦是从下往上数的初爻在最下面上爻在最上面。在代码列表里索引0对应初爻索引5对应上爻。这个顺序在显示和后续装卦时绝对不能错。3.3 模块三zhuang_gua.py- 装卦逻辑实现卦起出来了还得给它“穿上衣服”即装上干支、六亲、世应、六神。这个过程完全规则化。def assemble_gua_details(gua_name, yao_numbers, day_gan): 为主卦装配详细信息 :param gua_name: 卦名如水火既济 :param yao_numbers: 6个营数列表 :param day_gan: 起卦日的天干用于排六神 :return: 包含6个爻完整信息的列表 details [] # 1. 根据卦名从SIXTYFOUR_GUAS中查出该卦的宫、世应位置等基础信息 gua_info lookup_gua_info(gua_name) # 2. 确定该卦的“卦宫五行” palace_wuxing get_palace_wuxing(gua_info[palace]) # 3. 为每个爻位装配信息 for i, yao_num in enumerate(yao_numbers): yao_info {} yao_info[position] i 1 # 爻位1为初爻 yao_info[yao_number] yao_num # 营数 yao_info[is_move] (yao_num 9 or yao_num 6) # 是否为动爻 # 装配地支每个宫每个爻位的地支是固定的查表即可 yao_info[di_zhi] get_dizhi_by_position(gua_info[palace], i) # 装配六亲根据地支五行和卦宫五行的生克关系计算 dizhi_wuxing get_wuxing_of_dizhi(yao_info[di_zhi]) yao_info[liu_qin] calculate_liu_qin(palace_wuxing, dizhi_wuxing) # 装配世应如果此爻位是世爻或应爻则标记 yao_info[is_shi] (i 1 gua_info[shi_ying][0]) yao_info[is_ying] (i 1 gua_info[shi_ying][1]) # 装配六神根据起卦日天干和爻位顺序从上爻或初爻开始排列 yao_info[liu_shen] get_liushen_by_day_gan(day_gan, i) details.append(yao_info) return detailsassemble_gua_details函数是装卦的核心。它清晰地展示了如何像搭积木一样为每个爻位填充属性。这里最关键的逻辑是calculate_liu_qin函数它实现了“生我者父母我生者子孙克我者官鬼我克者妻财比和者兄弟”这套规则。只要卦宫五行和地支五行确定六亲就是唯一确定的。3.4 模块四cli_display.py- 结果展示与交互最后我们需要一个友好的界面把结果展示出来。我选择先做一个命令行版本清晰直观。def display_gua_result(ben_gua_details, bian_gua_details, ben_gua_name, bian_gua_name): 在命令行中格式化显示卦象结果 print(\n *60) print(f本卦{ben_gua_name} | 变卦{bian_gua_name}) print(*60) # 打印爻象图 print(\n爻象图从下往上) for i in range(5, -1, -1): # 逆序打印从第6爻上爻开始 ben_yao ben_gua_details[i] bian_yao bian_gua_details[i] # 根据营数绘制爻的符号动爻用特殊标记 ben_symbol ---O if ben_yao[yao_number] 9 else --- if ben_yao[yao_number] 7 else - -X if ben_yao[yao_number] 6 else - - bian_symbol --- if bian_yao[yao_number] in [7,9] else - - # 变卦只显示静爻象动爻已变 print(f{i1}爻本 {ben_symbol} | 变 {bian_symbol}) # 打印详细的爻信息表格 print(\n爻位详情) print(f{爻位:4} {营数:4} {动变:4} {地支:4} {六亲:6} {世应:6} {六神:6}) print(-*50) for i in range(6): yao ben_gua_details[i] move_flag 动 if yao[is_move] else 静 shiying if yao[is_shi]: shiying 世 if yao[is_ying]: shiying 应 print(f{i1:2}爻 {yao[yao_number]:4} {move_flag:4} {yao[di_zhi]:6} {yao[liu_qin]:8} {shiying:6} {yao[liu_shen]:8})这个显示函数将枯燥的数据结构转化为了易于阅读的文本界面。它分别显示了本卦和变卦的卦名、爻象图以及一个包含所有关键信息爻位、营数、动静、地支、六亲、世应、六神的表格。对于开发者来说这个输出格式也便于调试和验证装卦逻辑是否正确。4. 实操从零运行与关键步骤详解4.1 环境准备与源码获取这个工具是纯Python写的所以你需要一个Python环境建议3.6以上。不需要任何第三方库标准库就足够了。获取源码你可以直接从我提供的仓库下载整个项目文件夹。里面应该包含至少这四个核心的.py文件以及一个README.md说明文件。目录结构建议保持如下简单结构便于管理liuyao_tool/ ├── gua_data.py # 静态数据 ├── qigua_core.py # 起卦核心逻辑 ├── zhuang_gua.py # 装卦逻辑 ├── cli_display.py # 命令行显示 └── main.py # 主程序入口运行主程序在命令行中进入该目录运行python main.py。main.py文件会整合所有模块提供一个简单的交互流程。4.2 主程序流程与交互设计一个友好的主程序应该引导用户完成起卦。以下是我在main.py中设计的基本流程# main.py from qigua_core import QiGuaCore from zhuang_gua import assemble_gua_details from cli_display import display_gua_result import datetime def main(): print(六爻起卦工具) print(1. 自动随机起卦) print(2. 手动输入营数用于验证或指定卦象) choice input(请选择模式 (1 或 2): ) core QiGuaCore() day_gan get_current_day_gan() # 获取当前日天干的函数 if choice 1: print(\n正在模拟摇卦...) core.generate_yao_numbers() print(f本次摇得的营数为从初爻到上爻: {core.yao_numbers}) elif choice 2: input_str input(请输入6个营数用逗号分隔如 7,8,9,7,8,6: ) try: core.yao_numbers [int(x.strip()) for x in input_str.split(,)] if len(core.yao_numbers) ! 6 or any(x not in [6,7,8,9] for x in core.yao_numbers): raise ValueError except ValueError: print(输入错误必须输入6个数字且每个数字只能是6,7,8,9。) return else: print(无效选择。) return # 确定卦象 core.determine_guas() print(f确定本卦: {core.ben_gua_name}) print(f确定变卦: {core.bian_gua_name}) # 装卦 print(正在装配卦象信息...) ben_gua_details assemble_gua_details(core.ben_gua_name, core.yao_numbers, day_gan) # 对于变卦其爻的营数需要根据动变重新计算静爻营数不变动爻营数阴阳互换后取对应的静爻数7或8 bian_yao_numbers calculate_bian_yao_numbers(core.yao_numbers) bian_gua_details assemble_gua_details(core.bian_gua_name, bian_yao_numbers, day_gan) # 显示结果 display_gua_result(ben_gua_details, bian_gua_details, core.ben_gua_name, core.bian_gua_name) # 可选将结果保存到文件 save_to_file input(\n是否将结果保存到文件(y/n): ) if save_to_file.lower() y: save_result_to_txt(core.ben_gua_name, core.bian_gua_name, ben_gua_details, bian_gua_details) if __name__ __main__: main()这个主程序提供了两种模式非常实用。“自动随机”模式用于日常起卦“手动输入”模式则是一个强大的调试和学习工具你可以输入任何一组营数观察程序如何一步步推导出卦象和装卦结果这对于理解规则和验证代码正确性至关重要。4.3 核心算法变卦营数的计算这是一个容易忽略但非常重要的细节。在main.py中我调用了calculate_bian_yao_numbers函数。它的逻辑是本卦的营数中9老阳和6老阴是动爻。变卦的爻是由本卦的爻变化而来。变化规则是老阳变少阴9 - 8老阴变少阳6 - 7。而原本的少阳7和少阴8是静爻在变卦中保持不变。def calculate_bian_yao_numbers(ben_yao_numbers): 根据本卦营数计算变卦营数 bian_numbers [] for num in ben_yao_numbers: if num 9: bian_numbers.append(8) # 老阳变少阴 elif num 6: bian_numbers.append(7) # 老阴变少阳 else: bian_numbers.append(num) # 少阳少阴不变 return bian_numbers这个函数返回的bian_numbers才是用于为变卦assemble_gua_details装卦的营数列表。很多初学者会直接拿本卦的营数去装变卦导致六亲、六神排错。5. 常见问题与调试心得在开发和测试这个工具的过程中我遇到了不少坑。这里总结一下希望能帮你节省时间。5.1 数据准确性是生命线整个项目最脆弱的环节就是gua_data.py里的静态数据。六十四卦的世应位置、每宫每爻的地支这些数据必须100%准确。一旦这里出错后面所有的装卦结果都是错的。避坑技巧1交叉验证。不要只依赖一个资料来源。我当初对比了至少三本不同版本的六爻书籍和几个公认准确的在线排盘网站的数据才敢把数据固化到代码里。建议你也为这些关键数据编写单元测试用已知的卦例比如乾为天卦世在六爻应在三爻来验证查找和装配逻辑。避坑技巧2数据格式设计。在设计SIXTYFOUR_GUAS的数据结构时我最初把上下卦的二进制表示也存了进去这样在_find_gua_by_symbols函数里可以直接用字符串比对比通过上下卦名组合查找更快速、更不容易出错。5.2 爻序问题从下往上 vs. 从上往下这是逻辑错误的高发区。在易经中爻是从下往上数的初、二、三、四、五、上。但在编程中列表索引是从0开始的并且我们通常习惯按0到5的顺序处理。解决方案在代码内部统一使用列表索引[0]到[5]来代表初爻到上爻。仅在显示给用户看的时候进行“1”和逆序操作。例如在cli_display.py的打印函数里我用了for i in range(5, -1, -1)来逆序循环确保先打印上爻最后打印初爻符合阅读习惯。而在所有内部计算如查找世应位置数据中世爻3表示三爻都需要将“爻位编号-1”来得到列表索引。5.3 六神排列的起始点六神的排列青龙、朱雀、勾陈、螣蛇、白虎、玄武依据起卦日的天干但排列的起始点有争议有的流派从初爻开始排有的从上爻开始排。我的选择与原因我采用了目前比较通用的“依据日干定六神从初爻开始顺次排列”的规则。在zhuang_gua.py的get_liushen_by_day_gan函数中我内置了一个映射表甲日乙日起青龙丙日丁日起朱雀戊日起勾陈己日起螣蛇庚日辛日起白虎壬日癸日起玄武。然后根据爻位索引i0为初爻顺序分配。这个规则清晰且易于实现。如果你需要兼容其他流派可以把这个规则做成可配置的。5.4 如何处理“伏神”与“游魂”、“归魂”卦这是六爻体系中的进阶内容。伏神是指本卦中没有出现的六亲需要从该卦所在的“本宫”卦中借过来。游魂卦和归魂卦的世应位置排列规则与常规卦不同。当前版本的取舍在开源的这个基础版本中我暂时没有实现伏神和游魂归魂的特殊规则。原因是为了保持核心逻辑的清晰和代码的简洁让初学者能先理解主干。这并不影响工具生成一个符合大部分分析要求的卦盘。伏神主要用于细节补充游魂归魂影响世应位置而我的gua_data.py中的数据已经包含了所有六十四卦正确的世应位置这本身就涵盖了游魂归魂卦的特殊性。所以对于世应位置数据是正确的只是没有额外标记是否为游魂归魂卦也没有显示伏神。扩展建议如果你需要这些功能可以在gua_data.py的每卦数据中增加一个is_youhun是否游魂或is_guihun是否归魂的字段。对于伏神可以写一个函数根据卦宫和本卦六亲计算出缺失的六亲并从本宫首卦中找到对应的地支和爻位作为伏神显示。这是一个很好的功能扩展点。5.5 随机性的哲学思考与程序实现这是一个有趣的话题。程序用伪随机数模拟铜钱是否“心诚则灵”从编程角度我们关心的是随机数的质量和不可预测性。Python的random模块在默认情况下以系统时间为种子对于这个应用足够了。但如果你想让过程更有“仪式感”可以考虑让用户介入在自动摇卦前让用户按一下回车将按下的精确时间毫秒级作为随机种子的一部分。使用更随机的源虽然没必要但你可以用os.urandom来获取一些系统熵。记住一点这个工具的核心价值在于准确无误地执行规则。它把复杂的查表、推算工作自动化避免了人工排盘可能出现的错误。至于随机性只是触发规则的一个输入源头而已。最后这个项目的全部源码我已经整理好。它不仅仅是一个“算命程序”更是一个学习中国传统文化中逻辑与符号系统的绝佳编程案例。你可以用它作为起点开发出带图形界面的桌面应用、微信小程序或者集成到更大的系统中去。希望这份详细的拆解和源码能给你带来启发和帮助。如果在使用或扩展过程中遇到问题欢迎一起交流探讨。本文还有配套的精品资源点击获取