python阴阳师_如何用Python找到阴阳师妖怪屋的最佳探索队伍!强不强?
程序由來
最初想要寫這個小程序是因為,9月份那段時間我在玩妖怪屋。
因為剛開始抽卡,要啥啥沒有,所以探索隊伍也只是放了幾個自己記得有關聯(lián)的式神。
在網(wǎng)上有找到完整版的羈絆,但是怎么根據(jù)羈絆找到最佳的式神組合就成問題了。
當時我是通過手動算出來的結果,后來想到自己剛剛把python基礎啃完,也許可以試試用python來實現(xiàn)。
萬一后續(xù)改進的不錯能放上簡歷呢?
于是就有了這個程序。
整體思路
獲取使用者的式神錄
找到可以組成的羈絆
組合上述的羈絆
根據(jù)條件(8人,buff最大)找到最優(yōu)解
當時的想法:
一是羈絆是游戲中設定好的??梢酝ㄟ^先對各個羈絆的屬性進行定義,然后確認是否有羈絆中的式神存在于使用者式神錄中。
二是把各個羈絆組合的人數(shù)和增強buff算出來,然后排除不符合要求的情況。
編寫過程
先按照思路把整個程序寫出來,然后不斷的把一些內容改成函數(shù),把一些輸出不規(guī)范會導致的錯誤一一解決,接著閱讀整個程序的代碼,并對注釋進行改寫。
今天比較倉促,詳細的過程不知道后續(xù)有沒有機會補上,請讓我先放上完整代碼。
寫程序的過程中,我還在論壇里找了很多方法用在程序里,以保證程序是按照我的思路實現(xiàn)的。
包括通過集合去重,確認A是否屬于B,通過combinations對羈絆進行組合,以及通過re替換非中文字等等。
在此謝謝各位大佬的奉獻。
完整代碼
onmyoji(主程序)
"""
本項目是基于陰陽師妖怪屋的探索玩法編寫的。
目的是讓使用者能夠快速根據(jù)擁有的式神,組合出能讓增強buff最大化的8人組合。
探索玩法可派遣8位式神進行不斷探索。
不同式神可組成不同羈絆,羈絆在游戲中是固定的,式神組成羈絆可獲得增強buff,即額外探索獎勵。
本項目使用方法,只需規(guī)范輸入內容,并進行分隔,在完成輸入后以N或n結尾即可。
該項目結果只會出現(xiàn)第一個增強buff最大的組合,請知悉。
本項目計算過程:
1.獲取使用者的式神錄,進行處理后獲得單個式神的集合,保存至使用者變量type中。
2.根據(jù)這些式神從式神字典中找到可以組成的羈絆,保存其在字典中位置至使用者變量loc中。
3.將不同羈絆可組成的組合(后續(xù)稱為羈絆組合),占用人數(shù),增強buff放在一個字典中,保存至使用者變量total中。
4.對total中每個可組成羈絆組合,進行對比,占用人數(shù)合規(guī)(8位),且增強等級最大的組合保存至best中,并輸出。
"""
import function as fu
import dictionary as dic
import shiki as sk
#將我擁有的式神設為一個空的集合,方便后續(xù)添加式神
shiki_you = sk.Shiki(set(()))
#建立一個集合包括所有羈絆組合的式神
"""
白狼,茨木童子,大天狗,獨眼小僧,鬼使白,鬼使黑,蝴蝶精,九命貓,酒吞童子,傀儡師,
鐮鼬,孟婆,犬神,山兔,少羽大天狗,桃花妖,天邪鬼赤,天邪鬼黃,天邪鬼綠,天邪鬼青,鐵鼠,
巫蠱師,雪女,閻魔,妖刀姬,櫻花妖,螢草
"""
shiki_all = dic.shiki_all
#通過使用者錄入,獲取使用者的式神錄
while True:
#獲取使用者輸入的式神
#輸入中如果有漢字或N,n以外的字符,都replace為,號,并進行分隔。當輸入為N或n時,結束輸入。
shiki = input('Would you like to tell me your shiki name? please use \',\' to split.')
#對輸入內容進行處理,判斷input的內容是不是為N或n,即對方有否完成輸入過程。N為完成輸入。
if fu.check_go_on(shiki):
break
#對輸入內容進行處理,保證輸入內容合規(guī)后,更新至使用者的式神錄
fu.input_shiki(shiki, shiki_you)
#通過計算獲得可組成的最大增強buff的羈絆組合
#可以更改組隊人數(shù)設定限制,即將fu.get_max_buff(shiki_you)的默認參數(shù)n進行改動
fu.get_max_buff(shiki_you)
shiki
from itertools import combinations
class Shiki():
#type是指擁有的式神,loc是指羈絆在diction2的位置,包括0,
#comb是指各羈絆能組合成的組合,使用loc來表示羈絆所處位置
#total是集合了羈絆組合,組合占用人數(shù)和增強buff的字典
def __init__(self,type):
self.type = type
self.loc = []
self.total = {}
self.best_max = 0
self.best = {}
#獲取所有羈絆可以組成的組合,請注意當i=1時,羈絆可組成的組合只有一個
#而元組中只包含一個元素時,需要在元素后面添加逗號,否則括號會被當作運算符使用
def combine(self):
'''根據(jù)n獲得列表中的所有可能組合(n個元素為一組)'''
temp_list2 = []
end_list = []
for i in range(len(self.loc)):
for c in combinations(self.loc,i):
temp_list2.append(c)
#print(i,c,len(c))
temp_list2.append(tuple(self.loc))
#temp_list2 = sorted(list(set(temp_list2)))
return temp_list2
dictionary
(不得不承認這個diction。。真的有點丑)
#diction是一個列表,把每一個羈絆的各屬性都單獨放在一個字典中
import shiki as sk
#將所有羈絆組合的屬性放入一個字典中,并將所有羈絆組合的字典放入一個列表中
"""
羈絆組合字典屬性說明
namet:羈絆簡稱
tram_per:羈絆所包含的式神
person:羈絆占用人數(shù)
level:羈絆獲得的buff值
name:羈絆名稱
"""
#diction是一個列表,把各屬性key和各羈絆的對應屬性值value放在一個字典中,其中value屬性值也是一個列表
diction = [
{'namet':['tram1','tram2','tram3','tram4','tram5','tram6','tram7''tram8',
'tram9','tram10','tram11','tram12','tram13','tram14','tram15','tram16']},
{'tram_per':[{'櫻花妖','桃花妖'},{'酒吞童子','茨木童子'},{'山兔','孟婆'},{'鬼使黑','鬼使白'},
{'鐮鼬','鐵鼠'},{'少羽大天狗','大天狗'},{'鬼使黑','鬼使白','閻魔'},{'白狼','妖刀姬','螢草'},
{'白狼','妖刀姬'},{'傀儡師','閻魔'},{'獨眼小僧','蝴蝶精'},
{'天邪鬼黃','天邪鬼赤','天邪鬼青','天邪鬼綠'},{'大天狗','雪女'},{'螢草','白狼'},{'九命貓','犬神'},
{'蝴蝶精','巫蠱師'}]},
{'person':[2,2,2,2,2,2,3,3,2,2,2,4,2,2,2,2]},
{'level':[2,4,2,2,2,4,3,4,3,3,2,2,3,2,2,2]},
{'name':['whereisspring','drinkthewine','runningfrogandpan','whiteandblack','repeathappily','fromthesky',
'bosspleasesay','girlshouldbestrong','girlgroup','onedaytravelatthree','Icanchant','F4','FORjustice',
'myidol','catordog','monstercatchingbutterfly']}
]
shiki_all = sk.Shiki({'白狼','茨木童子','大天狗','獨眼小僧','鬼使白','鬼使黑','蝴蝶精','九命貓','酒吞童子','傀儡師',
'鐮鼬','孟婆','犬神','山兔','少羽大天狗','桃花妖','天邪鬼赤','天邪鬼黃','天邪鬼綠','天邪鬼青',
'鐵鼠','巫蠱師','雪女','閻魔','妖刀姬','櫻花妖','螢草'})
function
import dictionary as dic
import re
#判斷input的內容是不是為N或n,即對方不愿意繼續(xù)分享其擁有的式神名稱
def check_go_on(shiki):
Out = False
if shiki == 'N' or shiki == 'n':
Out = True
return Out
#對輸入內容進行處理,確認其符合要求
def check_list(shiki):
#將輸入內容中所有非中文部分都替換為','
mark = re.compile(r'[^\u4e00-\u9fa5]')
a = re.sub(mark, ',', shiki)
#根據(jù)分隔符',',對輸入內容進行分隔去重
shiki = list(set(a.split(',')))
#對輸入內容的每一個文字內容進行判定,確認其是否為式神錄中的式神名稱。
for a in shiki.copy():
#如是,繼續(xù)判斷下一個;
if {a}.issubset(dic.shiki_all.type):
continue
#如不是,刪掉該部分。
else:
shiki.remove(a)
#返回處理過的輸入內容,當前內容應不包含任何不存在于式神錄的文字及符號
return shiki
#
def input_shiki(shiki,shiki_you):
#將輸入的式神列表改為集合,方便進行判定和去重
shiki = {i for i in list(check_list(shiki))}
#將輸入的式神列表放入使用者的式神錄中
shiki_you.type.update(shiki)
return
#獲取使用者式神可組成的所有羈絆,并保存羈絆在字典中的位置至變量loc
def get_dic(shiki_you):
#確認使用者式神錄是否能夠組成diction中的羈絆
for i in dic.diction[1]['tram_per']:
#如果使用者式神錄存在可組成羈絆的式神,保存該羈絆在字典中的指針
#因為該指針可便于獲取該羈絆在diction其他字典中的對應值
if i.issubset(shiki_you.type):
shiki_you.loc.append(dic.diction[1]['tram_per'].index(i))
return shiki_you
#記錄羈絆組合的各項屬性值
def comp_buff_assign(shiki_you,type_shiki,buff,memberc):
shiki_you.total['pers'].append(len(type_shiki))
shiki_you.total['team'].append(type_shiki)
shiki_you.total['level'].append(buff)
shiki_you.total['usecomb'].append(memberc)
return
#對每個羈絆組合的占用人數(shù),增強buff等相關信息都進行獲取和錄入
def comp_buff(shiki_you,n):
#對于每一個羈絆組合都進行計算
for i in shiki_you.total['comb']:
buff = 0
type_shiki = set(())
memberc = []
#當羈絆的組合方式為空,可對各項屬性值進行初始定義
if len(i) == 0:
comp_buff_assign(shiki_you, type_shiki, buff, memberc)
continue
#每個羈絆組合進行x(擁有羈絆數(shù)量)次的重復,以計算每種羈絆組合的屬性
for x in range(len(i)):
# y用于獲取羈絆組合在diction中的所處位置
y = int(i[x])
# type_shiki用于獲取羈絆組合要占用的人數(shù),并自動去重
# memberc是獲取使用到的羈絆,buff為增強buff的數(shù)值
type_shiki.update(dic.diction[1]['tram_per'][y])
memberc.append(dic.diction[1]['tram_per'][y])
buff += dic.diction[3]['level'][y]
#記錄羈絆組合占用人數(shù)不大于設定的羈絆組合
if len(type_shiki) <= n:
comp_buff_assign(shiki_you, type_shiki, buff, memberc)
return shiki_you
#輸出可組成的增強buff最大的羈絆組合信息
def print_best(shiki_you,best):
print('\n根據(jù)您現(xiàn)有的式神,當前可獲得最大增強buff的羈絆組合信息如下:')
print('最大Buff值:', shiki_you.best_max)
print('組合占用人數(shù):', len(shiki_you.best))
print('使用到的羈絆:', shiki_you.total['usecomb'][best])
print('使用到的式神:',shiki_you.best)
print('\nBases on your shikis, we can provide below group details which can make you get maximum benefit:')
print('Buff Level:', shiki_you.best_max)
print('Number of Shiki:', len(shiki_you.best))
print('Combination Used:', shiki_you.total['usecomb'][best])
print('Shiki Used:',shiki_you.best)
# 對每個羈絆組合的增強buff進行比較,獲得buff最大值的羈絆組合,保存在使用者的變量best,best_max中
def compare_buff(shiki_you):
best=0
# 開始對每組的數(shù)據(jù)進行比較,先設定一個保存最大值的變量
shiki_you.best_max = shiki_you.total['level'][0]
# shiki_you.total = {羈絆組合'comb':shiki_you.comb,
# 占用人數(shù)'pers':[],'team':[],增強等級'level':[],'usecomb':[]}
for i in range(len(shiki_you.total['level'])):
if shiki_you.best_max < shiki_you.total['level'][i]:
shiki_you.best_max = shiki_you.total['level'][i]
shiki_you.best = shiki_you.total['team'][i]
best = i
print_best(shiki_you,best)
return shiki_you
#通過計算獲得可組成的最大增強buff的羈絆組合
def get_max_buff(shiki_you,n=8):
# 獲取使用者式神可組成的所有羈絆,并保存羈絆在字典中的位置至變量loc
get_dic(shiki_you)
# 將可組成的所有羈絆進行自由組合,并定義部分初始變量并保存相關信息在total字典中。
"""
comb保存自由組合成的羈絆組合(在字典中的位置)
pers保存每種羈絆組合的占用人數(shù)
team保存每種羈絆組合所使用到的式神
level保存每種羈絆組合可獲得的buff增強值
usecomb保存每種羈絆組合所使用到的羈絆
"""
shiki_you.total = {'comb': shiki_you.combine(), 'pers': [], 'team': [], 'level': [], 'usecomb': []}
# 對每個羈絆組合的占用人數(shù),增強buff等相關信息都進行獲取和錄入
comp_buff(shiki_you,n)
# 對每個羈絆組合的增強buff進行比較,獲得buff最大值的羈絆組合,輸出并保存在使用者的變量best,best_max中
compare_buff(shiki_you)
這個程序真的是改了又改,雖然不夠復雜,沒有好看的界面,甚至包含廢話。但是說不定下一個程序用途就更加廣泛了呢!
如果各位有改進方法或者好的教程,請拋給我!謝謝!
PS:如有需要Python學習資料的小伙伴可以加點擊下方鏈接自行獲取
總結
以上是生活随笔為你收集整理的python阴阳师_如何用Python找到阴阳师妖怪屋的最佳探索队伍!强不强?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IDEA——Maven的配置与使用
- 下一篇: JDBC——概述与JDBC的使用