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冀彥丞同學給了我莫大的支援,在這裡我要感謝冀彥丞同學給予的指導。同時在這一學期的課上,王志強老師的授課熱情也給了我極大的鼓舞,那些貼近生活的例項也很通俗易懂,我也要感謝王老師的教導。