霞之彼端

🚀 善国峻的个人站点 🌏

0%

使用 Python 为梦幻计算最优配招

梦幻是口袋妖怪系列游戏的第一只幻之宝可梦,拥有所有宝可梦的基因,没有性别,几乎所有宝可梦的招式 ta 都能学会,因此很多人认为 ta 就是宝可梦的始祖。然而在我为梦幻配招的时候却犯了难:梦幻能学习所有技能学习器的技能,那应该怎么为梦幻配招呢?一个有趣的想法是让梦幻的四个招式能够尽可能地克制对方宝可梦的属性。于是我写了一个简单的 Python 脚本来帮我计算哪四个技能的组合能克制最多的属性。

本以为已经一把年纪的我应该不会再喜欢口袋妖怪这个系列的游戏了,再加上 GF 近几年不思进取,使得《宝可梦:剑盾》强势与《复仇者联盟3》联动,只见灭霸一个响指,《剑盾》里的宝可梦就少了一半,妙蛙种子和杰尼龟等经典宝可梦集体缺席。所以在入手 switch 后一直没有入手《宝可梦:剑盾》。

直到上个月 GF 开了一场直面会,发布了《剑盾》的两个 DLC,经典宝可梦悉数登场。GF 啊 GF,原来是一份游戏分两半卖。别问,问就是真香!

梦幻是口袋妖怪系列游戏的第一只幻之宝可梦,拥有所有宝可梦的基因,没有性别,几乎所有宝可梦的招式 ta 都能学会,因此很多人认为 ta 就是宝可梦的始祖。

梦幻独一无二的奇葩种族值:

然而在我为梦幻配招的时候却犯了难:梦幻能学习所有技能学习器的技能,那应该怎么为梦幻配招呢?一个有趣的想法是让梦幻的四个招式能够尽可能地克制对方宝可梦的属性。于是我写了一个简单的 Python 脚本来帮我计算哪四个技能的组合能克制最多的属性

下面介绍脚本粗糙的实现思路。

实现思路

  1. 用一个字典来存储所有属性以及这些属性分别克制哪些属性
  2. 维护一个最优解列表来更新最优解
  3. 穷举四个属性的组合,并计算出这四个属性累计可以克制哪些属性
  4. 每种组合都与最优解进行对比,如果克制的属性数量与最优解相同或者比最优解更多,则更新最优解并打印出来

代码实现

首先用一个字典来存储 17 个属性(除了一般属性)以及这些属性分别克制哪些属性:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
克制字典 = {
'火': ['虫', '钢', '草', '冰'],
'水': ['地', '岩', '火'],
'草': ['地', '岩', '水'],
'冰': ['飞', '地', '草', '龙'],
'电': ['飞', '水'],
'地': ['毒', '岩', '钢', '火', '电'],
'岩': ['飞', '虫', '火', '冰'],
'超': ['斗', '毒'],
'虫': ['草', '超', '恶'],
'钢': ['岩', '冰', '妖'],
'恶': ['幽', '超'],
'幽': ['幽', '超'],
'斗': ['般', '岩', '钢', '冰', '恶'],
'飞': ['斗', '虫', '草'],
'妖': ['斗', '龙', '恶'],
'毒': ['草', '妖'],
'龙': ['龙']
}

维护一个最优解列表来更新最优解,之后穷举四个属性的组合,并计算出这四个属性累计可以克制哪些属性:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
最优解 = []

forin 克制字典.keys():
forin 克制字典.keys():
forin 克制字典.keys():
forin 克制字典.keys():

临时解 = []

四个属性 = [甲, 乙, 丙, 丁]
if 四个属性 != list(set(四个属性)):
# 用于去重
continue

for 克制 in 克制字典[甲]:
临时解.append(克制)
for 克制 in 克制字典[乙]:
if 克制 not in 临时解:
临时解.append(克制)
for 克制 in 克制字典[丙]:
if 克制 not in 临时解:
临时解.append(克制)
for 克制 in 克制字典[丁]:
if 克制 not in 临时解:
临时解.append(克制)

最后每种组合都与最优解进行对比,如果克制的属性数量与最优解相同或者比最优解更多,则打印出来:

1
2
3
4
5
if len(临时解) >= len(最优解):
print(甲 + 乙 + 丙 + 丁 + ': ' + 临时解)
最优解 = []
for 克制 in 临时解:
最优解.append(克制)

完整代码在文本最后

运行结果

