0

我正在尝试为国际象棋创建一个 FEN 符号转换器。我已经决定解决这个问题的最佳方法是从字符串中删除我不需要的任何不必要的值。这是它的样子。

rnbqkbnr/pppppppp/8/

这些都是我的代码中的字符串。我已经找到了每个文件末尾的解决方案,它由/字符串中的 表示。但我的新问题是去掉数字值并添加回空白方块以覆盖它们。

当您在 FEN 中看到一个数字时,这实际上是国际象棋桌上有多少个空方格,直到另一个棋子。我的想法再次为自己简化,是将这些数字转换811111111一系列数字,代表每个必须为空的正方形。

虽然在实践中,我假设我只能退出并开始用 填充该索引splice,这似乎是可行的选择,但不幸的是,当将数字移动到不同的地方时会出现相当多的错误。81

有人会有更好的选择吗?是的,我知道已经有库可以做到这一点,但是如果你不尝试重新发明轮子,那么编码的乐趣是什么。

correctFen 函数 - 映射字符串以查找任何数字

  const correctFen = () => {
    newFen.map((pos, index) => {
      if (Number(pos) && pos !== '/'){
        for (let i = 0; i < Number(pos); i++) {
          console.log('firing')
          setNewFen(addAfter(newFen, index + i, '1'))
        }
      }
    })
    console.log(newFen)
    figureOutPos()
  }

在看了这个之后,它并没有真正删除我想要的索引,这可能是一个问题,它1在最后一个之后添加了 s/

function addAfter(array, index, newItem) {
  return [
    ...array.slice(0, index),
    newItem,
    ...array.slice(index)
  ];
}
4

1 回答 1

0

看起来您正在newFenmap回调中进行修改。这确实会弄乱索引,因为当前索引之后的所有内容都会发生变化。

相反,从map回调中返回新字符。在大多数情况下,这将是原始字符,但如果它是一个数字,您将返回一个由多个字符组成的字符串。然后将数组再次连接成一个字符串。

像这样的东西:

// Assuming newFen is a string in some outer scope.
const correctFen = () => {
  const correctedFen = newFen
    // Split the string into an array of single characters.
    .split('')
    // Apply a function to each character and gather the results in an array.
    .map((char, _index) => {
      // Try to parse `char` as an integer.
      const number = parseInt(char)
      if (isNaN(number)) {
        // `char` is not a digit. Return the character itself.
        return char
      } else {
        // `char` is a digit. Return a string of that many 1s.
        return '1'.repeat(number)
      }
    })
    // Join the array back into a string.
    .join('')
  setNewFen(correctedFen)
}
于 2021-07-06T06:53:41.600 回答