如何从 JavaScript 中的未嵌套棋盘列表中获取 FEN
how to get the FEN out of unNested chess board list in JavaScript
我下了一个国际象棋 Program.js,但效果不佳;
我想从板列表中生成 FEN,如下所示
board1 = [
"R", "N", "B", "K", "Q", "B", "N", "Q",
"P", "P", "P", "P", "P", "P", "P", "P",
" ", " ", " ", " ", " ", " ", " ", " ",
" ", " ", " ", " ", " ", " ", " ", " ",
" ", " ", " ", " ", " ", " ", " ", " ",
" ", " ", " ", " ", " ", " ", " ", " ",
"p", "p", "p", "p", "p", "p", "p", "p",
"r", "n", "b", "q", "k", "b", "n", "r"
]
我看过很多例子,但它们都在这样的嵌套列表中
board2 = [
[],
[]
]
而且我的系统无法正常工作
我构建的算法很糟糕,它只适用于起始案例,如“board1”中显示的列表
对于最后一个,它生成这个
rnbkqbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR/
但不是这个例子(在 4 步之后)它只是生成这样的东西(对于板 3)
rbqkbr/pp2ppp2223p33P3222/PP2PPP/RBQKBR/
board3 = ['R', ' ', 'B', 'K', 'Q', 'B', ' ', 'R',
'P', 'P', 'P', ' ', ' ', 'P', 'P', 'P',
' ', ' ', 'N', ' ', ' ', 'N', ' ', ' ',
' ', ' ', ' ', 'P', 'P', ' ', ' ', ' ',
' ', ' ', ' ', 'p', 'p', ' ', ' ', ' ',
' ', ' ', 'n', ' ', ' ', 'n', ' ', ' ',
'p', 'p', 'p', ' ', ' ', 'p', 'p', 'p',
'r', ' ', 'b', 'k', 'q', 'b', ' ', 'r'
]
我想要一种算法,它可以为最后一块板和任何其他板生成正确的 FEN,正确的将是
r1bqkb1r/ppp2ppp/2n2n2/3pp3/3PP3/2N2N2/PPP2PPP/R1BKQB1R/
这是我的算法
function getFEN2(board) {
let result;
let counter = 0; // counter for successive empty cell along the row
let save = []; // temp container
for (a in board) {
index = parseInt(a)
v = board[index];
if (v === " ") {
counter += 1;
// sum up the successive empty cell and update save
if (counter > 1) {
save[save.length - 1] = counter.toString();
} else if (cnt < 1) {
save.push(counter.toString()); // add
}
} else if (v !== " ") {
save.push(v); // add
counter = 0; // reset, there is no successive number
}
if ((index + 1) % 8 === 0) {
save.push("/");
counter = 0;
}
}
result = save.join(""); // convert list to string
return result;
}
// 提前致谢
您的解决方案正确地使用模数运算符来确定文件,但没有考虑到从 board 数组的最后一行开始将秩添加到 FEN。随后,使用一对嵌套 for
循环解决方案更容易,外循环处理排名,内循环处理文件。
请注意排名如何从 7 迭代到 0 以促进生成的 FEN 中排名的正确顺序。
board3 = [
'R', ' ', 'B', 'K', 'Q', 'B', ' ', 'R',
'P', 'P', 'P', ' ', ' ', 'P', 'P', 'P',
' ', ' ', 'N', ' ', ' ', 'N', ' ', ' ',
' ', ' ', ' ', 'P', 'P', ' ', ' ', ' ',
' ', ' ', ' ', 'p', 'p', ' ', ' ', ' ',
' ', ' ', 'n', ' ', ' ', 'n', ' ', ' ',
'p', 'p', 'p', ' ', ' ', 'p', 'p', 'p',
'r', ' ', 'b', 'k', 'q', 'b', ' ', 'r'
]
let fen='';
for ( let rank = 7; 0 <= rank; rank-- ) {
let emptySquares = 0;
for ( let file = 0; file <= 7; file++ ) {
let p = board3[ rank * 8 + file ];
if ( p === ' ' ) {
emptySquares++;
} else {
if ( emptySquares ) {
fen += emptySquares.toString();
emptySquares = 0;
}
fen += p;
}
}
if ( emptySquares ) {
fen += emptySquares.toString();
}
fen += '/';
}
console.log( fen );
就像您的解决方案尝试一样,空方块简单地求和,直到遇到非空方块或排名末尾,然后将空方块的当前总和添加到 FEN。
我下了一个国际象棋 Program.js,但效果不佳;
我想从板列表中生成 FEN,如下所示
board1 = [
"R", "N", "B", "K", "Q", "B", "N", "Q",
"P", "P", "P", "P", "P", "P", "P", "P",
" ", " ", " ", " ", " ", " ", " ", " ",
" ", " ", " ", " ", " ", " ", " ", " ",
" ", " ", " ", " ", " ", " ", " ", " ",
" ", " ", " ", " ", " ", " ", " ", " ",
"p", "p", "p", "p", "p", "p", "p", "p",
"r", "n", "b", "q", "k", "b", "n", "r"
]
我看过很多例子,但它们都在这样的嵌套列表中
board2 = [
[],
[]
]
而且我的系统无法正常工作
我构建的算法很糟糕,它只适用于起始案例,如“board1”中显示的列表
对于最后一个,它生成这个
rnbkqbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR/
但不是这个例子(在 4 步之后)它只是生成这样的东西(对于板 3)
rbqkbr/pp2ppp2223p33P3222/PP2PPP/RBQKBR/
board3 = ['R', ' ', 'B', 'K', 'Q', 'B', ' ', 'R',
'P', 'P', 'P', ' ', ' ', 'P', 'P', 'P',
' ', ' ', 'N', ' ', ' ', 'N', ' ', ' ',
' ', ' ', ' ', 'P', 'P', ' ', ' ', ' ',
' ', ' ', ' ', 'p', 'p', ' ', ' ', ' ',
' ', ' ', 'n', ' ', ' ', 'n', ' ', ' ',
'p', 'p', 'p', ' ', ' ', 'p', 'p', 'p',
'r', ' ', 'b', 'k', 'q', 'b', ' ', 'r'
]
我想要一种算法,它可以为最后一块板和任何其他板生成正确的 FEN,正确的将是
r1bqkb1r/ppp2ppp/2n2n2/3pp3/3PP3/2N2N2/PPP2PPP/R1BKQB1R/
这是我的算法
function getFEN2(board) {
let result;
let counter = 0; // counter for successive empty cell along the row
let save = []; // temp container
for (a in board) {
index = parseInt(a)
v = board[index];
if (v === " ") {
counter += 1;
// sum up the successive empty cell and update save
if (counter > 1) {
save[save.length - 1] = counter.toString();
} else if (cnt < 1) {
save.push(counter.toString()); // add
}
} else if (v !== " ") {
save.push(v); // add
counter = 0; // reset, there is no successive number
}
if ((index + 1) % 8 === 0) {
save.push("/");
counter = 0;
}
}
result = save.join(""); // convert list to string
return result;
}
// 提前致谢
您的解决方案正确地使用模数运算符来确定文件,但没有考虑到从 board 数组的最后一行开始将秩添加到 FEN。随后,使用一对嵌套 for
循环解决方案更容易,外循环处理排名,内循环处理文件。
请注意排名如何从 7 迭代到 0 以促进生成的 FEN 中排名的正确顺序。
board3 = [
'R', ' ', 'B', 'K', 'Q', 'B', ' ', 'R',
'P', 'P', 'P', ' ', ' ', 'P', 'P', 'P',
' ', ' ', 'N', ' ', ' ', 'N', ' ', ' ',
' ', ' ', ' ', 'P', 'P', ' ', ' ', ' ',
' ', ' ', ' ', 'p', 'p', ' ', ' ', ' ',
' ', ' ', 'n', ' ', ' ', 'n', ' ', ' ',
'p', 'p', 'p', ' ', ' ', 'p', 'p', 'p',
'r', ' ', 'b', 'k', 'q', 'b', ' ', 'r'
]
let fen='';
for ( let rank = 7; 0 <= rank; rank-- ) {
let emptySquares = 0;
for ( let file = 0; file <= 7; file++ ) {
let p = board3[ rank * 8 + file ];
if ( p === ' ' ) {
emptySquares++;
} else {
if ( emptySquares ) {
fen += emptySquares.toString();
emptySquares = 0;
}
fen += p;
}
}
if ( emptySquares ) {
fen += emptySquares.toString();
}
fen += '/';
}
console.log( fen );
就像您的解决方案尝试一样,空方块简单地求和,直到遇到非空方块或排名末尾,然后将空方块的当前总和添加到 FEN。