[明日方舟] 最优招募解析器

By jerryxjr1220 at 2021-09-24 • 0人收藏 • 445人看过

玩过明日方舟塔防游戏的会知道游戏中有一个公开招募机制,随机给出5个标签,任选3个或以下的标签来匹配招募的3~5星角色。

为了避免无效选择同时更高几率获得高星角色,由此设计了一套解析程序,只需输入给定的5个随机标签,然后程序可以自动计算出最优(平均星级最高)的3个选择。

data = [
[6,'麦哲伦','远程位','辅助干员','支援','减速','输出','高级资深干员'],
[6,'安洁莉娜','远程位','辅助干员','支援','减速','输出','高级资深干员'],
[6,'塞雷娅','近战位','重装干员','防护','支援','治疗','高级资深干员'],
[6,'星熊','近战位','重装干员','防护','输出','高级资深干员'],
[6,'煌','近战位','近卫干员','输出','生存','高级资深干员'],
[6,'赫拉格','近战位','近卫干员','输出','生存','高级资深干员'],
[6,'斯卡蒂','近战位','近卫干员','输出','生存','高级资深干员'],
[6,'陈','近战位','近卫干员','爆发','输出','高级资深干员'],
[6,'银灰','近战位','近卫干员','输出','支援','高级资深干员'],
[6,'莫斯提马','远程位','术师干员','群攻','支援','控场','高级资深干员'],
[6,'艾雅法拉','远程位','术师干员','输出','削弱','高级资深干员'],
[6,'伊芙利特','远程位','术师干员','群攻','削弱','高级资深干员'],
[6,'夜莺','远程位','医疗干员','支援','治疗','高级资深干员'],
[6,'闪灵','远程位','医疗干员','支援','治疗','高级资深干员'],
[6,'黑','远程位','狙击干员','输出','高级资深干员'],
[6,'能天使','远程位','狙击干员','输出','高级资深干员'],
[6,'推进之王','近战位','先锋干员','费用回复','输出','高级资深干员'],
[5,'槐琥','近战位','特种干员','快速复活','削弱资深干员'],
[5,'食铁兽','近战位','特种干员','位移','减速','资深干员'],
[5,'崖心','近战位','特种干员','位移','输出','资深干员'],
[5,'狮蝎','近战位','特种干员','输出','生存','资深干员'],
[5,'红','近战位','特种干员','控场','快速复活','资深干员'],
[5,'格劳克斯','远程位','辅助干员','减速','控场','资深干员'],
[5,'空','远程位','辅助干员','支援','治疗','资深干员'],
[5,'梅尔','远程位','辅助干员','召唤','控场','资深干员'],
[5,'真理','远程位','辅助干员','减速','输出','资深干员'],
[5,'初雪','远程位','辅助干员','削弱','资深干员'],
[5,'可颂','近战位','重装干员','防护','位移','资深干员'],
[5,'火神','近战位','重装干员','防护','输出生存'],
[5,'临光','近战位','重装干员','防护','治疗','资深干员'],
[5,'雷蛇','近战位','重装干员','防护','输出','资深干员'],
[5,'布洛卡','近战位','近卫干员','群攻','生存','资深干员'],
[5,'星极','近战位','近卫干员','输出','防护','资深干员'],
[5,'诗怀雅','近战位','近卫干员','输出','支援','资深干员'],
[5,'暴行','近战位','近卫干员','群攻','爆发','资深干员'],
[5,'拉普兰德','近战位','近卫干员','输出','削弱','资深干员'],
[5,'因陀罗','近战位','近卫干员','输出','生存','资深干员'],
[5,'幽灵鲨','近战位','近卫干员','群攻','生存','资深干员'],
[5,'芙兰卡','近战位','近卫干员','输出','生存','资深干员'],
[5,'天火','远程位','术师干员','群攻','控场','资深干员'],
[5,'夜魔','远程位','术师干员','输出','治疗','减速'],
[5,'阿米娅','远程位','术师干员','输出','资深干员'],
[5,'赫默','远程位','医疗干员','治疗','资深干员'],
[5,'华法琳','远程位','医疗干员','支援','治疗','资深干员'],
[5,'灰喉','远程位','狙击干员','输出','资深干员'],
[5,'白面鸮','远程位','医疗干员','支援','治疗','资深干员'],
[5,'陨星','远程位','狙击干员','群攻','削弱','资深干员'],
[5,'送葬人','远程位','狙击干员','群攻','资深干员'],
[5,'守林人','远程位','狙击干员','输出','爆发','资深干员'],
[5,'白金','远程位','狙击干员','输出','资深干员'],
[5,'普罗旺斯','远程位','狙击干员','输出','资深干员'],
[5,'蓝毒','远程位','狙击干员','输出','资深干员'],
[5,'格拉尼','近战位','先锋干员','费用回复','防护','资深干员'],
[5,'苇草','近战位','先锋干员','费用回复','输出','资深干员'],
[5,'德克萨斯','近战位','先锋干员','费用回复','控场','资深干员'],
[5,'凛冬','近战位','先锋干员','费用回复','支援','资深干员'],
[4,'阿消','近战位','特种干员','位移'],
[4,'暗索','近战位','特种干员','位移'],
[4,'砾','近战位','特种干员','快速复活','防护'],
[4,'地灵','远程位','辅助干员','减速'],
[4,'深海色','远程位','辅助干员','召唤'],
[4,'角峰','近战位','重装干员','防护'],
[4,'古米','近战位','重装干员','防护','治疗'],
[4,'蛇屠箱','近战位','重装干员','防护'],
[4,'缠丸','近战位','近卫干员','输出','生存'],
[4,'霜叶','近战位','近卫干员','输出','减速'],
[4,'慕斯','近战位','近卫干员','输出'],
[4,'猎蜂','近战位','近卫干员','输出'],
[4,'艾丝黛尔','近战位','近卫干员','群攻','生存'],
[4,'杜宾','近战位','近卫干员','输出','支援'],
[4,'格雷伊','远程位','术师干员','群攻','减速'],
[4,'远山','远程位','术师干员','群攻'],
[4,'夜烟','远程位','术师干员','输出','削弱'],
[4,'清流','远程位','医疗干员','治疗','支援'],
[4,'苏苏洛','远程位','医疗干员','治疗'],
[4,'调香师','远程位','医疗干员','治疗'],
[4,'嘉维尔','远程位','医疗干员','治疗'],
[4,'末药','远程位','医疗干员','治疗'],
[4,'安比尔','远程位','狙击干员','输出','减速'],
[4,'红云','远程位','狙击干员','输出'],
[4,'杰西卡','远程位','狙击干员','输出','生存'],
[4,'白雪','远程位','狙击干员','群攻','减速'],
[4,'流星','远程位','狙击干员','输出','削弱'],
[4,'梅','远程位','狙击干员','输出','减速'],
[4,'桃金娘','近战位','先锋干员','费用回复','治疗'],
[4,'红豆','近战位','先锋干员','费用回复','输出'],
[4,'清道夫','近战位','先锋干员','费用回复','输出'],
[4,'讯使','近战位','先锋干员','费用回复','防护'],
[3,'梓兰','远程位','辅助干员','减速'],
[3,'斑点','近战位','重装干员','防护','治疗'],
[3,'卡缇','近战位','重装干员','防护'],
[3,'米格鲁','近战位','重装干员','防护'],
[3,'泡普卡','近战位','近卫干员','群攻','生存'],
[3,'月见夜','近战位','近卫干员','输出'],
[3,'玫兰莎','近战位','近卫干员','输出','生存'],
[3,'史都华德','远程位','术师干员','输出'],
[3,'炎熔','远程位','术师干员','群攻'],
[3,'安赛尔','远程位','医疗干员','治疗'],
[3,'芙蓉','远程位','医疗干员','治疗'],
[3,'空爆','远程位','狙击干员','群攻'],
[3,'安德切尔','远程位','狙击干员','输出'],
[3,'克洛丝','远程位','狙击干员','输出'],
[3,'翎羽','近战位','先锋干员','费用回复','输出'],
[3,'香草','近战位','先锋干员','费用回复'],
[3,'芬','近战位','先锋干员','费用回复']
]

