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