Нахождение наиболее близкой комбинации к текущей - PullRequest
0 голосов
/ 30 апреля 2019

В настоящее время я строю крестики-нолики в ванильном 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 ]

2 голосов
/ 30 апреля 2019

Вы можете взять 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 голос
/ 30 апреля 2019

Сначала сопоставьте 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...