小六壬起课器.py

(仅起到起课作用)

​ 小六壬,古代中国占卜法,古代主要用于军事韬略,尤以别名诸葛亮马前课著名。

​ 在所有术数中时间都是首位,所以第一则是获取当前用户时间。在运行时可能会遇到用户输入各种类型的数据,所以使用try来运行可能出错的代码,并且在报错后循环让用户重新输入。

1
2
3
4
5
6
7
8
9
10
while True: #无限循环
try: #尝试运行可能出错的代码
time=int(input("以24时制输入当地当前时:")) #获取时间
except (ValueError, TypeError): #数值错误和数值类型错误时的处理
print("错误,输入数字有误,例:当前13:11,则输入13")
continue #跳过下面的循环,防止因为上面错误导致time没有获取数值而使下面的判断报错
if time in list10: #判断输入数字是否为0~23
break #正常则执行下面的代码
else: #不符合则提示并循环
print("错误,输入数字有误,例:当前13:11,则输入13")

​ 小六壬中常见起课方式有日期起课以及随机数起课,在这里仅做了随机数起课。(后续可能增加以日期起课的选择)仍然使用try语句来处理可能遇到的输入数据类型错误,再将得到三个随机数储存。

1
2
3
4
5
6
7
8
9
10
11
12
13
print("输入心中立即想到的任意大小的正整数")
numbers1 = [None, None, None] # 用列表存储 x, y, z
for i in range(3): # 循环三次以获取三个数字
while True: #无限循环
try:
numbers1[i] = int(input(f"请输入第 {i + 1} 个数字: ")) #使用f语句
if numbers1[i] <= 0: # 检查输入的数字是否为正整数
print("输入数字有误,请输入正负整数")
else:
break # 如果输入有效,则退出当前的 while 循环
except (ValueError,TypeError):
print("输入数字有误,请输入正负整数")
x, y, z = numbers1 # 将输入的数字赋值给 x, y, z

​ 创建一个列表储存十二个时辰,由于一个时辰对应两个小时,所以列表中时辰储存两次,再将时间对应列表中的时辰,以便后续输出,以及字典的调用。

1
list1=['子','丑','丑','寅','寅','卯','卯','辰','辰','巳','巳','午','午','未','未','申','申','酉','酉','戌','戌','亥','亥','子'] #创建时辰列表
1
time1 = list1[time] #将时间对应时辰

​ 再调用字典将时辰对应12小时制的数字。

1
time2 = dict1.get(time1,'无效值') #调用字典将时辰与数字对应,time1上不用加''

​ 相较于第一版,增加了活六神的功能,仅做展示。

1
2
3
4
5
6
7
8
9
10
11
12
13
time3 = time2%6 #对time2取余数,可知龙头宫位
whole = 6-time3 #得出青龙后还有几个元素作为整体
element=list11[:whole+1] #将青龙以及后面的元素作为整体
if time3 == 1:
list12=list11
elif time3 == 0:
list12=['朱雀','勾陈','白虎','玄武','腾蛇','青龙']
else:
list12=[x for x in list11 if x not in element]+element #先遍历列表8不属于整体的元素再加上整体中的元素生成新列表10
x5,y5,z5 = list5[x1],list5[y1],list5[z1] #分别给三才赋值六神
x6,y6,z6 = list12[x1],list12[y1],list12[z1] #分别给三才赋值活六神
number1,number2,number3 = dict2.get(x3),dict2.get(y3),dict2.get(z3) #调用字典将五行与列表数字对应
list13,list14,list15=globals()[f'list{number1}'],globals()[f'list{number2}'],globals()[f'list{number3}'] #使用globals()作用于全局区别于locals()只能在一个函数局部内返回变量,生成三才对应的十二长生列表

​ 由于python自带的以及库中的居中对齐功能无法正常使用,为了美观增加了根据字数增加空格的函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def print_xyz(x,y,z): #封装成函数
x_len,y_len,z_len = len(x),len(y),len(z)
if x_len == 1 and y_len == 1 and z_len == 1:
print('', x, ' ', y, ' ', z)
elif x_len == 2 and y_len == 1 and z_len == 1:
print(x, '', y, ' ', z)
elif x_len == 2 and y_len == 2 and z_len == 1:
print(x, y, '', z)
elif x_len == 2 and y_len == 1 and z_len == 2:
print(x, '', y, '', z)
elif x_len == 1 and y_len == 2 and z_len == 1:
print('', x, '', y, '', z)
elif x_len == 1 and y_len == 2 and z_len == 2:
print('', x, '', y, z)
elif x_len == 1 and y_len == 1 and z_len == 2:
print('', x, ' ', y, '', z)
else:
print(x, y, z)

