首页 > 其他分享 >运势计算:以双向链表实现: 解读运势

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

时间:2023-07-25 11:02:18浏览次数:44  
标签:FormatShow 变卦 运势 链表 int append 双向 dt GuaData

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联系作者:[email protected]" + "\n")
	f.WriteString(result)
	f.Close()
	fmt.Println("已保存:", fileNames)

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

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

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

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

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

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

小结

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

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

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

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

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

标签:FormatShow,变卦,运势,链表,int,append,双向,dt,GuaData
From: https://blog.51cto.com/u_16190327/6843358

相关文章

  • LeetCode 热题 100 之 21. 合并两个有序链表
    题目将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例1:输入:l1=[1,2,4],l2=[1,3,4]输出:[1,1,2,3,4,4]示例2:输入:l1=[],l2=[]输出:[]示例3:输入:l1=[],l2=[0]输出:[0]提示:两个链表的节点数目范围是[......
  • 数组(Array)和链表(List)
    推荐https://cloud.tencent.com/developer/article/2304343引言在Java编程中,数组(Array)和链表(List)是常用的数据结构,用于在内存中存储和组织数据。两者都有各自的特点和适用场景,本文将深入比较数组与链表的区别,并结合代码示例进行详细解释。数组(Array)定义和特点数组是一种固定......
  • 运势计算:以双向链表实现: 计算爻卦
    1.0准备开始我们先制定一个计算结构体,一切开始于此。我们首先需要知道参与计算的算子有多少,我们就按最常用的数49来制定。typeDataTaostruct{DefMeanmap[int]string//卦象坐标名称DefValuemap[int]string//卦象坐标值4个GuaData[]......
  • 代码随想录-链表-C++总结
    代码随想录(programmercarl.com)这次复习的主要目的还是熟练c++的基本语法知识,顺带过一下链表的典型题目印象深刻直接没做出来的有7.链表相交,没有想到先过一遍求出两条链表的长度,然后通过长度差的信息来get交点做的时候写出bug的有3.设计链表,涉及的基础思想还是比较多的,需......
  • 工作学习:简单双向绑定
    双向绑定语法在WXML中,普通的属性的绑定是单向的。例如:<inputvalue="{{value}}"/>如果使用 this.setData({value:'leaf'}) 来更新 value ,this.data.value 和输入框的中显示的值都会被更新为 leaf ;但如果用户修改了输入框里的值,却不会同时改变 this.data.value ......
  • 单链表的实现
    #include<stdio.h>#include<stdlib.h>//创建一个单链表structLNode//结点{intdata;//数据structLNode*next;//指向下个结点的指针};voidList_Print(structLNode*p)//自定义列表打印函数{while(p){......
  • 双向链表的实现
    //带头节点的双链表#include<stdio.h>#include<stdlib.h>typedefstructDNode{intdata;structDNode*prior;structDNode*next;}DNode;//初始化头结点DNode*Init_DLinkList(){DNode*L;L=(DNode*)malloc(sizeof(DNode));L->......
  • 剑指 Offer 35. 复杂链表的复制
    题目:/*//DefinitionforaNode.classNode{public:intval;Node*next;Node*random;Node(int_val){val=_val;next=NULL;random=NULL;}};*/classSolution{public:Node*copyRandomList(N......
  • go 循环链表
    packagemainimport("fmt")typeNodestruct{DataintNext*Node}typeCircularLinkedListstruct{Head*NodeTail*Node}funcNewCircularLinkedList()*CircularLinkedList{return&CircularLinkedList{}}func(l......
  • HJ48 从单向链表中删除指定值的节点
    1.题目读题 HJ48 从单向链表中删除指定值的节点 考查点 这道题的考查点是单向链表的删除操作,主要是考察你能否掌握以下几个方面:如何遍历链表,找到要删除的节点或其前驱节点。如何修改节点的指针域,使其跳过要删除的节点。如何释放要删除的节点的内存空间,防止内存泄......