首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在unNested中从JavaScript棋盘列表中提取FEN

如何在unNested中从JavaScript棋盘列表中提取FEN
EN

Stack Overflow用户
提问于 2021-12-12 14:22:43
回答 1查看 145关注 0票数 1

我做了一个国际象棋Program.js,它不能很好的工作;

我想从看起来像这样的董事会列表中生成FEN

代码语言:javascript
复制
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"
]

我见过很多例子,但它们都出现在嵌套列表中,如

代码语言:javascript
复制
board2 = [
    [],
    []
]

只是我的系统不起作用

我构建的算法很糟糕,它只是在处理开始的情况,就像显示"board1“的列表一样。

对于最后一个,它会生成以下内容

rnbkqbnr/PPPPPPPP/8/8/8/PPPPPPPP/RNBQKBNR/

但不是这样的,例如(在4次移动之后),它只生成这样的东西(对于第3版)

RBQKBR/pp2pp2223p33P3222/PP2PPP/RBQKBR/

代码语言:javascript
复制
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'
        ]

我想要一个算法,为最后一块板和任何其他板生成正确的分号,正确的算法是

r1bqkb1r/ppp2ppp/2n2n2/3pp3/3PP3/2N2N2/PPP2PPP/R1BKQB1R/

这是我的算法

代码语言:javascript
复制
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;

}

//预先谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-06 01:06:29

您的解决方案正确地使用模数运算符来确定文件,但没有考虑将级别添加到FEN中,从板数组的最后一行开始。随后,使用一对嵌套的for循环解决方案更容易,外部循环处理级别,内部循环处理文件。

请注意秩是如何从7迭代到0的,以便于在结果的FEN中排序。

代码语言:javascript
复制
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中。

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

https://stackoverflow.com/questions/70324403

复制
相关文章

相似问题

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