Pokédex应用:双属性宝可梦伤害类型去重与计算问题求助
解决双属性宝可梦伤害类型计算:提取2倍/半倍伤害类型
核心逻辑梳理
双属性宝可梦的伤害倍率是两个属性克制关系的叠加,你已经搞定了4倍、1/4倍、无伤害和1倍的判定,剩下的2倍/半倍只需要基于已有的归类结果做集合过滤:
- 2倍伤害:仅被其中一个属性克制的类型(即两个属性
double_damage_from的并集,排除掉已归类的其他倍率类型) - 半倍伤害:仅被其中一个属性抵抗的类型(即两个属性
half_damage_from的并集,排除掉已归类的其他倍率类型)
代码实现示例(以JavaScript为例)
假设你已经从PokeAPI拿到了两个属性的完整数据,并且已经得到了以下已归类的类型集合:
// 两个属性的原始数据 const attr1 = /* 第一个属性的API返回数据 */; const attr2 = /* 第二个属性的API返回数据 */; // 已实现的归类结果(用Set存储,方便快速查询) const quadrupleDamage = new Set( attr1.double_damage_from.map(t => t.name).filter(type => attr2.double_damage_from.some(t => t.name === type) ) ); const quarterDamage = new Set( attr1.half_damage_from.map(t => t.name).filter(type => attr2.half_damage_from.some(t => t.name === type) ) ); const noDamage = new Set([ ...attr1.no_damage_from.map(t => t.name), ...attr2.no_damage_from.map(t => t.name) ]); const normalDamage = new Set(/* 你已实现的1倍伤害类型集合 */);
提取2倍伤害类型
// 合并两个属性的double_damage_from,去重 const combinedDoubleSources = new Set([ ...attr1.double_damage_from.map(t => t.name), ...attr2.double_damage_from.map(t => t.name) ]); // 过滤掉所有已归类的类型,剩下的就是2倍伤害类型 const doubleDamage = [...combinedDoubleSources].filter(type => !quadrupleDamage.has(type) && !quarterDamage.has(type) && !noDamage.has(type) && !normalDamage.has(type) );
提取半倍伤害类型
// 合并两个属性的half_damage_from,去重 const combinedHalfSources = new Set([ ...attr1.half_damage_from.map(t => t.name), ...attr2.half_damage_from.map(t => t.name) ]); // 同样过滤已归类类型,得到半倍伤害类型 const halfDamage = [...combinedHalfSources].filter(type => !quadrupleDamage.has(type) && !quarterDamage.has(type) && !noDamage.has(type) && !normalDamage.has(type) );
关键说明
- 用
Set处理集合操作可以避免重复类型,同时提升查询效率 - 2倍伤害的本质是仅被单个属性克制,所以要排除掉被两个属性同时克制的4倍类型,以及其他已明确归类的类型
- 半倍伤害同理,是仅被单个属性抵抗,排除掉被两个属性同时抵抗的1/4倍类型即可
内容的提问来源于stack exchange,提问作者Raphael Bornhauser
相关产品推荐
相关产品推荐

