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冀彦丞同学给了我莫大的支持,在这里我要感谢冀彦丞同学给予的指导。同时在这一学期的课上,王志强老师的授课热情也给了我极大的鼓舞,那些贴近生活的实例也很通俗易懂,我也要感谢王老师的教导。