多个制作任务共享一个箱子时,尚未取走的材料也可能已经被预约。把实际库存、各任务预约和未预约余量分开,才能避免同一批材料被同时答应给两个任务。
以下是为了练习规则阅读而设计的独立场景。所有输入在这里完整列出,可以先自己记录结果,再对照后面的计算。它不声称对应某款现成游戏;如果实际说明中的边界或处理顺序不同,应以该说明重新演算。
条件与输入
本例只有一种材料,预约不搬走实物。领取自己预约的数量时,库存和该预约一起减少;取消只释放预约。任何请求不足都整次拒绝,不允许部分完成。
预约只能占未预约余量;取或退只能针对自己的预约。取减少实物,退不改变实物。
初始库存21,两任务预约均为零 约表示预约、取表示领取自己的预约、退表示取消预约 操作[['约', '甲', 22], ['约', '甲', 4], ['约', '乙', 7], ['取', '甲', 2], ['退', '乙', 2], ['取', '甲', 11], ['约', '乙', 6], ['退', '乙', 1], ['约', '乙', 3], ['取', '乙', 3], ['退', '乙', 9], ['退', '乙', 4], ['退', '乙', 6]]
逐项复盘
任务甲约22件:整次拒绝;实存21,预约甲0乙0,可用21。
任务甲约4件:通过;实存21,预约甲4乙0,可用17。
任务乙约7件:通过;实存21,预约甲4乙7,可用10。
任务甲取2件:通过;实存19,预约甲2乙7,可用10。
任务乙退2件:通过;实存19,预约甲2乙5,可用12。
任务甲取11件:整次拒绝;实存19,预约甲2乙5,可用12。
任务乙约6件:通过;实存19,预约甲2乙11,可用6。
任务乙退1件:通过;实存19,预约甲2乙10,可用7。
任务乙约3件:通过;实存19,预约甲2乙13,可用4。
任务乙取3件:通过;实存16,预约甲2乙10,可用4。
任务乙退9件:通过;实存16,预约甲2乙1,可用13。
任务乙退4件:整次拒绝;实存16,预约甲2乙1,可用13。
任务乙退6件:整次拒绝;实存16,预约甲2乙1,可用13。
最终库存16,预约{'甲': 2, '乙': 1},可用13。
如何自行核对
始终检查库存等于全部预约加可用量。预约和取消不改变实物总数,只有实际领取会减少库存。若取消之后库存增加,便是把释放额度错误地当成新增材料。
若任务会自动超时,应把超时记成一条明确的取消事件。否则表面看起来还有很多库存,实际却一直被已经结束的任务占住。
练习时保留原输入,只改一处条件,再观察哪些结果发生变化。若结果与预期不同,先查编号起点、边界是否包含以及前一步留下的状态。这样的记录能把“感觉不对”变成可复现的问题,也更方便向同伴说明自己的判断依据。
