首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有可能用FEN,也就是forsyth-edward符号,把它从黑色翻转到play,再把win换成白色?

有没有可能用FEN,也就是forsyth-edward符号,把它从黑色翻转到play,再把win换成白色?
EN

Stack Overflow用户
提问于 2019-07-15 09:03:57
回答 1查看 327关注 0票数 2

让我们假设我们有一个国际象棋围栏,而围栏是一个黑色的玩和赢的问题。很多时候,国际象棋拼图网站想要避免不得不不断指示轮到谁移动的混乱,所以他们宁愿把所有的拼图都放在白棋和胜棋或者黑棋和胜棋上。

先发芬让黑棋上场并获胜。

代码语言:javascript
复制
7k/8/7K/8/ppp5/8/PPP5/8 b - - 0 1

我想从跑步中得到的Fen:

代码语言:javascript
复制
function flipfen(fen) {
    return (fen*(algorithm)) 
};

˚console.log(flipfen(7k/8/7K/8/ppp5/8/PPP5/8 b - - 0 1))

以及期望的结果:

代码语言:javascript
复制
8/5ppp/8/5PPP/8/k7/8/K7 w - - 0 1

也许我可以使用正则表达式?它看起来像第二个fen (在这种情况下,不确定它是否在所有情况下都能工作,只是另一个向后,只有一些细微的变化?)

代码语言:javascript
复制
8/5ppp/8/5PPP/8/k7/8/K7 w - - 0 1
EN

回答 1

Stack Overflow用户

发布于 2021-05-15 14:37:50

我试着想出每一个可能的有效的FEN。

  • 颠倒字母大小写
  • 颠倒行序
  • switch who's to move
  • 交换转换权限
  • 镜像en passant方形

代码语言:javascript
复制
function flipFEN(FEN) {
  const invertCase = (char) => {
    if (char == char.toLowerCase())
      return char.toUpperCase();
    return char.toLowerCase();
  }
  
  let position = FEN.split(" ")[0].split("/");
  position = position.map((row) => {
    return row.split("").map(invertCase).join("");
  });
  position = position.reverse().join("/");

  let turn = FEN.split(" ")[1];
  turn = turn == "w" ? "b" : "w";
  
  let castle = FEN.split(" ")[2];
  if (castle != "-") {
    castle = castle.split("").map(invertCase);
    castle.sort();
    castle = castle.join("");
  }
  
  let ep = FEN.split(" ")[3];
  if (ep != "-") {
    ep = ep.split("");
    ep[1] = ep[1] == "6" ? "3" : "6";
    ep = ep.join("");
  }
  
  const rest = FEN.split(" ").slice(4);
  
  return [position, turn, castle, ep, ...rest].join(" ");
}

console.log(flipFEN("r1bq1r2/pp2n3/4N2k/3pPppP/1b1n2Q1/2N5/PP3PP1/R1B1K2R w KQ g6 0 15"));

// > "r1b1k2r/pp3pp1/2n5/1B1N2q1/3PpPPp/4n2K/PP2N3/R1BQ1R2 b kq g3 0 15"

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57032270

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档