如何让gnubg适配土耳其双陆棋(Tavla)规则?
能否让gnubg适配Tavla土耳其双陆棋规则?
Tavla是土耳其版双陆棋,核心规则如下:
- 己方大本营内禁止“打了就跑”;
- 单独落在某点的棋子称为blot(孤棋),若对手棋子落在该点,孤棋会被击中并移至bar(栏位);
- 在己方大本营击中对手孤棋后,不能移动该攻击棋子寻求掩护,必须用另一枚棋子覆盖它或让其保持暴露状态。
已尝试的操作(均未成功)
- 在gnubg图形界面中查找并启用该规则,未找到相关选项;
- 阅读gnubg源码判断是否可通过自定义编译适配规则,在eval.c第1039行找到一段与攻击判断相关的代码,但未能完全理解逻辑。
相关代码片段(注释已译为中文)
/* 遍历所有可能击中孤棋的点 */ for (i = (nBoard > 2)? 23 : 21; i >= 0; i--) /* 如果该点存在一枚孤棋 */ if (anBoardOpp[i] == 1) /* 遍历所有可能发起攻击的己方点位 */ for (j = 24 - i; j < 25; j++) /* 如果己方该点位有棋子,且(不在大本营内或该点位棋子数不等于2) */ if (anBoard[j] && !(j < 6 && anBoard[j] == 2)) /* 遍历所有能从该点位发起攻击的骰子组合 */ for (n = 0; n < 5; n++) { if (aanCombination[j - 24 + i][n] == -1) break; /* 获取该骰子组合所需经过的中间点位 */ pi = aIntermediate + aanCombination[j - 24 + i][n]; if (pi->fAll) { /* 若nFaces为1,则没有中间点位需要经过 */ if (pi->nFaces > 1) { /* 所有中间点位都必须可通行 */ for (k = 0; k < 3 && pi->anIntermediate[k] > 0; k++) if (anBoardOpp[i - pi->anIntermediate[k]] > 1) /* 中间点位被阻挡,跳过此次攻击判断 */ goto cannot_hit; } } else { /* 只需两个中间点位中的一个可通行即可 */ if (anBoardOpp[i - pi->anIntermediate[0]] > 1 && anBoardOpp[i - pi->anIntermediate[1]] > 1) { /* 两个中间点位都被阻挡,跳过此次攻击判断 */ goto cannot_hit; } } /* 记录该骰子组合可发起的攻击 */ aHit[aanCombination[j - 24 + i][n]] |= 1 << j; cannot_hit:; }
内容的提问来源于stack exchange,提问作者mvandervort
相关产品推荐
相关产品推荐