# import pickle
# import io
# f = io.open("data.pkl","wb")
# pickle.dump(data, f)
# f.close()

from itertools import combinations as cb
def calc(data, choose, p=3):
chosen = cb(choose, p)
final_result = {}
for pair in chosen:
res = []
for eachdata in data:
flag = True
for ep in pair:
if ep not in str(eachdata):
flag = False
break
if flag:
res.append(eachdata)
final_result[pair] = res
return final_result

def judge(choose, data=data):
filtered = calc(data,choose,1)
filtered.update(calc(data,choose,2))
filtered.update(calc(data,choose,3))
result = []
for k,v in filtered.items():
if v:
score = sum([v[i][0] for i in range(len(v))])/len(v)
result.append([score, k, v])
result.sort(key=lambda x:x[0], reverse=True)
return result[:3]

程序调用:

for each in judge(['近卫','术师','近战','新手','生存'], data[17:]):
print(f'评分:{each[0]}')
print(f'选项:{each[1]}')
print(f'可能获得角色:')
for e in each[2]:
print(e)
print('-----------------------------')

输出:

评分:4.4
选项:('近战', '生存')
可能获得角色:
[5, '狮蝎', '近战位', '特种干员', '输出', '生存', '资深干员']
[5, '火神', '近战位', '重装干员', '防护', '输出生存']
[5, '布洛卡', '近战位', '近卫干员', '群攻', '生存', '资深干员']
[5, '因陀罗', '近战位', '近卫干员', '输出', '生存', '资深干员']
[5, '幽灵鲨', '近战位', '近卫干员', '群攻', '生存', '资深干员']
[5, '芙兰卡', '近战位', '近卫干员', '输出', '生存', '资深干员']
[4, '缠丸', '近战位', '近卫干员', '输出', '生存']
[4, '艾丝黛尔', '近战位', '近卫干员', '群攻', '生存']
[3, '泡普卡', '近战位', '近卫干员', '群攻', '生存']
[3, '玫兰莎', '近战位', '近卫干员', '输出', '生存']
-----------------------------
评分:4.363636363636363
选项:('生存',)
可能获得角色:
[5, '狮蝎', '近战位', '特种干员', '输出', '生存', '资深干员']
[5, '火神', '近战位', '重装干员', '防护', '输出生存']
[5, '布洛卡', '近战位', '近卫干员', '群攻', '生存', '资深干员']
[5, '因陀罗', '近战位', '近卫干员', '输出', '生存', '资深干员']
[5, '幽灵鲨', '近战位', '近卫干员', '群攻', '生存', '资深干员']
[5, '芙兰卡', '近战位', '近卫干员', '输出', '生存', '资深干员']
[4, '缠丸', '近战位', '近卫干员', '输出', '生存']
[4, '艾丝黛尔', '近战位', '近卫干员', '群攻', '生存']
[4, '杰西卡', '远程位', '狙击干员', '输出', '生存']
[3, '泡普卡', '近战位', '近卫干员', '群攻', '生存']
[3, '玫兰莎', '近战位', '近卫干员', '输出', '生存']
-----------------------------
评分:4.294117647058823
选项:('近卫',)
可能获得角色:
[5, '布洛卡', '近战位', '近卫干员', '群攻', '生存', '资深干员']
[5, '星极', '近战位', '近卫干员', '输出', '防护', '资深干员']
[5, '诗怀雅', '近战位', '近卫干员', '输出', '支援', '资深干员']
[5, '暴行', '近战位', '近卫干员', '群攻', '爆发', '资深干员']
[5, '拉普兰德', '近战位', '近卫干员', '输出', '削弱', '资深干员']
[5, '因陀罗', '近战位', '近卫干员', '输出', '生存', '资深干员']
[5, '幽灵鲨', '近战位', '近卫干员', '群攻', '生存', '资深干员']
[5, '芙兰卡', '近战位', '近卫干员', '输出', '生存', '资深干员']
[4, '缠丸', '近战位', '近卫干员', '输出', '生存']
[4, '霜叶', '近战位', '近卫干员', '输出', '减速']
[4, '慕斯', '近战位', '近卫干员', '输出']
[4, '猎蜂', '近战位', '近卫干员', '输出']
[4, '艾丝黛尔', '近战位', '近卫干员', '群攻', '生存']
[4, '杜宾', '近战位', '近卫干员', '输出', '支援']
[3, '泡普卡', '近战位', '近卫干员', '群攻', '生存']
[3, '月见夜', '近战位', '近卫干员', '输出']
[3, '玫兰莎', '近战位', '近卫干员', '输出', '生存']
-----------------------------


