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 起卦页开发要点
- 三变算法模拟传统起卦流程,每次随机生成一爻
- 六爻生成后确定本卦和变卦
- 动爻标记用红色高亮显示
- 卦象展示使用Canvas绘制
10.2 常见问题
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 卦象生成错误 | 随机算法有误 | 检查castYao方法 |
| 动爻标记不对 | 动爻判断逻辑错误 | 检查6和9的判断 |
| 变卦计算错误 | 变卦算法有误 | 检查getChangedHexagram方法 |
