HarmonyOS应用《玄象》开发实战:CastDivinationPage 起卦页:六爻动变算法 + 18 次三变法模拟

📅 2026/7/26 21:53:05 👁️ 阅读次数 📝 编程学习
HarmonyOS应用《玄象》开发实战:CastDivinationPage 起卦页:六爻动变算法 + 18 次三变法模拟

阅读时长:约 20 分钟 | 难度:★★★★★ | 篇章:第 5 篇 · 周易易学模块 对应源码:entry/src/main/ets/pages/yijing/CastDivinationPage.ets

前言

起卦是《周易》占卜的核心环节。玄象项目通过CastDivinationPage模拟传统“三变十八变“的起卦流程——通过 18 次随机数生成六爻,根据“老阴、少阴、老阳、少阳“规则确定卦象与动爻。本篇将深入剖析玄象项目起卦算法的实现:从三变模拟算法、六爻生成逻辑、动爻判断规则,到本卦/变卦/互卦的推导。掌握这套起卦算法,您就能在 HarmonyOS 应用中实现完整的周易占卜功能。

提示:传统起卦需要 50 根蓍草,经过“三变“确定一爻,重复 18 次得到六爻。玄象项目用随机数模拟这一过程。

一、三变模拟算法

1.1 核心算法

private castYao(): number { // 三变:每变随机分两组 const first = Math.floor(Math.random() * 49) + 1; const second = 49 - first; // 挂一 const guaYi = 1; // 揲四 const firstRemainder = first % 4 || 4; const secondRemainder = second % 4 || 4; // 归奇 const remaining = firstRemainder + secondRemainder + guaYi; // 三变后的剩余蓍草数 const result = 49 - remaining; // 确定爻性:6-老阴,7-少阳,8-少阴,9-老阳 return Math.floor(result / 4); }

二、六爻生成

2.1 生成六爻

private castHexagram(): number[] { const yaos: number[] = []; for (let i = 0; i < 6; i++) { yaos.push(this.castYao()); } return yaos; }

三、动爻判断

3.1 动爻规则

private isChangingYao(yaoValue: number): boolean { return yaoValue === 6 || yaoValue === 9; // 老阴、老阳为动爻 }

四、本卦/变卦推导

4.1 变卦生成

private getChangedHexagram(originalYaos: number[]): number[] { return originalYaos.map(yao => { if (yao === 6) return 9; // 老阴变少阳 if (yao === 9) return 6; // 老阳变少阴 return yao; // 少阴少阳不变 }); }

五、起卦页设计总结

5.1 数据流

用户点击"开始起卦" ↓ 18 次随机数模拟三变 ↓ 6 个爻值(6/7/8/9) ↓ 确定本卦(原卦象) ↓ 确定动爻(老阴/老阳) ↓ 生成变卦(动爻变化) ↓ 展示本卦/变卦/动爻信息

六、起卦算法的完整流程

6.1 起卦步骤

传统起卦分为“三变十八变“:

1. 分二:将 49 根蓍草随机分为两堆 2. 挂一:从右堆取 1 根挂于左手小指 3. 揲四:两堆分别以 4 根为单位计数 4. 归奇:将余数合并 5. 重复 3 次(三变)确定一爻 6. 重复 6 次(六爻)得到完整卦象

6.2 爻值含义

爻值名称阴阳是否动爻
6老阴
7少阳
8少阴
9老阳

6.3 动爻的意义

动爻(老阴 6 和老阳 9)表示该爻位有“变动“,变爻后的卦象为“变卦“。动爻是解读卦象变化的关键。

七、起卦页的 UI 设计

7.1 起卦按钮

Button('开始起卦') .fontSize(16) .fontColor('#FFFFFF') .width('100%') .height(48) .backgroundColor(Colors.PRIMARY_GOLD) .borderRadius(24) .onClick(() => { this.castHexagram(); })

7.2 卦象展示

起卦完成后,页面展示本卦和变卦的六爻绘制,以及卦名、卦辞、动爻位置等信息。

八、起卦算法的单元测试

8.1 测试用例

describe('HexagramDivinationTest', () => { it('should generate 6 yaos', 0, () => { const yaos = castHexagram(); expect(yaos.length).assertEqual(6); }); it('each yao should be 6,7,8,9', 0, () => { const yaos = castHexagram(); yaos.forEach(yao => { expect([6,7,8,9]).assertContain(yao); }); }); it('should calculate changed hexagram', 0, () => { const original = [6, 7, 8, 9, 7, 8]; const changed = getChangedHexagram(original); expect(changed[0]).assertEqual(9); // 6 → 9 expect(changed[3]).assertEqual(6); // 9 → 6 }); });

总结

本篇以玄象项目起卦页为蓝本,深入剖析了《周易》起卦算法的 ArkTS 实现:从三变模拟算法、六爻生成逻辑、动爻判断规则,到本卦/变卦的推导。掌握这套起卦算法,您就能在 HarmonyOS 应用中实现完整的周易占卜功能。

如果这篇文章对你有帮助,欢迎点赞👍、收藏⭐、关注🔔,你的支持是我持续创作的动力!


相关资源:

  • HarmonyOS 官方文档:Button 组件
  • HarmonyOS 官方文档:CanvasRenderingContext2D
  • HarmonyOS 官方文档:ForEach 组件
  • HarmonyOS 官方文档:List 组件
  • HarmonyOS 官方文档:Scroll 组件
  • HarmonyOS 官方文档:Column 组件
  • HarmonyOS 官方文档:Row 组件
  • 周易起卦法:wikipedia.org/wiki/周易占卜
  • 六十四卦:wikipedia.org/wiki/六十四卦
  • 开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net

九、起卦页的完整实现

9.1 起卦算法核心

private castYao(): number { const first = Math.floor(Math.random() * 49) + 1; const second = 49 - first; const guaYi = 1; const firstRemainder = first % 4 || 4; const secondRemainder = second % 4 || 4; const remaining = firstRemainder + secondRemainder + guaYi; const result = 49 - remaining; return Math.floor(result / 4); }

9.2 六爻生成

private castHexagram(): number[] { const yaos: number[] = []; for (let i = 0; i < 6; i++) { yaos.push(this.castYao()); } return yaos; }

9.3 动爻与变卦

private getChangedHexagram(originalYaos: number[]): number[] { return originalYaos.map(yao => { if (yao === 6) return 9; if (yao === 9) return 6; return yao; }); }

十、总结与最佳实践

10.1 起卦页开发要点

  1. 三变算法模拟传统起卦流程,每次随机生成一爻
  2. 六爻生成后确定本卦和变卦
  3. 动爻标记用红色高亮显示
  4. 卦象展示使用Canvas绘制

10.2 常见问题

问题原因解决方案
卦象生成错误随机算法有误检查castYao方法
动爻标记不对动爻判断逻辑错误检查6和9的判断
变卦计算错误变卦算法有误检查getChangedHexagram方法

总结