diff --git a/README.md b/README.md index a7e2902..9a73126 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# YI 周易算法 +# YI 周易算法 # TimeQiGua() @@ -12,3 +12,8 @@ NumberQiGua() 下卦:int 上卦:int 变数:int + + +### [数理简介](./docs/数理简介.md) ### +### [八卦](https://baike.baidu.com/item/%E5%85%AB%E5%8D%A6/166475?sefr=cr) ### +### [六十四卦](https://baike.baidu.com/item/%E5%85%AD%E5%8D%81%E5%9B%9B%E5%8D%A6) ### \ No newline at end of file diff --git a/dayan.go b/dayan.go index f57a0db..2bcce28 100644 --- a/dayan.go +++ b/dayan.go @@ -21,12 +21,12 @@ var daYanList map[int]*DaYan func init() { daYanList = make(map[int]*DaYan) - file_81shu, err := DataFiles.Open("data/81shu.csv") + file81shu, err := DataFiles.Open("data/81shu.csv") if err != nil { panic(err) } - records, err := readData(file_81shu) + records, err := readData(file81shu) if err != nil { panic(err) @@ -57,7 +57,7 @@ func init() { } } -//IsNotSuitableSex 女性不宜此数 +// IsNotSuitableGirl 女性不宜此数 func (dy DaYan) IsNotSuitableGirl() bool { return dy.NvMing == "凶" } diff --git "a/docs/\346\225\260\347\220\206\347\256\200\344\273\213.md" "b/docs/\346\225\260\347\220\206\347\256\200\344\273\213.md" index 1e8a1f8..bff2944 100644 --- "a/docs/\346\225\260\347\220\206\347\256\200\344\273\213.md" +++ "b/docs/\346\225\260\347\220\206\347\256\200\344\273\213.md" @@ -17,6 +17,6 @@ 对原有卦象取爻变(对应线取反)即得变卦,通常预示着所占卜之事的最终结果, 后边八卦由上下两卦生成八十一象,称为“矩”,与《老子》、《道德经》中81章对应, -这部分,[《八卦九象和《老子》的创作方法、分章及章序》](https://zhuanlan.zhihu.com/p/90606767)有详述, +这部分,[《八卦九象和《老子》的创作方法、分章及章序》](https://zhuanlan.zhihu.com/p/90606767) 有详述, 本项目对于81象吉凶以“大衍之数”冠名 diff --git a/go.mod b/go.mod index 84a883f..cab2ccf 100644 --- a/go.mod +++ b/go.mod @@ -1,5 +1,3 @@ module yi go 1.16 - -replace github.com/godcong/yi => ../yi diff --git a/guaxiang.go b/guaxiang.go index 21f87f8..c4a8f67 100644 --- a/guaxiang.go +++ b/guaxiang.go @@ -5,21 +5,33 @@ import ( "strconv" ) +type Yao int + +const ( + ChuYao Yao = iota + ErYao + SanYao + SiYao + WuYao + ShangYao + YaoMax +) + //GuaXiang 卦象 type GuaXiang struct { - GuaXu int //卦序 - ShangGua string //上卦 - ShangShu int //上卦数 - XiaGua string //下卦 - XiaShu int //下卦数 - JiXiong string //吉凶(?) - GuaXiang string //卦象 - GuaMing string //卦名 - GuaYi string //卦意(邵雍) - FuHao string //符号 - GuaYaos [6]*GuaYao //初,二,三,四,五,上 - Yong string //用九,用六 - YongJiXiong string //用九,用六吉凶 + GuaXu int //卦序 + ShangGua string //上卦 + ShangShu int //上卦数 + XiaGua string //下卦 + XiaShu int //下卦数 + JiXiong string //吉凶(?) + GuaXiang string //卦象 + GuaMing string //卦名 + GuaYi string //卦意(邵雍) + FuHao string //符号 + GuaYaos [YaoMax]*GuaYao //初,二,三,四,五,上 + Yong string //用九,用六 + YongJiXiong string //用九,用六吉凶 } var gx map[string]*GuaXiang @@ -27,12 +39,12 @@ var gx map[string]*GuaXiang func init() { gx = make(map[string]*GuaXiang) - file_64gua, err := DataFiles.Open("data/64gua.csv") + file64gua, err := DataFiles.Open("data/64gua.csv") if err != nil { panic(err) } - records, err := readData(file_64gua) + records, err := readData(file64gua) if err != nil { panic(err) @@ -109,12 +121,12 @@ func init() { } guaxiang.GuaYaos[5] = &guyao6 - gx_index := record[1] - if len(gx_index) < 1 { + gxIndex := record[1] + if len(gxIndex) < 1 { panic("index is wrong") } - gx[gx_index] = &guaxiang + gx[gxIndex] = &guaxiang } } @@ -122,6 +134,6 @@ func getGuaXiangs() map[string]*GuaXiang { return gx } -func GetGuaXiang(gua_idx string) *GuaXiang { - return gx[gua_idx] +func GetGuaXiang(guaIdx string) *GuaXiang { + return gx[guaIdx] } diff --git a/guaxiang_test.go b/guaxiang_test.go index e4ef683..02342a1 100644 --- a/guaxiang_test.go +++ b/guaxiang_test.go @@ -4,9 +4,50 @@ import ( "testing" ) -func TestGetGuaXiang(t *testing.T) { - if len(getGuaXiangs()) != 64 { - t.Log("not enough", getGuaXiangs()) +func TestGetGuaXiang1(t *testing.T) { + gx := getGuaXiangs() + if len(gx) != 64 { + t.Fatal("not enough", len(gx)) + } + for i := range gx { + t.Logf("idx(%+v):%+v", i, gx[i]) } +} +func TestGetGuaXiang(t *testing.T) { + type args struct { + guaIdx string + } + tests := []struct { + name string + args args + want *GuaXiang + }{ + // TODO: Add more cases. + { + name: "", + args: args{ + guaIdx: "兑艮", + }, + want: &GuaXiang{ + GuaXu: 31, + ShangShu: 1, + XiaShu: 6, + }, + }, + } + for _, tt := range tests { + t.Run( + tt.name, func(t *testing.T) { + got := GetGuaXiang(tt.args.guaIdx) + t.Logf("卦象:%+v", got) + if got.ShangShu != tt.want.ShangShu { + t.Errorf("GetGuaXiang() = %v, want %v", got, tt.want) + } + if got.XiaShu != tt.want.XiaShu { + t.Errorf("GetGuaXiang() = %v, want %v", got, tt.want) + } + }, + ) + } } diff --git a/guayao.go b/guayao.go index 3ed1a4e..1c5444e 100644 --- a/guayao.go +++ b/guayao.go @@ -17,6 +17,7 @@ func getGuaYao(xiang *GuaXiang, yao int) GuaYao { return *xiang.GuaYaos[yao] } +//FilterYao 过滤爻 func (y *Yi) FilterYao(sex Sex, fs ...string) bool { yao := getGuaYao(y.Get(BianGua), y.BianYao()) for _, s := range fs { @@ -35,6 +36,7 @@ func (y *Yi) FilterYao(sex Sex, fs ...string) bool { return true } +//IsLucky 是否为吉 func (y *Yi) IsLucky(sex Sex) bool { yao := getGuaYao(y.Get(BianGua), y.BianYao()) diff --git a/wuxing.go b/wuxing.go index 8e462a8..7f7ef63 100644 --- a/wuxing.go +++ b/wuxing.go @@ -1,8 +1,10 @@ package yi +type YingYang int + const ( - Yin = 1 - Yang = 0 + Yin YingYang = 1 //阴 + Yang YingYang = 0 //阳 ) const ( @@ -22,29 +24,28 @@ const wuXingList string = "水木木火火土土金金水" //五行 const ( - MU int = iota + 1 - HUO - TU - JIN - SHUI + MU int = iota + 1 //木 + HUO //火 + TU //土 + JIN //金 + SHUI //水 ) -func YinYang(i int) int { - if i%2 == Yang { +func ModeYinYang(i int) YingYang { + if i%2 == 0 { return Yang } return Yin } -func YinYangAttr(i int) string { - if YinYang(i) == Yang { +func (yy YingYang) String() string { + if yy == 0 { return YangStr } - return YinStr } -// GenerateThreeTalent 计算字符的三才属性 +// NumberWuXing 计算字符的三才属性 // 1-2木:1为阳木,2为阴木 // 3-4火:3为阳火,4为阴火 // 5-6土:5为阳土,6为阴土 diff --git a/zhouyi.go b/zhouyi.go index 17bc053..77b620d 100644 --- a/zhouyi.go +++ b/zhouyi.go @@ -8,43 +8,48 @@ import ( "time" ) +const TimeFormat = "2006-01-02 15:04" + const ( - //本卦 + // BenGua 本卦 BenGua = iota - //变卦 + // BianGua 变卦 BianGua - //互卦 + // HuGua 互卦 HuGua - //错卦 + // CuoGua 错卦 CuoGua - //综卦 + // ZongGua 综卦 ZongGua + // GuaMax 卦最大值 GuaMax ) type BaGua = int const ( - //卦象:乾 + // QianGua 卦象:乾(0) QianGua BaGua = 0b000 - //卦象:兑 + // DuiGua 卦象:兑(1) DuiGua BaGua = 0b001 - //卦象:离 + // LiGua 卦象:离(2) LiGua BaGua = 0b010 - //卦象:震 + // ZhenGua 卦象:震(3) ZhenGua BaGua = 0b011 - //卦象:巽 + // XunGua 卦象:巽(4) XunGua BaGua = 0b100 - //卦象:坎 + // KanGua 卦象:坎(5) KanGua BaGua = 0b101 - //卦象:艮 + // GenGua 卦象:艮(6) GenGua BaGua = 0b110 - //卦象:坤 + // KunGua 卦象:坤(7) KunGua BaGua = 0b111 ) +//符号 var fu map[int]string +///卦象 var gua map[int]string //Yi 周易卦象 @@ -53,12 +58,11 @@ type Yi struct { bianShu []int } +//Get 取卦 func (y *Yi) Get(m int) *GuaXiang { - if m < 0 && m >= GuaMax { return nil } - return y.gua[m] } @@ -66,12 +70,12 @@ func init() { fu = make(map[int]string) gua = make(map[int]string) - file_8gua, err := DataFiles.Open("data/8gua.csv") + file8gua, err := DataFiles.Open("data/8gua.csv") if err != nil { panic(err) } - records, err := readData(file_8gua) + records, err := readData(file8gua) if err != nil { log.Fatal(err) @@ -88,6 +92,7 @@ func init() { fu[int(guashu)] = record[2] gua[int(guashu)] = record[0] } + } //QiGua 起卦 @@ -95,29 +100,10 @@ func QiGua(xia, shang int) *Yi { return NumberQiGua(shang, xia) } -//TimeQiGua +//TimeQiGua 按时间起卦 func TimeQiGua(xia int, shang int, t time.Time) *Yi { - ben := benGua(shang, xia) bs := timeToBian(t) - bian := bianGua(ben, bs) - hu := ben - if ben.ShangShu == KunGua && ben.XiaShu == KunGua || - ben.ShangShu == QianGua && ben.XiaShu == QianGua { - hu = bian - } - hu = huGua(hu) - cuo := cuoGua(ben) - zong := zongGua(ben) - return &Yi{ - gua: [GuaMax]*GuaXiang{ - BenGua: ben, - BianGua: bian, - HuGua: hu, - CuoGua: cuo, - ZongGua: zong, - }, - bianShu: []int{bs}, - } + return NumberQiGua(xia, shang, bs) } func getBianShu(bs ...int) int { @@ -128,7 +114,7 @@ func getBianShu(bs ...int) int { return bNum } -//NumberQiGua +//NumberQiGua 按数起卦 func NumberQiGua(xia int, shang int, bs ...int) *Yi { ben := benGua(shang, xia) bian := bianGua(ben, bs...) @@ -154,7 +140,7 @@ func NumberQiGua(xia int, shang int, bs ...int) *Yi { //StringToTime trans string to time func StringToTime(s string) time.Time { - t, err := time.ParseInLocation("2006-01-02 15:04", s, time.Local) + t, err := time.ParseInLocation(TimeFormat, s, time.Local) if err != nil { return time.Time{} } @@ -163,7 +149,7 @@ func StringToTime(s string) time.Time { } func timeToBian(t time.Time) int { - t, _ = time.ParseInLocation("2006-01-02 15:04", t.Format("2006-01-02 15:04"), t.Location()) + t, _ = time.ParseInLocation(TimeFormat, t.Format(TimeFormat), t.Location()) bnum := t.Unix() if bnum != 0 { return int(bnum % 6) @@ -189,7 +175,7 @@ func getGua(i int) string { return gua[7] } -//三数取卦数(1~8) +// GetGua3Num 三数取卦数(1~8) func GetGua3Num(shang, zhong, xia int) int { shangYao := shang % 2 zhongYao := zhong % 2 diff --git a/zhouyi_test.go b/zhouyi_test.go index dd28413..641d559 100644 --- a/zhouyi_test.go +++ b/zhouyi_test.go @@ -1,16 +1,11 @@ package yi import ( + "reflect" "testing" "time" ) -func TestQiGua(t *testing.T) { - yi := QiGua(7, 7) - get := yi.Get(0) - t.Log(get) -} - func TestJiaoHu(t *testing.T) { for i, j := 0, 0; i <= 7; j++ { t.Log(fu[i], fu[j], fu[hu(i, j)]) @@ -63,3 +58,68 @@ func TestNumberQiGua(t *testing.T) { //gua7 := NumberQiGua(23, 20, int(StringToTime("2024-01-01 00:00").Unix()/1000000%6)) //log.Println(gua7.Get(BenGua), gua7.Get(BianGua)) } + +func TestQiGua(t *testing.T) { + type args struct { + xia int + shang int + } + tests := []struct { + name string + args args + want *Yi + }{ + // TODO: Add more cases. + { + name: "", + args: args{ + xia: 8, + shang: 8, + }, + want: &Yi{ + gua: [GuaMax]*GuaXiang{ + BenGua: { + GuaXu: 2, + ShangShu: 7, + XiaShu: 7, + }, + }, + bianShu: nil, + }, + }, + { + name: "", + args: args{ + xia: 7, + shang: 7, + }, + want: &Yi{ + gua: [GuaMax]*GuaXiang{ + BenGua: { + GuaXu: 52, + ShangShu: 6, + XiaShu: 6, + }, + }, + bianShu: nil, + }, + }, + } + for _, tt := range tests { + t.Run( + tt.name, func(t *testing.T) { + if got := QiGua(tt.args.xia, tt.args.shang); !reflect.DeepEqual(got, tt.want) { + t.Logf("本卦:%+v", got.gua[BenGua]) + if got.gua[BenGua].ShangShu != tt.want.gua[BenGua].ShangShu { + t.Errorf("Shang QiGua() = %v, want %v", got.gua[BenGua], tt.want.gua[BenGua]) + } + + if got.gua[BenGua].XiaShu != tt.want.gua[BenGua].XiaShu { + t.Errorf("Xia QiGua() = %v, want %v", got.gua[BenGua], tt.want.gua[BenGua]) + } + + } + }, + ) + } +}