​ 以下是完整代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
list1=['子','丑','丑','寅','寅','卯','卯','辰','辰','巳','巳','午','午','未','未','申','申','酉','酉','戌','戌','亥','亥','子'] #创建时辰列表
list2=['大安','留连','速喜','赤口','小吉','空亡'] #创建六宫列表
list3=['木','土','火','金','水','土'] #创建五行列表
list4=['东','四方','南','西','北','中央'] #创建方位列表
list5=['青龙','腾蛇','朱雀','白虎','玄武','勾陈'] #创建六神列表
list6=['沐浴','冠带','临官','帝旺','衰','死','病','墓','绝','胎','养','长生'] #创建木对应的十二长生列表
list7=['胎','养','长生','沐浴','冠带','临官','帝旺','衰','死','病','墓','绝'] #创建火对应的十二长生列表
list8=['死','病','墓','绝','胎','养','长生','沐浴','冠带','临官','帝旺','衰'] #创建金对应的十二长生列表
list9=['帝旺','衰','死','病','墓','绝','胎','养','长生','沐浴','冠带','临官'] #创建水,土对应的十二长生列表
list10=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23] #创建时间列表
list11=['青龙','朱雀','勾陈','白虎','玄武','腾蛇'] #创建活六神顺序列表
dict1={'子': 1,'丑': 2,'寅': 3,'卯': 4,'辰': 5,'巳': 6,'午': 7,'未': 8,'申': 9,'酉': 10,'戌': 11,'亥': 12} #创建时辰字典
dict2={'木':6,'火':7,'金':8,'水':9,'土':9}
while True: #无限循环
try: #尝试运行可能出错的代码
time=int(input("以24时制输入当地当前时:")) #获取时间
except (ValueError, TypeError): #数值错误和数值类型错误时的处理
print("错误,输入数字有误,例:当前13:11,则输入13")
continue #跳过下面的循环,防止因为上面错误导致time没有获取数值而使下面的判断报错
if time in list10: #判断输入数字是否为0~23
break #正常则执行下面的代码
else: #不符合则提示并循环
print("错误,输入数字有误,例:当前13:11,则输入13")
print("输入心中立即想到的任意大小的正整数")
numbers1 = [None, None, None] # 用列表存储 x, y, z
for i in range(3): # 循环三次以获取三个数字
while True: #无限循环
try:
numbers1[i] = int(input(f"请输入第 {i + 1} 个数字: ")) #使用f语句
if numbers1[i] <= 0: # 检查输入的数字是否为正整数
print("输入数字有误,请输入正负整数")
else:
break # 如果输入有效,则退出当前的 while 循环
except (ValueError,TypeError):
print("输入数字有误,请输入正负整数")
x, y, z = numbers1 # 将输入的数字赋值给 x, y, z
time1 = list1[time] #将时间对应时辰
time2 = dict1.get(time1,'无效值') #调用字典将时辰与数字对应,time1上不用加''
time3 = time2%6 #对time2取余数,可知龙头宫位
whole = 6-time3 #得出青龙后还有几个元素作为整体
element=list11[:whole+1] #将青龙以及后面的元素作为整体
x1,y1,z1= (x-1)%6,(x+y-2)%6,(x+y+z-3)%6 #分别取余数
x2,y2,z2 = list2[x1],list2[y1],list2[z1] #分别给三才赋值六宫
x3,y3,z3 = list3[x1],list3[y1],list3[z1] #分别给三才赋值五行
x4,y4,z4 = list4[x1],list4[y1],list4[z1] #分别给三才赋值方位
if time3 == 1:
list12=list11
elif time3 == 0:
list12=['朱雀','勾陈','白虎','玄武','腾蛇','青龙']
else:
list12=[x for x in list11 if x not in element]+element #先遍历列表8不属于整体的元素再加上整体中的元素生成新列表10
x5,y5,z5 = list5[x1],list5[y1],list5[z1] #分别给三才赋值六神
x6,y6,z6 = list12[x1],list12[y1],list12[z1] #分别给三才赋值活六神
number1,number2,number3 = dict2.get(x3),dict2.get(y3),dict2.get(z3) #调用字典将五行与列表数字对应
list13,list14,list15=globals()[f'list{number1}'],globals()[f'list{number2}'],globals()[f'list{number3}'] #使用globals()作用于全局区别于locals()只能在一个函数局部内返回变量,生成三才对应的十二长生列表
x7,y7,z7 =list13[time2-1],list14[time2-1],list15[time2-1]
time_len = len(str(time))
if time_len == 1:
print('时间','',time,' ',time1)
else:
print('时间','',time,' ',time1)
print(x2,y2,z2)
print('',x3,' ',y3,' ',z3)
def print_xyz(x,y,z): #封装成函数
x_len,y_len,z_len = len(x),len(y),len(z)
if x_len == 1 and y_len == 1 and z_len == 1:
print('', x, ' ', y, ' ', z)
elif x_len == 2 and y_len == 1 and z_len == 1:
print(x, '', y, ' ', z)
elif x_len == 2 and y_len == 2 and z_len == 1:
print(x, y, '', z)
elif x_len == 2 and y_len == 1 and z_len == 2:
print(x, '', y, '', z)
elif x_len == 1 and y_len == 2 and z_len == 1:
print('', x, '', y, '', z)
elif x_len == 1 and y_len == 2 and z_len == 2:
print('', x, '', y, z)
elif x_len == 1 and y_len == 1 and z_len == 2:
print('', x, ' ', y, '', z)
else:
print(x, y, z)
print_xyz(x4,y4,z4) #调用函数
print(x5,y5,z5)
print(x6,y6,z6)
print_xyz(x7,y7,z7) #调用函数
input("按下Enter退出")