如何用Python找到阴阳师妖怪屋的最佳探索队伍

it2025-12-25  6

阴阳师妖怪屋的最佳探索队伍

程序由来整体思路编写过程完整代码onmyoji(主程序)kamidictionaryfunction 打包方法最后结语

2020-10-27 更新

更新命名 更新一下式神的翻译,完整翻译是shikikami。当时图方便直接用的shiki,现在改成kami,还是认为翻译成神会比较好一点。 (为什么不直接用shikikami?)因为命名长 ,请体谅。增加循环 为了避免填错式神后需要重新启动,我把程序又加了一道循环,改了一些输出时候的格式。将程序打包 为了方(zhuang)便(bi),我又把程序打包了一下,虽然我还是没能成功改掉图标(气馁) 。

希望有巨大提升。

程序由来

最初想要写这个小程序是因为,9月份那段时间我在玩妖怪屋。

因为刚开始抽卡,要啥啥没有,所以探索队伍也只是放了几个自己记得有关联的式神。

在网上有找到完整版的羁绊,但是怎么根据羁绊找到最佳的式神组合就成问题了。

当时我是通过手动算出来的结果,后来想到自己刚刚把python基础啃完,也许可以试试用python来实现。 万一后续改进的不错能放上简历呢?

于是就有了这个程序。

整体思路

获取使用者的式神录找到可以组成的羁绊组合上述的羁绊根据条件(8人,buff最大)找到最优解

当时的想法:

一是羁绊是游戏中设定好的。可以通过先对各个羁绊的属性进行定义,然后确认是否有羁绊中的式神存在于使用者式神录中。

二是把各个羁绊组合的人数和增强buff算出来,然后排除不符合要求的情况。

编写过程

先按照思路把整个程序写出来,然后不断的把一些内容改成函数,把一些输出不规范会导致的错误一一解决,接着阅读整个程序的代码,并对注释进行改写。

今天比较仓促,详细的过程不知道后续有没有机会补上,请让我先放上完整代码。

写程序的过程中,我还在论坛里找了很多方法用在程序里,以保证程序是按照我的思路实现的。

包括通过集合去重,确认A是否属于B,通过combinations对羁绊进行组合,以及通过re替换非中文字等等。

在此谢谢各位大佬的奉献。

完整代码

onmyoji(主程序)

""" 本项目是基于阴阳师妖怪屋的探索玩法编写的。 目的是让使用者能够快速根据拥有的式神,组合出能让增强buff最大化的8人组合。 探索玩法可派遣8位式神进行不断探索。 不同式神可组成不同羁绊,羁绊在游戏中是固定的,式神组成羁绊可获得增强buff,即额外探索奖励。 本项目使用方法,只需规范输入内容,并进行分隔,在完成输入后以N或n结尾即可。 该项目结果只会出现第一个增强buff最大的组合,请知悉。 本项目计算过程: 1.获取使用者的式神录,进行处理后获得单个式神的集合,保存至使用者变量type中。 2.根据这些式神从式神字典中找到可以组成的羁绊,保存其在字典中位置至使用者变量loc中。 3.将不同羁绊可组成的组合(后续称为羁绊组合),占用人数,增强buff放在一个字典中,保存至使用者变量total中。 4.对total中每个可组成羁绊组合,进行对比,占用人数合规(8位),且增强等级最大的组合保存至best中,并输出。 """ import function as fu import dictionary as dic import kami as km #建立一个集合包括所有羁绊组合的式神 """ 白狼,萤草,妖刀姬,少羽大天狗,大天狗,雪女,独眼小僧,蝴蝶精,巫蛊师, 鬼使白,鬼使黑,阎魔,傀儡师,镰鼬,铁鼠,九命猫,犬神,孟婆,山兔, 桃花妖,樱花妖,天邪鬼赤,天邪鬼黄,天邪鬼绿,天邪鬼青,茨木童子,酒吞童子, """ kami_all = dic.kami_all #将整个输入输出过程进行循环,以防使用者输入错误后只能重新启动程序 while True: #美化格式 fu.print_split() # 通过使用者录入,获取使用者的式神录 print('There is a list of kamis for you to fill in.\n' '\t白狼,萤草,妖刀姬,少羽大天狗,大天狗,雪女,独眼小僧,蝴蝶精,巫蛊师,\n' '\t鬼使白,鬼使黑,阎魔,傀儡师,镰鼬,铁鼠,九命猫,犬神,孟婆,山兔,\n' '\t桃花妖,樱花妖,天邪鬼赤,天邪鬼黄,天邪鬼绿,天邪鬼青,茨木童子,酒吞童子\n') # 将我拥有的式神设为一个空的集合,方便后续添加式神 kami_you = km.Kami(set(())) while True: #获取使用者输入的式神 #输入中如果有汉字或N,n以外的字符,都replace为,号,并进行分隔。当输入为N或n时,结束输入。 kami = input('Would you like to share the name of the kamis you have? \n' '\tIf yes, please type and use "," to split your kamis.\n' '\tIf no, please type "N"/"n".\n') #对输入内容进行处理,判断input的内容是不是为N或n,即对方有否完成输入过程。N为完成输入。 if fu.check_go_on(kami): break #对输入内容进行处理,保证输入内容合规后,更新至使用者的式神录 fu.input_kami(kami, kami_you) #通过计算获得可组成的最大增强buff的羁绊组合 #可以更改组队人数设定限制,即将fu.get_max_buff(kami_you)的默认参数n进行改动 fu.get_max_buff(kami_you) stop = input('Would you want to do it again? Maybe you type wrong kamis? \n' 'If yes, please type "Y"/"y".\n' 'If no, please type "N"/"n".\n') if fu.check_go_on(stop): break

