✓ ESS21仅限 【特性】非官方的特性教程练习题

komeiji514

馆主
2022/09/01
79
1
9
675
20
写在前面:本帖子适合阅读过特性教程的朋友们,如果未阅读过建议先阅读一遍。
本帖会提供些特性实例(许多取材自exceeded,敬请参考EE Dex)作为特性教程的练习。
注意:不选取过于简单的“换皮”特性,即与原作特性效果完全相同或高度类似的特性。

それでは、練習を始めましょう!
1.(预估难度2星)
威严之蛾(Majestic Moth):出场时,数值最高的那项能力会提高。
 

komeiji514

馆主
2022/09/01
79
1
9
675
20
解析:此题的关键一是“出场时”,二是“数值最高的能力”。
前者告诉我们,要使用OnSwitchIn这个Handler,后者则需要我们计算宝可梦的各项能力,这正是本题的难点所在。

TA改:请制作不考虑能力等级和考虑能力等级的两个版本。

1.不考虑能力等级。
请参考异兽提升。

2.考虑能力等级。# komeiji514
请参考古代活性/夸克充能。
Gen 9 pack中古代活性/夸克充能计算能力并比较的代码如下:
Ruby:
    highestStat = nil
    highestStatVal = 0
    stageMul = [2, 2, 2, 2, 2, 2, 2, 3, 4, 5, 6, 7, 8]
    stageDiv = [8, 7, 6, 5, 4, 3, 2, 2, 2, 2, 2, 2, 2]
    battler.plainStats.each do |stat, val| #plainStats就是指攻击、防御、特攻、特防、速度这几项。
      stage = battler.stages[stat] + 6
      realStat = (val.to_f * stageMul[stage] / stageDiv[stage]).floor #计算宝可梦能力的实际值。
      if realStat > highestStatVal #选出最大值。
        highestStatVal = realStat
        highestStat = stat
      end
    end
下面一步就是提高这项能力,相信这一步对读者来说无需赘述了。

额外作业:
如果你能独立完成以上两个版本的话,可以尝试做以下的额外作业。
①.当最高的能力有多项时,随机提高一项能力。(1和2两个版本请都完成)
②.当最高的能力有多项时,让玩家手动选择想要提高的那项能力。(1和2两个版本请都完成)
③.写一个用来获取最高的能力的方法,该方法必须兼容以上的所有版本,并用该方法重写/优化以上的各个版本。
④.任选一个版本,在③的基础上,添加上“一场战斗只能发动一次”的前置条件。

也就是说,最后应该有这么些版本——
1.不考虑能力等级;
2.考虑能力等级;
3.不考虑能力等级,随机最高项;
4.考虑能力等级,随机最高项;
5.不考虑能力等级,手选最高项;
6.考虑能力等级,手选最高项;
7-12,以上版本对应的方法重写优化版。
13.7-12的任一版本,一次性版。

玩得开心。
 
由版主最后编辑:

komeiji514

馆主
2022/09/01
79
1
9
675
20
解析:此题的关键一是“出场时”,二是“数值最高的能力”。
前者告诉我们,要使用OnSwitchIn这个Handler,后者则需要我们计算宝可梦的各项能力,这正是本题的难点所在。

TA改:请制作不考虑能力等级和考虑能力等级的两个版本。

1.不考虑能力等级。
请参考异兽提升。

2.考虑能力等级。# komeiji514
请参考古代活性/夸克充能。
Gen 9 pack中古代活性/夸克充能计算能力并比较的代码如下:
Ruby:
    highestStat = nil
    highestStatVal = 0
    stageMul = [2, 2, 2, 2, 2, 2, 2, 3, 4, 5, 6, 7, 8]
    stageDiv = [8, 7, 6, 5, 4, 3, 2, 2, 2, 2, 2, 2, 2]
    battler.plainStats.each do |stat, val| #plainStats就是指攻击、防御、特攻、特防、速度这几项。
      stage = battler.stages[stat] + 6
      realStat = (val.to_f * stageMul[stage] / stageDiv[stage]).floor #计算宝可梦能力的实际值。
      if realStat > highestStatVal #选出最大值。
        highestStatVal = realStat
        highestStat = stat
      end
    end