5 个回复 | 最后更新于 2021-09-26
2021-09-24   #1

你这种游戏玩法,又能玩又能学,老婆不发愁

2021-09-24   #2

回复#1 @admin :

其实拓展来看的话,这题属于“世界7大难题之一的NP问题” https://baike.baidu.com/item/NP%E5%AE%8C%E5%85%A8%E9%97%AE%E9%A2%98/4934286

只不过由于这道题的选择项比较少5个标签里面选3个或以下,我用排列组合的方法穷举了一边也没花多少时间,但是如果选项增加到十几个或者几十个,靠穷举就几乎是不可能的事了。


2021-09-26   #3

为了使用起来更方便(少打几个字,哈哈),特地用python画了个GUI界面。

Python画GUI真是蛋疼...

2021-09-26-174838_1024x768_scrot.png


2021-09-26   #4

回复#3 @jerryxjr1220 :

厉害,玩树莓派

2021-09-26   #5

回复#4 @cuiqbo :

主要是我也不跑什么大型程序,都是轻应用,树莓派足够了,而且可以一直挂着也不用关机

登录后方可回帖

登 录
信息栏
公告:
个人博客
专注分享
可在分享中适当提问
谢绝纯提问
否则不再提醒一律
删帖
谢谢合作!



本站域名:HtmLayout.Cn
aardio可以快速开发上位机,本站主要记录了学习过程中遇到的问题和解决办法及aardio代码分享

这里主要专注于aardio学习交流和经验分享.
纯私人站,当笔记本用的,学到哪写到哪.

Aardio 官方站:Aardio官方
Aardio最新功能:Aardio官方更新日志
本 站 主 站:Stm32cube中文网
Sciter中文在线文档Sciter在线学习文档
空间赞助:才仁机械
Loading...