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

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

玩过明日方舟塔防游戏的会知道游戏中有一个公开招募机制,随机给出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 :

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

登录后方可回帖

登 录
信息栏
 私人小站

本站域名

ChengXu.XYZ

投诉联系:  popdes@126.com



快速上位机开发学习,本站主要记录了学习过程中遇到的问题和解决办法及上位机代码分享

这里主要专注于学习交流和经验分享.
纯私人站,当笔记本用的,学到哪写到哪.
如果侵权,联系 Popdes@126.com

友情链接
Aardio官方
Aardio资源网


才仁机械


网站地图SiteMap

Loading...