我目前正在用香草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);
}
});
}
但是这没有按预期工作:(
答案 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);