1. 程式人生 > 其它 >20214318《Python程式設計》實驗四 Python綜合實踐實驗報告

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