ESS多版本 【TA】【练习小题】获取最多的那个属性

TAAAAAAA

天王
管理成员
2024/06/16
241
4
36
1,270
一道小题目,本来以为应该挺简单的,但是做了之后发现并不是这么回事。
发个帖子,希望大家能动手试一下,实践出真知。
可以跟帖回复你的答案。
相信这道题目一定会加深你对ESS的战斗系统的理解。

题目:请写一个方法,用来获取最多的那个属性。
详细:
1.获取敌我双方所有精灵的属性里面最多的那个属性
2.方法需要兼容非训练师对战,训练师对战,敌我双方都有多个训练师等的情况
3.方法需要兼容当前在场上的精灵属性可能发生改变的情况
4.方法需要兼容有多个属性同时是最多的情况,有多个最多时,随机选择一个

5*.以上统计都不考虑蛋和已经濒死的精灵
6*.获取完了最多,那么也尝试获取一下最少的属性

举例:
1.当前场上我方是一只大菊花,后排是一只火爆兽,对面是一只火爆兽时,方法应返回火系。
2.当前场上我方是一只大菊花,后排也是一只大菊花,对面是一只火爆兽,方法应返回草系。
3.当前场上我方是一只大菊花,但是大菊花因为某些原因变成了水系,对面是一只火爆兽,方法应返回水系或者火系。
4.当前场上我方是一只大菊花,对面是一只火爆兽,对面后排也是一只大菊花时,方法应返回草系。
5.当前场上我方是一只大菊花,但是大菊花因为某些原因变成了水系,对面是一只火爆兽,对面后排也是一只大菊花时,方法应返回水系或者火系或者草系。

基本就是这样。

参考答案:(请一定要自己尝试了再来看参考答案)
 

komeiji514

馆主
2022/09/01
107
1
14
775
20
Ruby:
class Battle
  def pbMostType
    # 记录所有宝可梦的所有属性以及出现次数的Hash。
    pokemon_types = {}
    GameData::Type.each {|tp| pokemon_types[tp.id] = 0} # 有大就有小,这样写的话获取最多没问题,如果要获取最少呢,可以尝试优化一下
    # 将场上宝可梦的属性及其出现次数记录进Hash内。
    allBattlers.each {|b| b.pbTypes(true).each {|tp| pokemon_types[tp] += 1}} # 最好不要在一行写两个each的Block
    # 将双方队伍中的宝可梦(非场上的宝可梦)记录进Hash内。
    all_party = pbParty(0) + pbParty(1) # 这里其实不需要通过方法来获取,调用方法会消耗额外的性能(当然话又说话来,性能的消耗是微乎其微可以忽略不计的)
    all_party.each do |pkmn|
      next if allBattlers.any?{|b| pkmn == b.pokemon} # 这里可能会有点问题,虽然这样写应该也能行,但是纵观整个ESS甚至9代包,是没有出现直接比较精灵的情况的(看看Battler)
      pkmn.types.each {|tp| pokemon_types[tp] += 1}
    end
    # 将出现次数最多的属性提取为Array,并随机取样(若超过一个属性的出现次数为最大值)。
    most_types = []
    most_type_time = pokemon_types.values.max
    pokemon_types.each {|k, v| most_types.push(k) if v == most_type_time}
    mostType = most_types.sample
    return mostType # 这一行是不需要的,如果不写这行,上一行的mostType = 也是不必要的。
  end
end

# 总结,棒!
# 代码应该是能运行的,虽然有些地方不够优雅,但是每一步都能够使用each,即用自己熟悉的东西来达到目的,很不错!
# 另外,你如果感兴趣的话,可以尝试加上题目上新加的5*和6*点。
 
由版主最后编辑:

在线成员

现在没有成员在线。

最新帖子

论坛统计

主题
517
消息
2,352
成员
3,007
最新成员
ZQLdw