kami

from itertools import combinations class Kami(): #type是指拥有的式神,loc是指羁绊在diction2的位置,包括0, #comb是指各羁绊能组合成的组合,使用loc来表示羁绊所处位置 #total是集合了羁绊组合,组合占用人数和增强buff的字典 def __init__(self,type): self.type = type self.loc = [] self.total = {} self.best_max = 0 self.best = {} #获取所有羁绊可以组成的组合,请注意当i=1时,羁绊可组成的组合只有一个 #而元组中只包含一个元素时,需要在元素后面添加逗号,否则括号会被当作运算符使用 def combine(self): '''根据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 kami as km #将所有羁绊组合的属性放入一个字典中,并将所有羁绊组合的字典放入一个列表中 """ 羁绊组合字典属性说明 namet:羁绊简称 tram_per:羁绊所包含的式神 person:羁绊占用人数 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']} ] kami_all = km.Kami({'白狼','茨木童子','大天狗','独眼小僧','鬼使白','鬼使黑','蝴蝶精','九命猫','酒吞童子','傀儡师', '镰鼬','孟婆','犬神','山兔','少羽大天狗','桃花妖','天邪鬼赤','天邪鬼黄','天邪鬼绿','天邪鬼青', '铁鼠','巫蛊师','雪女','阎魔','妖刀姬','樱花妖','萤草'})

function

