寻找与当前正在进行的最接近的组合

时间:2019-04-30 06:56:18

标签: javascript arrays filter

我目前正在用香草javascript构建井字游戏。但是游戏已经“完成”了,但是我试图增加难度。因此,基本上我想做的就是在每个球员的举动上,根据他的举动获得最接近的获胜组合,并将计算机的标记放置在失踪的获胜组合位置。

假设我的获奖组合具有多维数组

winningCombinations: [
        [0, 1, 2],
        [3, 4, 5],
        [6, 7, 8],
        [0, 4, 8],
        [0, 3, 6],
        [1, 4, 7],
        [2, 4, 6],
        [2, 5, 8]
    ]

玩家X开始移动。所以他的第一步是0,因此将玩家当前的组合保存在数组中。因此,首先移动当前梳子是

currentPlayerCombintation: [0]

所以我想从获胜组合的数组中返回[0,1,2],[0,4,8]和[0,3,6]。

但是玩家第二步走了,所以他以4为目标

currentPlayerCombination: [0,4]

现在我想返回最接近的获胜组合[0,4,8]。

我尝试了很多事情,包括every()some()filter(),但是无法实现我想要的东西。

我尝试过

    for(let i = 0; i < this.currentPlayerCombination.length ; i++) {
            this.winningCombinations.some((arr) => {
                if(arr.includes(this.currentPlayerCombination[i])) {
                    console.log(arr);
                }
            });
        }

但是这没有按预期工作:(

2 个答案:

答案 0 :(得分:2)

您可以使用Set并映射匹配项的数量,获取最大数量并过滤数组。

function getWinningPositions(pos) {
    var posS = new Set(pos),
        temp = winningCombinations.map(a => [a, a.reduce((c, v) => c + posS.has(v), 0)]),
        max = Math.max(...temp.map(({ 1: c }) => c))
    return temp
        .filter(({ 1: c }) => c === max)
        .map(([a]) => a);
}

var winningCombinations = [[0, 1, 2], [3, 4, 5], [6, 7, 8], [0, 4, 8], [0, 3, 6], [1, 4, 7], [2, 4, 6], [2, 5, 8]];

console.log(getWinningPositions([0]).map(a => a.join(' ')));
console.log(getWinningPositions([0, 4]).map(a => a.join(' ')));
console.log(getWinningPositions([0, 4, 5]).map(a => a.join(' ')));
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:1)

首先将winningCombinations映射到一个数组,其编号只是尚未被选择 的数字。然后,找到这些数组的最短长度,然后可以确定最接近winningCombinations的原始currentPlayerCombination

const winningCombinations = [
  [0, 1, 2],
  [3, 4, 5],
  [6, 7, 8],
  [0, 4, 8],
  [0, 3, 6],
  [1, 4, 7],
  [2, 4, 6],
  [2, 5, 8]
];
const currentPlayerCombination = [0, 4];

// eg: get [[1, 2], [3, 5,], [6, 7, 8], [8], ...]
const winningCombsWithoutCurrent = winningCombinations.map(arr => (
  arr.filter(num => !currentPlayerCombination.includes(num))
));
// eg: here, lowestLength should be 1, because [8] has a length of 1
const lowestLength = winningCombsWithoutCurrent.reduce((a, { length }) => Math.min(a, length), 3);

const combosWithLowestLength = winningCombsWithoutCurrent
  .reduce((a, { length }, i) => {
    if (length === lowestLength) {
      a.push(winningCombinations[i]);
    }
    return a;
  }, []);
console.log(combosWithLowestLength);