20214318《Python程序设计》实验四 Python综合实践实验报告

------------恢复内容开始------------

20214318《Python程序设计》实验四 Python综合实践实验报告

课程:        《Python程序设计》
班级:        2143
姓名:        姚家豪
学号:        20214318
实验教师:  王志强
实验日期:  2022年5月24日
必修/选修: 公选课

一、实验内容

 

1.契机:

  在本学期所学的政治哲学课上,傅强老师在介绍中国传统文化《周易》的一节课中尝试使用时间起卦进行占卜,结果占出来是“大凶”。这令我印象十分深刻,于是便学习了几种比较简单的占卜方法。经观察,发现这些卜卦的过程中的数学运算其实十分简单,遂想编出程序,自助卜卦,以供消遣。

 

2.主要内容: 

一,掷硬币占卜法:

1.通过虚拟地投掷三枚硬币,产生二进制三位数组,每一个二进制三位数组又只与‘0’和‘1’对应。

2.重复六次,得到二进制六位数组。

3.查表,前三位和后三位分别对应着本卦的上卦与下卦。

4.上卦与下卦的序数之和对8取模取得变卦。

二,时间起卦法:

(其实本可以直接用程序取得时间,但是那样就失去了“自助”的意义,并且使计算过程几乎完全与占卜人没有交互)

1.输入年月日时辰。

2.上卦为年月日之和对8取模。

3.下卦为年月日时辰之和对8取模。

4.变卦为年月日时辰之和对6取模

三,方位起卦法:

1.输入占卜对象的性别及大体年龄。

2.输入占卜对象相对于占卜人的方向。

3.输入占卜时刻(时辰)。

4.三者之和除二对8取模得上卦。

5.三者之和乘二对8取模得下卦。

6.上卦除三对6取模得变卦。

7.输入对象运动的快慢,做出模糊预测。

四,梅花易数占卜法。

1.获取一个随机数(我们这里用当前的时间戳)对8取模,当做上挂

2.再从占卜者处获得一个随机自然数,对八取模,当做下挂

3.将上述两个随机数进行组合,得到一个六位二进制数

4.六位二进制数转化为十进制数,得到本卦

5.取一个随机数,对6取模,将上述六位二进制数对应位数的0变为1,1变为0,然后转化为十进制数,得到变卦

结:根据本卦和变卦查表,得到占卜结果

三,代码的实现

一些前期准备工作:

 

这两个函数能实现自然数和二进制数组之间的相互转化。

 

 此处为将一个“本卦”或“变卦”打印出来,以实现最基本的可视化。

 

 丢铜板的主程序:

 

 

 

