我与“群星连结”的爱恨情仇

· · 题解

儒略日第114514天,大美江湖一片异象,月黑风高,群星连结,正在打斗地主的人们预感到,这是一个杀蚂蚁的好日子,这些蚂蚁都是来自魔兽世界的异兽,经过讨论,他们决定继续沿用灭鼠行动的计划,这个计划是他们与一群专门研究组合数问题的鸭棋爱好者共同发明的“封锁”套路,事实证明,确实有效,当晚,人们凯旋归来,为了纪念这一特殊的日子,他们发明了一种新游戏--猪国杀。

群星连结切后感

群星连结这个题,虽然是个题目很长的尬模拟,但它的思维难度远不及PCK这么大,只是里面有亿点点细节罢了(结果我还是调了两天......)

更好的阅读体验

大体思路

一个字: 。(做好心理准备,我的代码巨长无比)

我是定义了一个结构体来存每个角色的所有信息,然后分别给 Alice 和 Bob 的角色开了一个大数组(开始写的时候没动脑子,快写完的时候才意识到可以开二维数组,用 0,1 来代表两人,这就导致我的码量多了一倍......),结构体如下:

struct role
{
    int HP,maxHP;//每个角色的血量及血量上限 
    int MP,maxMP;//每个角色的能量及能量上限 
    int atk,delta_atk;//每个角色的基础攻击力和攻击力增益 
    int def,delta_def;//每个角色的基础防御力和防御力增益 
    int talent,talent_x,talent_y;//天赋及附加参数 
    int skill,skill_x,skill_y,skill_z;//技能及附加参数 
    int id,target;//角色编号及当前的攻击目标 
    bool live,player;//是否活着以及属于哪个阵营 
}Alice[15],Bob[15];//1:Alice, 0:Bob

另外,由于优先目标不需要那么多参数,所以我另开了一个小结构体。

struct targetrole//用于记录每个角色的优先目标 
{
    int id;//编号 
    bool live;//是否活着 
}Alicep[20][20],Bobp[20][20];

然后就可以按照游戏规则一回合一回合的模了。

  1. Alice 行动阶段

能放技能优先放技能,不能放技能就普攻。

  1. Alice 行动结束

战后回蓝,天赋回血回蓝记得用。

  1. Bob 行动阶段

能放技能优先放技能,不能放技能记得普攻。

  1. Bob 行动结束

战后回蓝,天赋回血回蓝记得用。

  1. 回合结束阶段

把技能叠加的各种攻击力,防御力buff整理一下。

对于技能给的各种攻击力,防御力 buff ,我的处理方法是开一个时间线数组,把每回合的 buff 都存起来,然后在回合开始时加上,回合结束后再删去。

每次有人死了我都会去判一下游戏是否结束,如果结束了立即退出。

前面我说过,因为没动脑子所以给 Alice 和 Bob 各开了一个数组,所以我所有的行动都要给这俩人各写一份(当然如果开二维数组用 0,1 记录人物就不必要这么麻烦了),作为懒狗的我写完 Alice 之后就复制了一份,改了改名字就给 Bob 了(注意,这里是个伏笔)。

这里再说一下,技能推荐单独写在一个函数里,天赋就穿插在各个阶段里(别忘了写!!!)。

(@Naptie,@completerich 血的教训)

那些天我们掉进的坑

  1. 记录技能发动者、普攻使用者的变量没赋初值,导致数组越界喜提 5477
  2. 同样是因为没赋初值导致 Alice 某角色一个普攻打出了高达 341 万的高额伤害。
  3. 函数里的参数一定要加引用
  4. 当一名角色死亡后,如果血量被打成负数了,记得变回 0 ,否则可能影响结果。
  5. 角色死亡后记得把他的生死状态(如果你写了这么个东西的话)改成死,不然一定会出大问题(鞭尸也不是什么好行为对吧)。
  6. 当一名角色受伤后会立即回复一点能量,别写晚了或直接忘了写。
  7. 【天赋-血肉皮囊】可免除一半真实伤害,别忘了用,也别用错地方。
  8. 当一名角色被攻击时,不管会不会扣除生命值,都要回复一点能量。
  9. 一定要确保每个角色的优先攻击目标是活着的。
  10. 【技能:心态崩了!】虽然没什么卵用,但是也能发动。
  11. 当有人发动【技能:格林炸裂!】时,受击角色是先受击回蓝,再受技能效果扣除能量,扣除的是当前能量10%
  12. 【技能:天楼霸断剑!】中的 HP enemy 是最大生命值,不是当前生命值。
  13. 【技能:天狼噬斩!】的防御力减益只针对发动者的优先目标一人,而且是永久性的。
  14. 【技能:全力超全开!轮回之终末!】提升的是基础攻击力基础防御力
  15. 【技能:全力超全开!轮回之终末!】发动后记得把所有人(包括自己)的技能 10 改成技能 0
  16. 所有的技能 buff (回蓝,攻击力、防御力加成)都是在技能结束后立即生效,而不是等整个大回合结束,顺序错了很容易 gg 。
  17. 用完技能后记得先把能量清空,再进行技能后回蓝。
  18. 普攻和技能每回合只能选一个发动,记得判一下放什么。
  19. 角色的血量和能量都不能超过上限。
  20. 【技能:全力超全开!轮回之终末!】生效的最后一回合要完整的进行完,也就是说是在最后一回合结束后在结束游戏,而不是最后一回合开始。

小结

哪里出了问题可以对照着去看一下对应的部分有没有写挂掉。

最后的最后

巨长无比的代码