如何从 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。