按方位起卦的程序:

 

 

 

 按时间起卦的程序:

 

 梅花易数起卦主程序:

 

 读取本卦信息并打印出本卦对应卦象与预言:

 

 读取变卦信息并打印出变卦对应卦象与预言:

 

 

 

 此处为卦象数据库局部图:

 

 源代码如图:

  1 import json
  2 import random
  3 import time
  4 import os
  5 
  6 #别挂配置数据
  7 gua_data_path = r"C:\Users\YJH\Desktop\学PY\data.json"
  8 
  9 #别卦数据
 10 gua_map = {
 11         
 12 }
 13 
 14 #读取别卦数据
 15 def load():
 16     with open(gua_data_path,'r',encoding='utf8')as fp:
 17         global gua_map
 18         gua_map = json.load(fp)
 19 #爻图标映射
 20 map = {
 21     0:"- -",
 22     1:"---"
 23 }
 24 
 25 #经卦名
 26 name = {
 27     0:"",1:"",2:"",3:"",4:"",5:"",6:"",7:""
 28 }
 29 
 30 #数字转化为二进制数组
 31 def gua_to_yao(gua, yao_length=3):
 32     result = []
 33     while gua >= 1:
 34         level = 0 if gua % 2 == 0 else 1
 35         gua //= 2
 36         result.append(level)
 37     while len(result) < yao_length:
 38         result.append(0)
 39     return result
 40 
 41 #二进制数组转化为数字
 42 def yao_to_gua(array):
 43     array = array[:]
 44     while len(array) > 0 and array[-1] == 0:
 45         array.pop()
 46     result = 0
 47     for i in range(len(array)):
 48         if array[i] == 0:
 49             continue
 50         result += pow(2, i)
 51                 
 52     return result
 53 
 54 #打印一个挂
 55 def print_gua(gua):
 56     yao_list = gua_to_yao(gua, 6)
 57     up_yao_list = yao_list[0:3]
 58     up = yao_to_gua(up_yao_list)
 59 
 60     print(map[up_yao_list[2]])
 61     print(map[up_yao_list[1]] + " " + name[up])
 62     print(map[up_yao_list[0]])
 63         
 64     print("")
 65 
 66     down_yao_list = yao_list[3:6]
 67     down = yao_to_gua(down_yao_list)
 68     print(map[down_yao_list[2]])
 69     print(map[down_yao_list[1]] + " " + name[down])
 70     print(map[down_yao_list[0]])
 71 
 72 
 73 def 随机():
 74     a1 = random.randint(0,1)
 75     a2 = random.randint(0,1)
 76     a3 = random.randint(0,1)
 77     sum=a1+a2+a3
 78     if(sum==0):return 1#老阴
 79     elif(sum==1):return 1#阳爻
 80     elif(sum==2):return 0#阴爻
 81     elif(sum==3):return 0#老阳
 82 
 83 
 84 sum1=0
 85 sum2=0
 86 sum3=0
 87 
 88 
 89 
 90 def azimuth1():
 91     print("您选择了以方位起卦")
 92     a1=int(input("请选择占卜对象的性别,1为您的父亲(或60以上男子),2为您的母亲(或60以上女子),3为40到60的男子,4为40到60的女子,5为20到40的男子,6为20到40的女子,7为少年,8为少女"))
 93     if(a1==1):
 94         return 1
 95     elif(a1==2):
 96         return 8
 97     elif(a1==3):
 98         return 4
 99     elif(a1==4):
