Python學(xué)習(xí)報(bào)告:原神模擬抽卡系統(tǒng)2.0
命苦的地信人啊
文章一直沒空更新,說好7月5號(hào)發(fā)的文那是一拖再拖
算了,姑且把我的實(shí)驗(yàn)報(bào)告放上來充專欄吧(不是)

摘要:
原神作為一款由上海米哈游網(wǎng)絡(luò)科技股份有限公司開發(fā)的二次元游戲,在社會(huì)上具有相當(dāng)?shù)闹?。其中涉及到的“抽卡”的角色獲取方式,涉及到了數(shù)學(xué)概率與計(jì)算機(jī)這兩個(gè)領(lǐng)域。本系統(tǒng)以Python中的“隨即生成數(shù)”模塊為起點(diǎn),利用程序模擬在游戲“原神”中的抽卡活動(dòng),具有一定的社會(huì)娛樂價(jià)值。
抽卡解讀:
原神的抽卡具有大小保底機(jī)制,90抽為一個(gè)保底,保底必出金,但是不能確定是否為當(dāng)期up五星角色。若小保底歪了,則下一個(gè)90抽為一個(gè)大保底,必定出當(dāng)期5星up角色。每十抽必定出一個(gè)四星。同時(shí),在抽卡過程中也會(huì)掉落四星的武器以及角色,并且會(huì)返還一定的星輝用于兌換抽卡資源。
原神的抽卡基礎(chǔ)概率為:當(dāng)期up金0.3%,其他金0.3%,四星武器5.1%,四星角色2.55%。
當(dāng)期滿命角色最多需要抽出7個(gè)當(dāng)期up金。
系統(tǒng)假設(shè)情形:
一個(gè)原神賬號(hào),全部四星角色與五星常駐角色滿命,無當(dāng)期up五星角色,當(dāng)期up無新的四星角色。
使用計(jì)算機(jī)語言:
python
程序原理:
Python中有一個(gè)插件,即隨機(jī)數(shù)生成器,其可以在一個(gè)范圍內(nèi)隨機(jī)生成任意整數(shù),且每個(gè)數(shù)的生成概率都相等。在這種情況下,我們就可以利用其隨機(jī)性來構(gòu)成本系統(tǒng)的基礎(chǔ)——即一個(gè)隨機(jī)事件發(fā)生的概率。在本系統(tǒng)中,我利用限定幾個(gè)生成的隨機(jī)數(shù)的范圍,作出抽卡時(shí)的基礎(chǔ)概率。
同時(shí),由于原神抽卡出貨的各個(gè)情況透明且具有一定條件,可以利用條件控制語句將其區(qū)分,分別進(jìn)行運(yùn)算。
鑒于抽卡本身具有一定的“循環(huán)性”,可利用循環(huán)語句不斷進(jìn)行“抽卡活動(dòng)”。
程序源代碼(含注釋):
count=0#記錄抽數(shù)
mid_z=0#記錄紫保底
mid_j=0#記錄金保底
XH=0#記錄星輝總數(shù)
weapen=0#記錄四星武器總數(shù)
wai=0#記錄歪了幾次
chu=0#記錄出了幾個(gè)當(dāng)期五星角色
jilu1=0#記錄指示是大保底還是小保底
jilu2=0#記錄是否出紫
d=input("請(qǐng)輸入你的抽數(shù)。")
c=int(d)
?
def chouka_0_delete():#排除沒粉球
????if c == 0:
????????print("快去肝地圖吧!")
????????exit()
def chu5_luoji():
????global jilu1,jilu2,chu,wai,mid_z,mid_j,XH,count
????import random
????if jilu1==0:#小保底
????????t=random.randint(1,2)#判斷小保底歪不歪
????????if t==1:#小保底不歪
????????????chu=chu+1
????????????mid_z=mid_z+1
????????????mid_j=0
????????else:#小保底歪了
????????????wai=wai+1
????????????XH=XH+25
????????????jilu1=1
????????????mid_z=mid_z+1
????????????mid_j=0
????elif jilu1==1:#大保底
????????????jilu1=0
????????????chu=chu+1
????????????mid_z=mid_z+1
????????????mid_j=0
?
def chu4_luoji():
????import random
????global XH,jilu1,jilu2,chu,wai,mid_z,mid_j,weapen
????f = random.randint(1, 3)
????if f == 1:
????????XH = XH + 5
????????jilu2 = 0
????????mid_j = mid_j + 1
????????mid_z = 0
????else:
????????weapen = weapen + 1
????????XH = XH + 2
????????jilu2 = 0
????????mid_j = mid_j + 1
????????mid_z = 0
?
def chouka():#抽卡系統(tǒng)
????global count,mid_z,mid_j,jilu2
????import random
????r = random.randint(1, 2000) ?# 設(shè)置隨機(jī)數(shù)
????if 1 <= r <= 12: ?# 概率事件發(fā)生:出金
????????chu5_luoji()
????if 13 <= r <= 165: ?# 出紫武器
????????chu4_luoji()
????if 166 <= r <= 2000: ?# 概率事件發(fā)生,出藍(lán)
????????mid_z = mid_z + 1
????????mid_j = mid_j + 1
????????jilu2 = 1
?
chouka_0_delete()
?
while count<c:
????if mid_j%90==89:
????????chu5_luoji()
????????count=count+1
????elif mid_z%10==9:
????????chu4_luoji()
????????count=count+1
????elif mid_z%10!=9 and mid_j%90!=89:
????????chouka()
????????count=count+1
????if chu == 7:
????????break
?
q = XH / 5
p = int(q)
m = c-count
print(f"你花了{(lán)count}抽,還剩{m}個(gè)糾纏之緣。")
print(f"剩余{XH}星輝,可兌換{p}個(gè)糾纏之緣。")
print(f"獲得了{(lán)weapen}把四星武器。")
print(f"歪了{(lán)wai}次。")
print(f"出了{(lán)chu}個(gè)當(dāng)期up五星角色。")
?

?
當(dāng)前程序存在問題:
1、沒有正確反應(yīng)四星武器及角色的保底機(jī)制。原神中出四星角色的保底機(jī)制比本系統(tǒng)模擬的更加復(fù)雜,其多個(gè)保底互相糾纏,難以分離并加以演示。
2、系統(tǒng)缺少與外部的交互,假想情況過于理想。本系統(tǒng)無法與米游社、原神等軟件交互,缺少獲取真實(shí)卡池、倉庫的渠道。僅可用于演示、娛樂,暫時(shí)缺少大規(guī)模推廣的可行性。
3、程序涉及到了巨量的指示器(用于指示當(dāng)前卡池狀態(tài),例如有沒有歪、有沒有保底),整個(gè)程序過于臃腫繁瑣。