Искать одинаково разные числа в массиве

Я делаю игру в крестики-нолики, и у меня проблема. Я заметил, что выигрышная ситуация - это когда есть 3 числа, которые одинаково разные (например, «0,1,2» (1-0 = 1, 2-1 = 1) или «0,4,8» (4- 0 = 4, 8-4 = 4) или «1,4,7» (4-1 = 3, 7-4 = 3), если я начинаю отсчет с «0»). Цифры - координаты ящиков от 0 до 8.

Понятия не имею, как проверить, есть ли такие числа.

//html
<div class = "container">
    <div class = "box"></div>
    <div class = "box"></div>
    <div class = "box"></div>
    <div class = "box"></div>
    <div class = "box"></div>
    <div class = "box"></div>
    <div class = "box"></div>
    <div class = "box"></div>
    <div class = "box"></div>
</div>


//js
const BOXES = document.querySelectorAll('.box');
let turn = true;
let opened = [1, 1, 1, 1, 1, 1, 1, 1, 1];
let x = [];
let o = [];

for (let i = 0; i < BOXES.length; i++) {
    BOXES[i].addEventListener('click', () => {
        if (turn == true && opened[i] == 1) {
            BOXES[i].innerHTML = "<p>X</p>";
            x.push(i);
            x.sort();
        }
        if (turn == false && opened[i] == 1) {
            BOXES[i].innerHTML = "<p>O</p>";
            o.push(i);
            o.sort();
        }
        opened[i] = 0;
        turn = !turn
    })
} 

Я собираюсь вставить все координаты x в массив «x» (x.push [i]) и вставить координаты o в массив «o» (o.push [i]), но я понятия не имею, как искать одинаково разные числа в массивах.

@JohnColeman, я имею в виду n, n + y, n + 2y

Amady 11.01.2019 17:39

Возможно, лучше было бы представить вашу доску в виде двухмерного массива 3x3, а не в виде одномерного массива.

John Coleman 11.01.2019 17:41
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
2
44
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Что-то вроде этого могло бы сработать.

function didWin(arr) {
    let len = arr.length; // I like checking length once because it's O(n). Probably won't matter for your game, though.
    if (len < 3)
      return false; // No win if less than 3 moves
    var firstDiff = arr[1] - arr[0];
    for (var i = 1; i < len - 1; ++i) { // We don't check the first (already done) or the last (no arr[len] element)
        if (arr[i+1] - arr[i] != firstDiff)
            return false; // We know we are done as soon as the difference is not equal
    }
    return true; // We have now checked that all differences are equal
}

эта функция ищет отличия, равные первой?

Amady 12.01.2019 09:33

Он возвращает истину, если есть как минимум три элемента и разница между каждым последующим элементом такая же.

Austin Mullins 15.01.2019 00:04
Ответ принят как подходящий

Вы можете создать две функции: одну для генерации массива «различий», а другую - для проверки совпадения всех этих чисел. См. Код ниже:

const array = [1, 4, 7];

// Function to get differences
function getDiffs(array) {
  let diffs = [];
  for(let i=0; i<array.length; i++) {
    if (i > 0) {
      diffs.push(array[i] - array[i-1]);
    }
  }
  return diffs;
}

// Function to compare those numbers to see if they are the same
function checkSameValue(diffs) {
  let item = diffs[0];
  for(let i=0; i< diffs.length; i++) {
    if (diffs[i] !== item) {
      return false;
    }
  }
  return true;
}

Надеюсь, это поможет!

Другие вопросы по теме