阴阳师妖怪屋的最佳探索队伍
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)