把一个动作改绑到已经占用的按键时,系统可能拒绝、清空原绑定或交换两个动作。明确使用换位规则后,就能解释为什么另一个动作也发生了变化。
下面使用独立的一组输入,逐步记录规则如何产生结果。建议先自行推演,再寻找与记录第一次不同的位置;检查时间单位、端点归属和处理顺序。所有约定均限定在本例中,其他作品采用不同实现并不自动意味着出错。
本例约定与输入
六个动作与六个按键初始一一对应。请求将某动作绑定到目标键时,若目标已属于另一动作,就交换这两个动作的按键;目标原本就是该动作的键则不变。没有未绑定状态。
动作顺序['移动', '跳跃', '交互', '地图', '背包', '暂停'] 初始按键['K1', 'K4', 'K5', 'K6', 'K3', 'K2'] 请求[动作编号,目标键编号]:[[0, 5], [5, 2], [3, 4], [4, 5], [5, 3], [0, 4], [2, 5], [2, 5], [1, 2], [0, 1], [0, 3], [0, 4], [4, 1]]
过程与结果
请求1将“移动”绑定K6,该键原属“地图”;与其交换旧键K1。结果按动作顺序为['K6', 'K4', 'K5', 'K1', 'K3', 'K2']。
请求2将“暂停”绑定K3,该键原属“背包”;与其交换旧键K2。结果按动作顺序为['K6', 'K4', 'K5', 'K1', 'K2', 'K3']。
请求3将“地图”绑定K5,该键原属“交互”;与其交换旧键K1。结果按动作顺序为['K6', 'K4', 'K1', 'K5', 'K2', 'K3']。
请求4将“背包”绑定K6,该键原属“移动”;与其交换旧键K2。结果按动作顺序为['K2', 'K4', 'K1', 'K5', 'K6', 'K3']。
请求5将“暂停”绑定K4,该键原属“跳跃”;与其交换旧键K3。结果按动作顺序为['K2', 'K3', 'K1', 'K5', 'K6', 'K4']。
请求6将“移动”绑定K5,该键原属“地图”;与其交换旧键K2。结果按动作顺序为['K5', 'K3', 'K1', 'K2', 'K6', 'K4']。
请求7将“交互”绑定K6,该键原属“背包”;与其交换旧键K1。结果按动作顺序为['K5', 'K3', 'K6', 'K2', 'K1', 'K4']。
请求8将“交互”绑定K6,该键原属“交互”;原本已绑定,保持。结果按动作顺序为['K5', 'K3', 'K6', 'K2', 'K1', 'K4']。
请求9将“跳跃”绑定K3,该键原属“跳跃”;原本已绑定,保持。结果按动作顺序为['K5', 'K3', 'K6', 'K2', 'K1', 'K4']。
请求10将“移动”绑定K2,该键原属“地图”;与其交换旧键K5。结果按动作顺序为['K2', 'K3', 'K6', 'K5', 'K1', 'K4']。
请求11将“移动”绑定K4,该键原属“暂停”;与其交换旧键K2。结果按动作顺序为['K4', 'K3', 'K6', 'K5', 'K1', 'K2']。
请求12将“移动”绑定K5,该键原属“地图”;与其交换旧键K4。结果按动作顺序为['K5', 'K3', 'K6', 'K4', 'K1', 'K2']。
请求13将“背包”绑定K2,该键原属“暂停”;与其交换旧键K1。结果按动作顺序为['K5', 'K3', 'K6', 'K4', 'K2', 'K1']。
最后映射['K5', 'K3', 'K6', 'K4', 'K2', 'K1'],六个键仍然各使用一次。
如何独立复核
同时维护动作到按键和按键到动作两张表,每次交换后两表都应互为逆映射。全部按键仍只出现一次,不能让两个动作意外同时占用同一键。
键名只是练习标签,不代表特定设备的真实按键。实际界面若还支持组合键、上下文动作或保留键,应明确那些额外限制;本例的一一换位不自动覆盖这些情况。
测试时保留原始数据与中间状态,再只改变一个条件作比较。先检查空状态、相等边界、重复输入和最后一步,再比较整体结果;不要为了让最后的数字相同而跳过前面已经出现的差异。明确规则后,复核才有可以重复的依据。
