← Back to list

梅花易数与C语言(二)

在上一篇中,我们建立了梅花易数的核心架构:它是一个 IPO 系统。

Cyan_Plaid · 2026-01-30 20:22 · 0 claps · 5.3 min read
#i-ching #predictions #traditional-culture #bagua #fortune-telling
Open on Medium ↗
Wiki topics: STP · Startups & Venture CUL · Culture & Media

梅花易数与C语言(二)

在上一篇中,我们建立了梅花易数的核心架构:它是一个 IPO 系统。

今天这一篇,我们要深入到底层,去定义这个系统里的对象(Objects),并编写具体的输入解析函数(Input Parsers)

Part 1: 定义基本对象 (The Struct)

在梅花易数中,最基本的单位是“卦”。在 C 语言中,我们可以把它定义为一个 struct。它不仅仅是一个数字,它包含了一堆属性(Metadata):五行、季节、自然属性、象征意义……

1. 八卦的属性 (The Attributes)

我们在 header 文件中定义这八个常量。除了对应的二进制数,最重要的就是它们的物理引擎属性(Physics Properties)——也就是五行。

typedef struct s_trigram {
    int     id;          // 先天数 (1-8)
    int     binary;      // 二进制 (000-111)
    char    *name;       // 乾, 兑, 离...
    char    *element;    // 金, 木, 水, 火, 土
} t_trigram;

2. 五行生克矩阵 (Interaction Matrix)

这八个卦并不是孤立存在的,它们之间存在一套游戏平衡性规则,也就是五行生克。这就像是编写游戏里的伤害计算公式:

  • 生 — Buff: 金生水,水生木,木生火,火生土,土生金。
  • 克 — Damage: 金克木,木克土,土克水,水克火,火克金。

我们看五行,也是为了在后面的运算环节更好地了解生克关系,再对应到环境和对象(人物、物件等测算内容)上,让算法跑通。

Part 2: 复合结构 (Hexagram Composition)

我们断卦时,看的是六爻(Hexagram)。

2个 Trigrams (3-bit) 组合 = 1个 Hexagram (6-bit)。

但这不仅仅是简单的拼接,一个挂在时间轴上会演化出四种形态。在内存中,这像是一个链表:

1. 本卦 (The Original State)

这是初始状态 init()。 由上卦和下卦组成。

  • 体卦 (Host/Self): 没有动爻的那个 3-bit 卦。代表你自己。
  • 用卦 (Guest/Environment): 有动爻的那个 3-bit 卦。代表事情/对方。

2. 互卦 (The Internal Process / Middleware)

互卦代表事情发展的中间过程内部隐含因素

这是很多初学者最晕的地方,但用代码解释极其简单,就是Bitwise Operation。它的算法是:掐头去尾取中间

  • 互卦的下卦 = 原卦的第 2, 3, 4 爻。
  • 互卦的上卦 = 原卦的第 3, 4, 5 爻。

在 C 语言里,这就是 位移(Bit Shifting)与掩码(Masking)操作:

// 假设 original 是一个 6-bit 整数 (0-63)
// 比如 110101 (二进制)

int get_hu_gua(int original)
{
    // 互卦下卦: 取第2,3,4位 (Indices 1,2,3)
    // 右移1位,然后用 111 (0x7) 做 AND 运算
    int lower_hu = (original >> 1) & 0x07; 

    // 互卦上卦: 取第3,4,5位 (Indices 2,3,4)
    // 右移2位,然后用 111 (0x7) 做 AND 运算
    int upper_hu = (original >> 2) & 0x07;

    return (create_hexagram(upper_hu, lower_hu));
}

3. 变卦 (The Result State)

这是最终结果 return value。 由动爻决定。对动爻所在的 Bit 进行 XOR (异或) 操作,0变1,1变0,得到的新卦就是变卦。

4. 综卦与错卦 (Advanced Views)

