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次,并统计次数。
本文介绍了 双向链表的实现和在周易算卦中的简单实现,我们可以理解其具有广泛民众基础的算卦如何运作 也可以对双向链表加深理解,
本项目是本人众多项目中的一个,希望能对看官有所益。
如果有任何疑问,和深入解读的兴趣的请联系我索取完整代码仓库。