下面一步就是提高这项能力,相信这一步对读者来说无需赘述了。

额外作业:
如果你能独立完成以上两个版本的话,可以尝试做以下的额外作业。
①.当最高的能力有多项时,随机提高一项能力。(1和2两个版本请都完成)
②.当最高的能力有多项时,让玩家手动选择想要提高的那项能力。(1和2两个版本请都完成)
③.写一个用来获取最高的能力的方法,该方法必须兼容以上的所有版本,并用该方法重写/优化以上的各个版本。
④.任选一个版本,在③的基础上,添加上“一场战斗只能发动一次”的前置条件。

也就是说,最后应该有这么些版本——
1.不考虑能力等级;
2.考虑能力等级;
3.不考虑能力等级,随机最高项;
4.考虑能力等级,随机最高项;
5.不考虑能力等级,手选最高项;
6.考虑能力等级,手选最高项;
7-12,以上版本对应的方法重写优化版。
13.7-12的任一版本,一次性版。

玩得开心。
碎碎念:感谢补充说明&拓展练习。这些练习题个人的预估难度是2.5~3星。
これが面白いと思ったら、完成してみてください。
 

komeiji514

馆主
2022/09/01
79
1
9
675
20
では、次の問題を見ていきましょう。
2.Champion Belt(冠军黑带)预估难度:2~3星。
受到格斗属性宝可梦的伤害会减少33%。击倒格斗属性的宝可梦后,会恢复50%的HP。
 

komeiji514

馆主
2022/09/01
79
1
9
675
20
では、次の問題を見ていきましょう。
2.Champion Belt(冠军黑带)预估难度:2~3星。
受到格斗属性宝可梦的伤害会减少33%。击倒格斗属性的宝可梦后,会恢复50%的HP。
说实话此题并不值2星,因为只是两个简单效果的复合。
第一个效果参考过滤,第二个效果参考自信过度,无需赘述了。
 

TAAAAAAA

天王
管理成员
2024/06/16
200
3
27
1,210
3.Omnigrowth(无限潜能)预估难度:2.5-3星。 # TA留
此特性的精灵会无限成长,且渴望和强者战斗,随着打倒的对手变多,自身也变得更强。
和训练家对战时,每击败一只精灵,自身的双攻和速度增加0.5%,但是双防减少0.1%;同时,击倒对手的那个技能的威力增加0.5%。
 

komeiji514

馆主
2022/09/01
79
1
9
675
20
3.Omnigrowth(无限潜能)预估难度:2.5-3星。 # TA留
此特性的精灵会无限成长,且渴望和强者战斗,随着打倒的对手变多,自身也变得更强。
和训练家对战时,每击败一只精灵,自身的双攻和速度增加0.5%,但是双防减少0.1%;同时,击倒对手的那个技能的威力增加0.5%。
感谢供题!姑且写个解析:
1.在class Pokemon添加两个attr_accessor用于记录击败训练家宝可梦的数目,以及击败训练家用过的招式及次数。
2.添加一个OnEndOfUsingMove的Handler,在训练家对战中击败宝可梦后使对应的数值增加。
3.在DamageCalcFromUser,DamageCalcFromTarget以及SpeedCalc部分添加对应的计算。
(极可能不是最优解且不完全)
 

komeiji514

馆主
2022/09/01
79
1
9
675
20
放一个制作群里展示过的。
4.Evoboost Sync(九彩聚顶)预估难度:3星
首次出场时,会根据训练家队伍中除自身之外伊布家族的数量,从高到低依此上升一级能力。
例:如该宝可梦能力从高到低依次为特防、特攻、攻击、防御、速度,而训练家队伍中6只都是伊布家族,则依此提高特防、特攻、攻击、防御、速度一级;如果队伍里有2只则只提升特防、特攻一级。
可以算第一题的升级版,要多处理一些内容。

