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

2020-10-27 更新

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

希望有巨大提升。

程序由来

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

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

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

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

于是就有了这个程序。

整体思路

  1. 获取使用者的式神录
  2. 找到可以组成的羁绊
  3. 组合上述的羁绊
  4. 根据条件(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)
        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值