You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用JavaScript实现Hnefatafl棋谱的顺时针旋转与标准化?

实现Hnefatafl棋谱顺时针旋转与标准化

核心思路

针对11×11的Hnefatafl棋盘,顺时针旋转90度的坐标转换规则(通过示例推导得出):

  • 原坐标格式:列字母+行数字(列A-K对应数字1-11,行号为1-11)
  • 转换逻辑:
    1. 列字母转数字:将A-K映射为1-11
    2. 提取行号并转为数字
    3. 计算新坐标:新列数字 = 原行数字;新行数字 = 12 - 原列数字
    4. 新列数字转回小写字母,拼接新坐标

完整JavaScript实现

// 转换单个棋盘坐标
function convertCoordinate(coord) {
  const colChar = coord[0];
  const rowStr = coord.slice(1);
  
  // 列字母转数字(A/K → 1/11)
  const colNum = colChar.toUpperCase().charCodeAt(0) - 'A'.charCodeAt(0) + 1;
  // 行号转数字
  const rowNum = parseInt(rowStr, 10);
  
  // 应用顺时针旋转90度的转换规则
  const newColNum = rowNum;
  const newRowNum = 12 - colNum;
  
  // 数字转回小写列字母
  const newColChar = String.fromCharCode(newColNum + 'a'.charCodeAt(0) - 1);
  
  return `${newColChar}${newRowNum}`;
}

// 转换并标准化整个棋谱
function rotateTaflNotation(originalNotation) {
  // 分割步骤并清理空内容
  const steps = originalNotation.split(';')
    .map(step => step.trim())
    .filter(step => step);
  
  // 处理每一步棋
  const rotatedSteps = steps.map(step => {
    const [stepNumPart, movesPart] = step.split('.');
    // 转换每个移动动作
    const moves = movesPart.split(' ').map(move => {
      const [from, to] = move.split('-');
      return `${convertCoordinate(from)}-${convertCoordinate(to)}`;
    });
    return `${stepNumPart}.${moves.join(' ')}`;
  });
  
  // 组装标准化后的棋谱
  return rotatedSteps.join('; ');
}

// 测试示例输入
const original = "1.k8-i8 g7-j7;  2.k5-j5 h6-h9;  3.k7-k9 f8-c8;";
const rotatedResult = rotateTaflNotation(original);
console.log(rotatedResult);
// 输出:"1.h1-h3 g5-g2; 2.e1-e2 f4-i4; 3.g1-i1 h6-h9"

代码说明

  • convertCoordinate:单独处理单个坐标的旋转,兼容大小写输入,输出统一为小写格式
  • rotateTaflNotation:自动解析原始棋谱,清理多余空格,转换所有坐标后重新组装成标准化格式的棋谱
  • 标准化效果:输出格式统一为步骤号.移动1 移动2; 步骤号.移动1 移动2,无冗余空格

内容的提问来源于stack exchange,提问作者Plamen Draganov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 05:40:19