sorted_hash = hash.sort_by { |key, value| -value }
sorted_keys = sorted_hash.map { |a| a[0] }
selected_keys = sorted_keys[0...(eevee_count - 1)]
selected_keys.each { |key| # action }
 
由版主最后编辑:

TAAAAAAA

天王
管理成员
2024/06/16
200
3
27
1,210
5.Second Chance(倒计时)预估难度:4星。 # TA留
此特性的精灵在濒死后经过4个回合就会复活,复活时回复50%的HP;这个特性一场战斗最多发动3次。
 

komeiji514

馆主
2022/09/01
79
1
9
675
20
5.Second Chance(倒计时)预估难度:4星。 # TA留
此特性的精灵在濒死后经过4个回合就会复活,复活时回复50%的HP;这个特性一场战斗最多发动3次。
个人解析:1.在Battle::Battler添加记录重生次数的attr_accessor;
2.添加针对于战斗中某位置的PBEffects;3.添加一个EOREffect计时器用于回复相应的宝可梦;4.利用OnSelfFainting的Handler为PBEffects赋值。
如有错漏欢迎指出。
 

TAAAAAAA

天王
管理成员
2024/06/16
200
3
27
1,210
个人解析:1.在Battle::Battler添加记录重生次数的attr_accessor;
2.添加针对于战斗中某位置的PBEffects;3.添加一个EOREffect计时器用于回复相应的宝可梦;4.利用OnSelfFainting的Handler为PBEffects赋值。
如有错漏欢迎指出。
1.基于battler的变量在精灵换下场的时候就会被清除;
2.不是很理解什么叫“战斗中某位置”;
3.这里的难点在于如何找到“相应的宝可梦”。

1.濒死
2.回合计数
3.复活“那只”精灵
4.特性发动计数
 

komeiji514

馆主
2022/09/01
79
1
9
675
20
1.基于battler的变量在精灵换下场的时候就会被清除;
2.不是很理解什么叫“战斗中某位置”;
3.这里的难点在于如何找到“相应的宝可梦”。

1.濒死
2.回合计数
3.复活“那只”精灵
4.特性发动计数
应当是Battle变量;此处是指预知未来、祈愿等作用于站在某个位置上的宝可梦。
 

TAAAAAAA

天王
管理成员
2024/06/16
200
3
27
1,210
应当是Battle变量;此处是指预知未来、祈愿等作用于站在某个位置上的宝可梦。
1.难点:基于Battle的变量具体如何实现;
2.恐怕不行,因为位置指的是场上的位置,即精灵所站的地方,精灵濒死下场后,它已经不站在那个位置了。
 

komeiji514

馆主
2022/09/01
79
1
9
675
20
1.难点:基于Battle的变量具体如何实现;
2.恐怕不行,因为位置指的是场上的位置,即精灵所站的地方,精灵濒死下场后,它已经不站在那个位置了。
非常好问题,使我大脑迅速发育。有一种用竞赛题锻炼解高考题的能力的美。(笑)
 

komeiji514

馆主
2022/09/01
79
1
9
675
20
另一个制作群里展示过的。
6.Sky Guardian/天空守卫者 难度:3至3.5星。(作为凤王的专属特性)
宝可梦首次倒下时,会变成传说的蛋。变为传说的蛋时,会完全回复自身的HP,清除自身的异常状态,但是自身无法行动。3回合后,会复活为凤王,对自身外所有宝可梦造成其最大HP1/4的伤害,清除其能力变化并陷入灼伤状态(如果能陷入灼伤)。
额外说明:EE里没有限定特性是否可以无限触发,但是为了控制强度可以自行限制。(限制特性触发次数这一点似乎又回到上题了)
1.可以视为教程中某个特性的延伸。如果读过教程的话应该能想起来。
2.某类效果可以控制宝可梦能否行动,并在一定回合后解除行动限制并发动效果。
 

在线成员

论坛统计

主题
474
消息
2,137
成员
2,909
最新成员
小灵喵~