图鉴中的多个开关状态可以用一个整数表达。这个整数不是收集数量,而是一组位置权重相加的结果。理解编码和还原,有助于区分状态保存正确与界面计数正确这两件事。

下面是一份输入完整的独立练习。先明确规则和端点约定,再逐项推演;可以遮住计算结果自行记录,出现差异时从第一处不同查起。每项输入都是本例设定,不代表所有游戏采用同一套规则。

本例规则与输入

物品编号从零开始,编号对应二的该次方;重复点亮不叠加,移除未点亮项也不改变状态。演示操作只有点亮和熄灭,不包含未知编号或存档兼容迁移。

图鉴共5项,初始全灭 [['点亮', 3], ['点亮', 4], ['熄灭', 3], ['点亮', 3], ['熄灭', 3], ['熄灭', 4], ['熄灭', 3], ['点亮', 2], ['熄灭', 3], ['点亮', 1], ['点亮', 2], ['熄灭', 3], ['点亮', 0], ['点亮', 4], ['点亮', 1]]

过程记录

点亮编号3,该位权重8:编码0变为8,从高位到低位写作01000;还原已点亮编号[3],共1项。

点亮编号4,该位权重16:编码8变为24,从高位到低位写作11000;还原已点亮编号[3, 4],共2项。

熄灭编号3,该位权重8:编码24变为16,从高位到低位写作10000;还原已点亮编号[4],共1项。

点亮编号3,该位权重8:编码16变为24,从高位到低位写作11000;还原已点亮编号[3, 4],共2项。

熄灭编号3,该位权重8:编码24变为16,从高位到低位写作10000;还原已点亮编号[4],共1项。

熄灭编号4,该位权重16:编码16变为0,从高位到低位写作00000;还原已点亮编号[],共0项。

熄灭编号3,该位权重8:编码0变为0,从高位到低位写作00000;还原已点亮编号[],共0项。

点亮编号2,该位权重4:编码0变为4,从高位到低位写作00100;还原已点亮编号[2],共1项。

熄灭编号3,该位权重8:编码4变为4,从高位到低位写作00100;还原已点亮编号[2],共1项。

点亮编号1,该位权重2:编码4变为6,从高位到低位写作00110;还原已点亮编号[1, 2],共2项。

点亮编号2,该位权重4:编码6变为6,从高位到低位写作00110;还原已点亮编号[1, 2],共2项。

熄灭编号3,该位权重8:编码6变为6,从高位到低位写作00110;还原已点亮编号[1, 2],共2项。

点亮编号0,该位权重1:编码6变为7,从高位到低位写作00111;还原已点亮编号[0, 1, 2],共3项。

点亮编号4,该位权重16:编码7变为23,从高位到低位写作10111;还原已点亮编号[0, 1, 2, 4],共4项。

点亮编号1,该位权重2:编码23变为23,从高位到低位写作10111;还原已点亮编号[0, 1, 2, 4],共4项。

最后编码为23,有效项目数为4。

复核与实际应用

从整数中逐位还原已点亮编号,再与集合形式的操作结果比较。最高编号很大时数值会很大,这不说明收集很多;两种表示应记录同一组对象。

二进制字符串通常把高位写在左边,而编号零对应最右边。调试界面若把编号顺序从左到右排列,就要明确这两种阅读方向,不能直接按字符串位置当物品编号。

练习结束后,保留输入、每一步的中间状态和最终结果。可以仅修改一个边界输入,再比较变化来自哪条规则;不要同时改动多个条件后只凭最终画面判断。若实际作品表现不同,应先确认它使用的时间、坐标或结算约定,再决定是否属于异常。