阴阳师妖怪屋的最佳探索队伍
程序由来整体思路编写过程完整代码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:
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')
if fu
.check_go_on
(kami
):
break
fu
.input_kami
(kami
, kami_you
)
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():
def __init__(self
,type):
self
.type = type
self
.loc
= []
self
.total
= {}
self
.best_max
= 0
self
.best
= {}
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
)
temp_list2
.append
(tuple(self
.loc
))
return temp_list2
dictionary
(不得不承认这个diction。。真的有点丑)
import kami
as km
"""
羁绊组合字典属性说明
namet:羁绊简称
tram_per:羁绊所包含的式神
person:羁绊占用人数
level:羁绊获得的buff值
name:羁绊名称
"""
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
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
def get_dic(kami_you
):
for i
in dic
.diction
[1]['tram_per']:
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
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
for x
in range(len(i
)):
y
= int(i
[x
])
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')
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
()
def compare_buff(kami_you
):
best
=0
kami_you
.best_max
= kami_you
.total
['level'][0]
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
def get_max_buff(kami_you
,n
=8):
get_dic
(kami_you
)
"""
comb保存自由组合成的羁绊组合(在字典中的位置)
pers保存每种羁绊组合的占用人数
team保存每种羁绊组合所使用到的式神
level保存每种羁绊组合可获得的buff增强值
usecomb保存每种羁绊组合所使用到的羁绊
"""
kami_you
.total
= {'comb': kami_you
.combine
(), 'pers': [], 'team': [], 'level': [], 'usecomb': []}
comp_buff
(kami_you
,n
)
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文件删除掉,不然即使重新执行了语句,出现的还是前一次的文件,并不会更新。
最后结语
这个程序真的是改了又改,虽然不够复杂,没有好看的界面,甚至包含废话。但是说不定下一个程序用途就更加广泛了呢!
如果各位有改进方法或者好的教程,请抛给我!谢谢!