为了多维视角看问题,我们还有:

  • 综卦 (Reverse): 把卦象倒过来看(180度翻转)。算法是 Bit Reversal。站在对方立场看问题。
  • 错卦 (Opposite): 阴阳全变。算法是 Bitwise NOT (~)。站在问题的对立面看。

Part 3: 输入重载 (Polymorphic Input Methods)

梅花易数最强大的地方在于它的Input System是多态的(Polymorphic)。无论用户传入什么数据类型,我们都有对应的处理函数。

方法一:数字起卦 (Numbers as Input)

这是最基础的 int 处理。

Scenario A: 传入 1 个数字

  • Upper = Number % 8
  • Lower = (Number + TimeConst) % 8 (必须这就需要引入时间作为盐值 Salt)
  • Moving = (Number + TimeConst) % 6

Scenario B: 传入 2 个数字 (m, n)

  • Upper = m % 8
  • Lower = n % 8
  • Moving = (m + n) % 6

Scenario C: 传入 3 个数字 (x, y, z) 这通常用于更精细的定位:

  • Upper = x % 8
  • Lower = y % 8
  • Moving = (x + y + z) % 6

(注:所有取余结果若为0,则视为8,即坤卦)

方法二:字符流解析 (String Parsing)

处理 char *str。这里涉及到一个核心的内存分配原则: “天清地浊” 。 意思就是:上卦要轻(字数少/笔画少),下卦要重(字数多/笔画多)。

1. 单字解析 (Struct Parsing): 如果不拆字数,就拆结构。

  • 左右结构(如“好”): 左边笔画为上卦,右边为下卦。
  • 上下结构(如“岩”): 上半部分为上卦,下半部分为下卦。

2. 多字解析 (Buffer Splitting): 如果字数是奇数,比如 3 个字“我爱你”。 不能 3 / 2 = 1.5。必须按“天清地浊”分:

  • 上卦 (Heaven): 1 个字 (“我”) ➡️ 笔画数 % 8。
  • 下卦 (Earth): 2 个字 (“爱你”) ➡️ (爱+你)总笔画 % 8。

这就像是一个固定的 Index Splitting 策略。

方法三:后天端法 (Visual/Event Driven)

也就是“看到什么算什么”。这是一种 Event-Driven (事件驱动) 的起卦法。

  • 看到一位老人: 老人 = 乾卦 (1)。
  • 看到这人从南方来: 南方 = 离卦 (3)。
  • 上卦: 1 (乾)
  • 下卦: 3 (离)
  • 动爻: (1 + 3 + Time) % 6

这种方法叫“后天起卦”,它的特点是:入参灵活,依赖起挂者的捕捉能力。

Part 4: 传统 Input 案例 (Legacy Code)

观梅占 (The Original Commit) 邵雍最初的案例:见两雀争枝坠地。

  • Input 1: 两雀 (Num = 2) ➡️ 兑卦 (2)。为上卦。
  • Input 2: 东南枝 (Direction = 巽/5)。为下卦。
  • Time: 辰时 (Num = 5)。
  • Moving Line: (2 + 5 + 5) / 6 … 余 6。
  • Result: 泽风大过 变 泽山咸。
  • Output: 预言明晚会有女子以此因折花摔伤。

메타데이터
post_id
97fb1ffd02e4
slug
梅花易数与c语言-二-97fb1ffd02e4
url
https://medium.com/@cyan_plaid/%E6%A2%85%E8%8A%B1%E6%98%93%E6%95%B0%E4%B8%8Ec%E8%AF%AD%E8%A8%80-%E4%BA%8C-97fb1ffd02e4
canonical_url
https://medium.com/@cyan_plaid/%E6%A2%85%E8%8A%B1%E6%98%93%E6%95%B0%E4%B8%8Ec%E8%AF%AD%E8%A8%80-%E4%BA%8C-97fb1ffd02e4
author_url
https://medium.com/@cyan_plaid
status
ok
fetched_at
2026-06-27 07:40:21