100         return 5
101     elif(a1==5):
102         return 6
103     elif(a1==6):
104         return 3
105     elif(a1==7):
106         return 7
107     elif(a1==8):
108         return 2
109 
110 
111 #主程序
112 os.system('cls')
113 load()
114 
115 a=int(input("请选择您要进行的占卜方式,丢铜板请输入1,按时间起卦请输入2,按方位起卦请输入3,梅花易数自动卜卦请输入4"))
116 z=[[1,1,1],[0,1,1],[1,0,1],[0,0,1],[1,1,0],[0,1,0],[1,0,0],[0,0,0]]
117 # z1=[1,1,1]#乾一
118 # z2=[0,1,1]#兑二
119 # z3=[1,0,1]#离三
120 # z4=[0,0,1]#震四
121 # z5=[1,1,0]#巽五
122 # z6=[0,1,0]#坎六
123 # z7=[1,0,0]#艮七
124 # z8=[0,0,0]#坤八
125 gua1=[]
126 gua2=[]
127 
128 if(a==1):
129     for i in range(3):
130         gua1.append(随机())
131     for i in range(8):
132         if z[i] == gua1:
133             sum1=i
134 
135     for i in range(3):
136         gua2.append(随机())
137     for i in range(8):
138         if z[i] == gua2:
139             sum2=i
140     sum3=(sum1+sum2)%8
141 
142 elif(a==2):
143     #调用“时间”一次,将取得sum1与sum2,并修改sum3对应的元素(将0变成1,将1变成0)
144     print("您选择了以时间起卦\n")
145     a1=int(input("请输入年:"))
146     a2=int(input("请输入月:"))
147     a3=int(input("请输入日:"))
148     a4=int(input("请输入时(按时辰计):"))
149     b1=int((a1-3)/12)
150     sum1=int((b1+a2+a3)%8)
151     sum2=int((b1+a2+a3+a4)%8)
152     sum3=int((b1+a2+a3+a4)%6)
153 
154     
155 elif(a==3):
156     a1=azimuth1()
157     a2=int(input("请输入您要占卜的对象相对于你的方位,西北为1西为2,南为3,东为4,东南为5,北方为6,东北为7,西南为8"))
158     a3=int(input("请输入占卜的时刻(以时辰计):"))
159     sum1=int(((a1+a2+a3)/2)%8)
160     sum2=int(((a1+a2+a3)*2)%8)
161     sum3=int((sum1/3)%6)
162     s=int(input("对象运动是快还是慢?快为1,慢为2"))
163     if(s==1):
164         print("那么占卜结果可能会在{}(小时/天/周/月/年)之内发生".format(sum1))
165     elif(s==2):
166         print("那么占卜结果可能会在{}(小时/天/周/月/年)之内发生".format(sum2))
167     print_gua(a)
168         #修改sum3对应元素(同上)
169 elif(a==4):
170     print("使用梅花易数占卜")
171     sum1= int(round(time.time() * 1000)) % 8
172     sum2= int(input("请输入浮现在你脑海中的一个自然数"))%6
173 #起上卦
174 
175 up_yao_array = gua_to_yao(sum1)
176 print("上卦为:", name[sum1])
177 #起下卦
178 
179 down_yao_array = gua_to_yao(sum2)
180 print("下卦为:", name[sum2])
181 #组成卦象
182 print("------------------------------------------------本卦------------------------------------------------")
183 yao_list = up_yao_array + down_yao_array
184 gua = yao_to_gua(yao_list)
185 print_gua(gua)
186 #读取本卦象信息
187 gua_code = str(name[sum1]) + str(name[sum2])
188 gua_data = gua_map[gua_code]
189 print("本卦为:", gua_data['name'])
190 print("辞:", gua_data['words'],"译:",gua_data['white_words'])
191 print("象:", gua_data['picture'],"译:",gua_data['white_picture'])
192 print("预示:",gua_data['c'])
193 print("------------------------------------------------变卦------------------------------------------------")
194 change_yao_list = yao_list[:]
195 change_yao_list[sum3] = 0 if change_yao_list[sum3] == 1 else 1
196 up_change_yao_list = change_yao_list[0:3]
197 up_change_gua = yao_to_gua(up_change_yao_list)
198 down_change_yao_list =change_yao_list[3:5]
199 down_change_gua = yao_to_gua(down_change_yao_list)
200 
201 change_gua = yao_to_gua(change_yao_list)
202 print_gua(change_gua)
203 change_gua_code = str(name[up_change_gua]) + str(name[down_change_gua])
204 change_gua_data = gua_map[change_gua_code]
205 print("变卦为:", change_gua_data['name'])
206 print("辞:", change_gua_data['words'],"译:",change_gua_data['white_words'])
207 print("象:", change_gua_data['picture'],"译:",change_gua_data['white_picture'])
208 print("预示",change_gua_data['c'])

3,在华为云服务器上运行代码

先安装python3文件:

 

 再讲文件上传至华为云服务器并运行:

 

 

五,实验中的问题:

1,从vscode转到华为云服务器上的过程中,data数据库无法和正常引用

解决:是引用的路径出错了,在vscode上用的是绝对路径,只要修改为相对路径即可

2,在占卜的卦辞中,会出现许许多多“君子”和“帝王”之类的意向,有点模糊难懂

解决:在data数据库中添加上自己查找的对普通人更有意义的卦辞

3,在修改原代码的过程中,常常会出现sum1与sum2不能被结尾打印部分识别的情况

解决:将产生sum1,sum2的函数都添加格式转换,将sum1,sum2转为整形

4,关于可视化:

起初原本是想用Tkinter做一个可视化的界面,但是我感觉不用额外的库能做出一些图形也十分的有趣,于是便没有采取那种做法,实现了简陋的“可视化”。

六,一些感想:

在实验过程中,确确实实感觉到了python的强大功能,同时也了解了自己的许许多多的不足。在我编写这一程序的过程中,20214325冀彦丞同学给了我莫大的支持,在这里我要感谢冀彦丞同学给予的指导。同时在这一学期的课上,王志强老师的授课热情也给了我极大的鼓舞,那些贴近生活的实例也很通俗易懂,我也要感谢王老师的教导。

posted @ 2022-05-29 13:56  脑子不好使先生  阅读(212)  评论(0编辑  收藏  举报