是否可以采用FEN又名前卫的表示法,将其从黑色翻转为播放并赢得白色

时间:2019-07-15 01:03:56

标签: javascript python algorithm chess chessboard.js

让我们说我们有国际象棋象棋,而象棋是黑棋和赢球问题。很多时候,国际象棋拼图网站都希望避免混淆,而不必一直指示该轮到谁来移动,因此,他们宁愿将所有拼图都放在白棋上才能赢,黑棋上则赢。在某种情况下,如果我有一个数组或db的1000分之分贝,它的黑色会发挥作用并获胜,那么我可以通过一个函数或算法来运行它,以便将分叉吐出到完全相同的位置,但白棋除外赢了吗?

我尝试设置编辑板,使所有黑色块均为白色,白色块为黑色,但遇到的问题是,板颠倒了,棋子只能向一个方向移动。

为黑而发奋奋斗并赢得胜利。

7k/8/7K/8/ppp5/8/PPP5/8 b - - 0 1

我想从跑步中走出来的芬:

function flipfen(fen) {
    return (fen*(algorithm)) 
};

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

以及所需的结果:

8/5ppp/8/5PPP/8/k7/8/K7 w - - 0 1

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

8/5ppp/8/5PPP/8/k7/8/K7 w - - 0 1

2 个答案:

答案 0 :(得分:1)

我试图想出所有可能的有效 FEN。

  • 反转字母大小写
  • 颠倒行序
  • 切换移动对象
  • 交换城堡权
  • 镜像过路广场

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 :(得分:0)

澄清起始分格和结束分格的示例,例如,将黑色翻转到播放位置变为白色。

发奋:

r1bqk2r / ppp2ppp / 2nb1n2 / 8 / 2BPp3 / 4P3 / PP1N1PPP / RNBQ1RK1 b kq-2 8

最终分站:rnbq1rk1 / pp1n1ppp / 4p3 / 2bpP3 / 8 / 2NB1N2 / PPP2PPP / R1BQK2R w KQ-2 8