Trivial Pursuit游戏棋盘格子ID分配及相邻关系匹配方案咨询
Trivial Pursuit棋盘格子ID编码优化方案
原有7位方案评估
你目前设计的7位占位式ID可以实现需求,但存在明显缺陷:6个径向占位位每次仅一个有有效值,冗余度高;计算相邻格子时需要遍历判断哪个径向位非零,逻辑冗余运行效率低,仅适合小规模验证使用,不是最优方案。
推荐最优编码方案(三元组结构)
该方案完全匹配「中心+6条径向+外圈环形」的几何结构,ID全局唯一,相邻格子可通过数值运算直接推导,无需预存映射表,开发和运行效率都更高:
- 编码规则:用三个独立字段组成ID,可存储为长度为3的数组,也可按位拼接为单个整数存储:
- 字段1(径向编号):取值06,6条径向路径分别对应16,中心格、非径向衔接点的外圈格统一填0
- 字段2(环层编号):取值-14,中心格填0;径向路径上的格子从内到外依次填14(与常见Trivial Pursuit棋盘结构匹配,最外层为与外圈衔接的位置);所有外圈环形格统一填-1
- 字段3(外圈位置):取值-142,纯外圈格子按顺时针/逆时针顺序填142(标准棋盘外圈共42格,每条径向对应7个外圈格);中心格、径向路径上的非衔接格统一填-1
如果需要用单个数值作为ID,可对负数做偏移后按位拼接,示例代码:
// 偏移处理把所有值转成正整数,环层+2,外圈位置+2,保证最小值为0 function generateId(r, l, p) { return (r << 8) | ((l + 2) << 4) | (p + 2); }
对应你给出的示例的ID映射:
- 中心格:
(0, 0, -1) - 第2条径向路径上的第2环格:
(2, 2, -1) - 第3条径向路径与外圈衔接的格:
(3, 4, 22) - 编号21的纯外圈格:
(0, -1, 21)
方案优势
- 无冗余存储:三个字段均有明确业务含义,无无效占位位,内存占用仅为原有7位方案的一半不到
- 移动逻辑开发极简单:相邻格子无需预存映射表,直接通过ID数值运算即可得到
- 径向格
(r,l,-1)移动:向内走取(r, l-1, -1),l=1时向内走直接到中心格;向外走取(r, l+1, -1),l=4时向外走直接到对应外圈衔接格 - 外圈格
(0,-1,p)移动:顺时针/逆时针走取(0, -1, p±1),边界值做循环处理即可;如果p为某条径向的衔接位置,可向内走进入对应径向 - 中心格
(0,0,-1)移动:向外走可直接生成任意径向的第一层格(r, 1, -1),r取值1~6
- 径向格
- 扩展性强:如果后续调整径向数量、环层数量、外圈长度,只需要调整对应字段的取值范围即可,不需要重构整个编码逻辑。
内容的提问来源于stack exchange,提问作者Lénaïg
相关产品推荐
相关产品推荐

