P7610 题解

· · 题解

P7610 题解

前言

写大模拟的题解和写大模拟没啥区别。

本题解中关于代码的解释会直接说明是代码的第几行,所以建议将代码放入编辑器后对照着行数进行调试。代码链接:群星连结源代码。

为了方便大家对照着代码进行调试,先给出代码的各部分功能目录:群星连结代码目录。

另外需要注意的是,我代码中的 HP 并不代表题面中的 HPMP 也不代表题面中的 MP,这种变量名不统一的情况还有许多。所以当对照着我的代码调试时,请以我代码中变量声明时的注释为准。

题目思路

那么接下来我们开始分析这道大模拟。

首先我们分析题面,把一些需要用的定义列出来,方便写代码和再次读题时查询和理解。

那么定义差不多写完了,我们再看一遍题面,理一下怎么实现各模块的代码。

struct character // 角色信息结构体
{
    long long HP , maxHP; // 当前生命 / 最大生命
    long long MP , maxMP; // 当前能量 / 最大能量
    long long atk , Datk; // 初始攻击 / 攻击加成
    long long def , Ddef; // 初始防御 / 防御加成
    long long talent , Xtalent , Ytalent; // 天赋代号 / 天赋参数 x / 天赋参数 y
    long long skill , Xskill , Yskill , Zskill; // 技能代号 / 技能参数 x / 技能参数 y / 技能参数 z
    long long ID , goal; // 角色代号 / 攻击目标
    bool islive; // 是否存活
    long long player; // 对应阵营(Alice = 1 / Bob = 2)
};
struct attackgoal // 角色攻击优先级信息
{
    bool islive; // 是否存活
    long long ID; // 角色代号
};

这样的话我们处理好整个框架了,还有一些具体的细节需要处理:

这样的话,代码实现基本就没有问题了。当然如果你真的调不出来,或是感觉代码中有一些不好发现的小错误,可以参照:群星连结代码注意点。

后记

写这种大模拟,重要的是理清思路,看清需要写的具体内容;要认真写代码,及时检查,避免因为小错误去阅读整篇代码好几次;真的有错误应该输出足量的调试信息,找到错误原因,也可以找一篇题解也输出同样的格式对着调(但不要直接交题解)。

其实我第一遍写的时候只有两个错误,第一个是第 109 行的天赋写成了技能;第二个是第 642 行的数组写错了。而这两个错误导致我断断续续调了将近两个月。

所以大家写题一定要仔细啊!