1 解读运势

我们已经做了些什么? 这一小节我们将能看到我们做了一些什么事情,还记得第一小节的链表查询函数吗?

没错就是display,在第二小节中,我们将每次的爻变记录 和 爻值存入了链表,现在我们实现它以显示爻变的过程。


运势计算:以双向链表实现: 解读运势_双向链表


/// 显示并返回链表的值

func (this *dlist) display() []int {
    
    numbs := []int{}
    node := this.head
    t := 0 
    for node != nil {

        Logg.Println(node.number, node.yaobian)
        numbs = append(numbs, node.number)
        t += 1
        if t >= this.lens {
            break
        }

        node = node.next
    }

    fmt.Println("length:", this.lens)
    return numbs
}

1.1 准备材料

1.1.0 准备解释材料

世界的变化都在天地之间,人类关注的内容主要就是 天,地,人 三才

//解释文本,找到运势卦象后 通过此函数获得对应的 卦象解释和对应数字

func (ic *ICh) CommonText(arrays []int) (string, int) {
    if len(arrays) != ic.Num {
        return ic.Warn + fmt.Sprintf("%v", arrays), 0
    }

    if ic.CompSlice(arrays, []int{1, 1, 1, 1, 1, 1}) {
        return `
        第一卦 乾 乾为天 乾上乾下 

        乾:元,亨,利,贞。 
        ....

在显示卦象时,提示用户爻变的位置和解释方式
    AnySis = map[int]string{
        0: "  六爻全不变,以本 卦卦辞占   ----- 不变 只看本卦 ",
        1: "一爻变,以本卦变爻的爻辞占          ----- 变卦前 的那一 变爻 含义",
        2: " 如果两个爻发生变动,使用本卦的两个变爻占辞判断吉凶,以位置靠上的为主   ----- 变卦前 的 第一变爻 含义",
        3: " 三爻变,以本卦及之卦的卦辞占,以本卦的卦辞为主    ----- 变卦前后都看, 本卦及之卦 含义  本卦为主",
        4: "  四爻变,以之卦中二不变的爻辞占,以下爻的爻辞为主   ----- 变卦 后 看,  之卦 含义  二不变的爻辞占,以下爻的爻辞为主",
        5: "  五爻表,以之卦中不变的爻辞占卜   ----- 变卦 后 看,  之卦 含义  不变的爻辞占 ",
        6: "  六爻全变,乾坤两卦以用九和用六的辞占卜,并参考之卦卦辞,余六十二卦占以之卦卦辞  ----- 变卦 后 看,  之卦 含义,乾坤 用九和用六 ,其他卦全看",
    }

由于全部 64项内容过多,如果希望查看全部内容,请到我的仓库查看

1.1.1 格式化输出, 让我们漂亮地查看爻的卦象,

添加读取函数

// # 6爻卦象 变卦后,解释其含义
    func (dt *DataTao) KanGua(gua []int, n int) (string, int) {
            /*
               解释卦 的含义
               :param gua: 转 7, 8 为 1, 0
               :return:
            */
            newG := []int{}
            for _, g := range gua {
                    if g == 7 {
                            newG = append(newG, 1)
                    }
                    if g == 8 {
                            newG = append(newG, 0)
                    }
            }

            nc := ICApp
            means, nob := nc.CommonText(newG)
            nc.HowAnysis(n)
            guas := dt.Common(newG)
            print(means)
            result := guas + "\n" + means
            return result, nob
    }

在结构体中展示

// 格式化输出
func (dt *DataTao) FormatShow(cont string) string {
        /*
                :param cont:  需要显示的内容
                :return:
        */
        spaceStr := []string{} //{" ", dt.Indent}
        for i := 0; i < dt.Indent; i++ {
                spaceStr = append(spaceStr, " ")
        }
        msg := strings.Join(spaceStr, "") + cont
        print(msg)
        return msg + "\n"
}

// 转变 6 爻为 卦象后 显示卦象
func (dt *DataTao) Common(gua []int) string {
        /*
           gua 转变后的列表,只应该有 0,1
                  :param gua: example [1,0,1,0,1,0]
                  :return: string
        */
        guas := ""
        for _, g := range gua {
                if g == 0 { // 0 表示阴爻
                        guas += dt.FormatShow("__ __ (阴)")
                } else if g == 1 { // 1 表示阳爻
                        guas += dt.FormatShow("_____ (阳)")
                } else {
                        guas += dt.FormatShow("")
                }
        }

        return guas
}

查看原始卦象。 // # 6爻卦象 显示原始卦象

func (dt *DataTao) KanGuaOrigin() ([]int, int) {
    c := "n"  //是否显示此卦象,默认为显示
    guas := dt.SuanGua()
    gua := guas.display()
    v := 0 //# 变爻次数
    fmt.Println("卦象已出:")
    if c == "n" {
        for _, g := range gua {
            if g == 6 || g == 8 {
                if g == 6 {
                    dt.FormatShow("__ __ (6 " + dt.DefMean[6] + ")\n")
                    dt.GuaData = append(dt.GuaData, 7) //# 只写入变卦后的 少阳 少阴
                    v += 1
                }
                if g == 8 {
                    dt.FormatShow("__ __ (8 " + dt.DefMean[8] + ")\n")
                    dt.GuaData = append(dt.GuaData, g) //# 只写入变卦后的 少阳 少阴
                }

            } else if g == 7 || g == 9 {
                if g == 7 {
                    dt.FormatShow("_____ (7 " + dt.DefMean[7] + ")\n")
                    dt.GuaData = append(dt.GuaData, g) //# 只写入变卦后的 少阳 少阴
                }

                if g == 9 {
                    dt.FormatShow("_____ (9 " + dt.DefMean[9] + ")\n")
                    dt.GuaData = append(dt.GuaData, 8) //# 只写入变卦后的 少阳 少阴
                    v += 1
                }

            } else {
                dt.FormatShow("")
            }
        }
    } else {
        for _, g := range gua {
            if g == 6 || g == 8 {
                if g == 6 {
                    dt.FormatShow("_____ (6 " + dt.DefMean[6] + " -> 7 " + dt.DefMean[7] + ")\n")
                    dt.GuaData = append(dt.GuaData, 7) //# 只写入变卦后的 少阳 少阴
                    v += 1
                }

                if g == 8 {
                    dt.FormatShow("__ __ (8 " + dt.DefMean[8] + ")\n")
                    dt.GuaData = append(dt.GuaData, g) //# 只写入变卦后的 少阳 少阴
                }

            } else if g == 7 || g == 9 {
                if g == 7 {
                    dt.FormatShow("_____ (7 " + dt.DefMean[7] + ")\n")
                    dt.GuaData = append(dt.GuaData, g) //# 只写入变卦后的 少阳 少阴
                }

                if g == 9 {
                    dt.FormatShow("__ __ (9 " + dt.DefMean[9] + "-> 8 " + dt.DefMean[8] + ")\n")
                    dt.GuaData = append(dt.GuaData, 8) //# 只写入变卦后的 少阳 少阴
                    v += 1
                } else {
                    dt.FormatShow("")
                }

            }
        }

    }
    return dt.GuaData, v
}

最后 让我们把计算结果保存到本地,以日期格式作为标题

fmt.Println("回车保存结果并退出:")
	var act = ""
	fmt.Scanln(&act)
	fmt.Println(".", act)
	fileName := "guali_" + time.Now().String()[:18]
	fileNames := strings.Replace(fileName, " ", "", -1)
	fileNames = strings.Replace(fileNames, ":", ".", -1)
	fileNames = strings.Replace(fileNames, "-", ".", -1) + ".txt"
	f, err := os.Create(fileNames)
	if err != nil {
		msg := fmt.Sprintf("Can not write data:%v\n", err)
		panic(msg)
	}
	f.WriteString(fileNames + "\n联系作者:hahamx@foxmail.com" + "\n")
	f.WriteString(result)
	f.Close()
	fmt.Println("已保存:", fileNames)

格式化输出结果 并且把结果变得更漂亮一些。 添加程式启动提示,您可以自己定义格式

start = `
       _______
       _______
       _______
       .......

___ ....元亨利贞....____

___ ....运势占卜....____

____....大吉大利.... ___

     .......
     ___ ___
     ___ ___
     ___ ___

小结

我们可以计算一万次,并统计64卦 分别出现多少次,从而知道中有多少人与自己的运势相同

小练习: 实现计算10000次,并统计次数。

本文介绍了 双向链表的实现和在周易算卦中的简单实现,我们可以理解其具有广泛民众基础的算卦如何运作 也可以对双向链表加深理解,

本项目是本人众多项目中的一个,希望能对看官有所益。

如果有任何疑问,和深入解读的兴趣的请联系我索取完整代码仓库。