import dictionary as dic import re #判断input的内容是不是为N或n,即对方不愿意继续分享其拥有的式神名称 def check_go_on(kami): Out = False if kami == 'N' or kami == 'n': Out = True return Out #对输入内容进行处理,确认其符合要求 def check_list(kami): #将输入内容中所有非中文部分都替换为',' mark = re.compile(r'[^\u4e00-\u9fa5]') a = re.sub(mark, ',', kami) #根据分隔符',',对输入内容进行分隔去重 kami = list(set(a.split(','))) #对输入内容的每一个文字内容进行判定,确认其是否为式神录中的式神名称。 for a in kami.copy(): #如是,继续判断下一个; if {a}.issubset(dic.kami_all.type): continue #如不是,删掉该部分。 else: kami.remove(a) #返回处理过的输入内容,当前内容应不包含任何不存在于式神录的文字及符号 return kami #在式神录中放入式神 def input_kami(kami,kami_you): #将输入的式神列表改为集合,方便进行判定和去重 kami = {i for i in list(check_list(kami))} #将输入的式神列表放入使用者的式神录中 kami_you.type.update(kami) return #获取使用者式神可组成的所有羁绊,并保存羁绊在字典中的位置至变量loc def get_dic(kami_you): #确认使用者式神录是否能够组成diction中的羁绊 for i in dic.diction[1]['tram_per']: #如果使用者式神录存在可组成羁绊的式神,保存该羁绊在字典中的指针 #因为该指针可便于获取该羁绊在diction其他字典中的对应值 if i.issubset(kami_you.type): kami_you.loc.append(dic.diction[1]['tram_per'].index(i)) return kami_you #记录羁绊组合的各项属性值 def comp_buff_assign(kami_you,type_kami,buff,memberc): kami_you.total['pers'].append(len(type_kami)) kami_you.total['team'].append(type_kami) kami_you.total['level'].append(buff) kami_you.total['usecomb'].append(memberc) return #对每个羁绊组合的占用人数,增强buff等相关信息都进行获取和录入 def comp_buff(kami_you,n): #对于每一个羁绊组合都进行计算 for i in kami_you.total['comb']: buff = 0 type_kami = set(()) memberc = [] #当羁绊的组合方式为空,可对各项属性值进行初始定义 if len(i) == 0: comp_buff_assign(kami_you, type_kami, buff, memberc) continue #每个羁绊组合进行x(拥有羁绊数量)次的重复,以计算每种羁绊组合的属性 for x in range(len(i)): # y用于获取羁绊组合在diction中的所处位置 y = int(i[x]) # type_kami用于获取羁绊组合要占用的人数,并自动去重 # memberc是获取使用到的羁绊,buff为增强buff的数值 type_kami.update(dic.diction[1]['tram_per'][y]) memberc.append(dic.diction[1]['tram_per'][y]) buff += dic.diction[3]['level'][y] #记录羁绊组合占用人数不大于设定的羁绊组合 if len(type_kami) <= n: comp_buff_assign(kami_you, type_kami, buff, memberc) return kami_you #美化格式 def print_split(): print('\n=======================================\n') #美化格式 def print_star(): print('\n\t* * * * * * R E S U L T * * * * * * *\n') #输出可组成的增强buff最大的羁绊组合信息 def print_best(kami_you,best): #美化格式 print_star() print('\tBases on your kamis, we can provide below group details which can make you get maximum benefit:') print('\tBuff Level:', kami_you.best_max) print('\tNumber of kami:', len(kami_you.best)) print('\tCombination Used:', kami_you.total['usecomb'][best]) print('\tkami Used:',kami_you.best,'\n') print('\t根据您现有的式神,当前可获得最大增强buff的羁绊组合信息如下:') print('\t最大Buff值:', kami_you.best_max) print('\t组合占用人数:', len(kami_you.best)) print('\t使用到的羁绊:', kami_you.total['usecomb'][best]) print('\t使用到的式神:',kami_you.best) print_star() # 对每个羁绊组合的增强buff进行比较,获得buff最大值的羁绊组合,保存在使用者的变量best,best_max中 def compare_buff(kami_you): best=0 # 开始对每组的数据进行比较,先设定一个保存最大值的变量 kami_you.best_max = kami_you.total['level'][0] # kami_you.total = {羁绊组合'comb':kami_you.comb, # 占用人数'pers':[],'team':[],增强等级'level':[],'usecomb':[]} for i in range(len(kami_you.total['level'])): if kami_you.best_max < kami_you.total['level'][i]: kami_you.best_max = kami_you.total['level'][i] kami_you.best = kami_you.total['team'][i] best = i print_best(kami_you,best) return kami_you #通过计算获得可组成的最大增强buff的羁绊组合 def get_max_buff(kami_you,n=8): # 获取使用者式神可组成的所有羁绊,并保存羁绊在字典中的位置至变量loc get_dic(kami_you) # 将可组成的所有羁绊进行自由组合,并定义部分初始变量并保存相关信息在total字典中。 """ comb保存自由组合成的羁绊组合(在字典中的位置) pers保存每种羁绊组合的占用人数 team保存每种羁绊组合所使用到的式神 level保存每种羁绊组合可获得的buff增强值 usecomb保存每种羁绊组合所使用到的羁绊 """ kami_you.total = {'comb': kami_you.combine(), 'pers': [], 'team': [], 'level': [], 'usecomb': []} # 对每个羁绊组合的占用人数,增强buff等相关信息都进行获取和录入 comp_buff(kami_you,n) # 对每个羁绊组合的增强buff进行比较,获得buff最大值的羁绊组合,输出并保存在使用者的变量best,best_max中 compare_buff(kami_you)

打包方法

下载pyinstaller,网上的教程很多。大概流程是先更新pip至最新版,再用pip下载pyinstaller。pyinstaller所在位置应当是script的文件夹里面。打包方式有两种,一是多文件放文件夹中打包,二是通过提交每个文件名进行打包。我方法一没弄懂,所以我用的第二个。 pyinstaller -F (主文件名).py -p (其余需要加载的文件1).py -p (需加载文件2).py最后会在script下出现两个文件夹,dist下就是打包成的exe文件。

Note: 如果想重新打包一遍,需要把dist里面的exe文件删除掉,不然即使重新执行了语句,出现的还是前一次的文件,并不会更新。

最后结语

这个程序真的是改了又改,虽然不够复杂,没有好看的界面,甚至包含废话。但是说不定下一个程序用途就更加广泛了呢!

如果各位有改进方法或者好的教程,请抛给我!谢谢!

最新回复(0)