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