最优解有三种,能克制 14 个属性(不计组合属性,一共 18 个属性):

  1. 地冰斗幽:[‘毒’, ‘岩’, ‘钢’, ‘火’, ‘电’, ‘飞’, ‘地’, ‘草’, ‘龙’, ‘般’, ‘冰’, ‘恶’, ‘幽’, ‘超’]
  2. 地飞冰斗:[‘毒’, ‘岩’, ‘钢’, ‘火’, ‘电’, ‘斗’, ‘虫’, ‘草’, ‘飞’, ‘地’, ‘龙’, ‘般’, ‘冰’, ‘恶’]
  3. 恶地冰斗:[‘幽’, ‘超’, ‘毒’, ‘岩’, ‘钢’, ‘火’, ‘电’, ‘飞’, ‘地’, ‘草’, ‘龙’, ‘般’, ‘冰’, ‘恶’]

但是考虑到梦幻能够学习威力不俗的虫属性吸取招式吸血,所以我比较倾向于选择有虫属性的解,所以添加以下代码:

1
2
if '虫' not in 四个属性:
continue

这样就能得到含有虫的最优解,能克制 13 个属性:

  1. 火冰虫地:[‘虫’, ‘钢’, ‘草’, ‘冰’, ‘飞’, ‘地’, ‘龙’, ‘超’, ‘恶’, ‘毒’, ‘岩’, ‘火’, ‘电’]
  2. 草虫地岩:[‘地’, ‘岩’, ‘水’, ‘草’, ‘超’, ‘恶’, ‘毒’, ‘钢’, ‘火’, ‘电’, ‘飞’, ‘虫’, ‘冰’]
  3. 冰虫地岩:[‘飞’, ‘地’, ‘草’, ‘龙’, ‘超’, ‘恶’, ‘毒’, ‘岩’, ‘钢’, ‘火’, ‘电’, ‘虫’, ‘冰’]
  4. 冰钢地虫:[‘飞’, ‘地’, ‘草’, ‘龙’, ‘岩’, ‘冰’, ‘妖’, ‘毒’, ‘钢’, ‘火’, ‘电’, ‘超’, ‘恶’]
  5. 冰飞地虫:[‘飞’, ‘地’, ‘草’, ‘龙’, ‘斗’, ‘虫’, ‘毒’, ‘岩’, ‘钢’, ‘火’, ‘电’, ‘超’, ‘恶’]
  6. 斗冰虫地:[‘般’, ‘岩’, ‘钢’, ‘冰’, ‘恶’, ‘飞’, ‘地’, ‘草’, ‘龙’, ‘超’, ‘毒’, ‘火’, ‘电’]
  7. 妖虫地岩:[‘斗’, ‘龙’, ‘恶’, ‘草’, ‘超’, ‘毒’, ‘岩’, ‘钢’, ‘火’, ‘电’, ‘飞’, ‘虫’, ‘冰’]

再三权衡下选择了虫地草岩的搭配:

  • 虫:吸血
  • 地:十万马力
  • 草:强力鞭打
  • 岩:尖石攻击

完整代码

完整代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
克制字典 = {
'火': ['虫', '钢', '草', '冰'],
'水': ['地', '岩', '火'],
'草': ['地', '岩', '水'],
'冰': ['飞', '地', '草', '龙'],
'电': ['飞', '水'],
'地': ['毒', '岩', '钢', '火', '电'],
'岩': ['飞', '虫', '火', '冰'],
'超': ['斗', '毒'],
'虫': ['草', '超', '恶'],
'钢': ['岩', '冰', '妖'],
'恶': ['幽', '超'],
'幽': ['幽', '超'],
'斗': ['般', '岩', '钢', '冰', '恶'],
'飞': ['斗', '虫', '草'],
'妖': ['斗', '龙', '恶'],
'毒': ['草', '妖'],
'龙': ['龙']
}

最优解 = []

forin 克制字典.keys():
forin 克制字典.keys():
forin 克制字典.keys():
forin 克制字典.keys():

临时解 = []

四个属性 = [甲, 乙, 丙, 丁]

if '虫' not in 四个属性:
continue

if 四个属性 != list(set(四个属性)):
# 用于去重
continue

for 克制 in 克制字典[甲]:
临时解.append(克制)
for 克制 in 克制字典[乙]:
if 克制 not in 临时解:
临时解.append(克制)
for 克制 in 克制字典[丙]:
if 克制 not in 临时解:
临时解.append(克制)
for 克制 in 克制字典[丁]:
if 克制 not in 临时解:
临时解.append(克制)


if len(临时解) >= len(最优解):
print(甲 + 乙 + 丙 + 丁 + ': ' + 临时解)
最优解 = []
for 克制 in 临时解:
最优解.append(克制)
  • 本文作者: 善国峻
  • 联系邮箱: me@ohmysites.com
  • 本文链接: https://www.ohmysites.com/archives/2/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-ND 许可协议。转载请注明出处!