Я делаю игру в крестики-нолики, и у меня проблема. Я заметил, что выигрышная ситуация - это когда есть 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]), но я понятия не имею, как искать одинаково разные числа в массивах.
Возможно, лучше было бы представить вашу доску в виде двухмерного массива 3x3, а не в виде одномерного массива.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Что-то вроде этого могло бы сработать.
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
}
эта функция ищет отличия, равные первой?
Он возвращает истину, если есть как минимум три элемента и разница между каждым последующим элементом такая же.
Вы можете создать две функции: одну для генерации массива «различий», а другую - для проверки совпадения всех этих чисел. См. Код ниже:
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;
}
Надеюсь, это поможет!
@JohnColeman, я имею в виду n, n + y, n + 2y