假设我们有一个国际象棋芬,而芬是一个黑色的下棋和获胜问题。很多时候,国际象棋拼图网站希望避免必须不断指出轮到谁移动的混乱,所以他们宁愿把所有的谜题都放在白色玩和赢或黑色玩和赢。在我有一个 1000 个 fens 的数组或 db 的情况下或场景中,它的黑色可以播放并获胜,有没有办法通过函数或算法运行它,该函数或算法会将 fen 吐出完全相同的位置,除了白色之外玩并获胜?
我尝试设置编辑棋盘,让所有黑色棋子都是白色棋子,白色棋子是黑色棋子,但遇到了棋盘颠倒并且棋子只向一个方向移动的问题。
开始芬为布莱克打球并获胜。
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
也许我可以使用正则表达式? 它看起来像第二个 fen(在这种情况下不确定它是否在所有情况下都有效,只是另一个向后有一些细微的变化?
8/5ppp/8/5PPP/8/k7/8/K7 w - - 0 1
我试图想到每一个可能的有效 FEN。
- 反转字母大小写
- 反转行顺序
- 切换谁要移动
- 互换铸造权
- 镜像 en passant 广场
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"