如何用JavaScript实现Hnefatafl棋谱的顺时针旋转与标准化?
实现Hnefatafl棋谱顺时针旋转与标准化
核心思路
针对11×11的Hnefatafl棋盘,顺时针旋转90度的坐标转换规则(通过示例推导得出):
- 原坐标格式:
列字母+行数字(列A-K对应数字1-11,行号为1-11) - 转换逻辑:
- 列字母转数字:将A-K映射为1-11
- 提取行号并转为数字
- 计算新坐标:新列数字 = 原行数字;新行数字 = 12 - 原列数字
- 新列数字转回小写字母,拼接新坐标
完整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
相关产品推荐
相关产品推荐

