Ваша условная проверка в настоящее время проверяет, перекрывает ли пара координат randX
и randY
одну из двух точек.Вы можете инвертировать логику в своем коде, перемещая блок, который вы пропускаете, с помощью continue
внутри if
.
Инверсия заключается в проверке того, действительно ли randX
и randY
делают не перекрывают одну из двух точек, либо отрицая предыдущее условное, либо, что намного чище, переворачивая ===
на !==
и &&
на ||
:
do {
const randX = randomNumberBetween(0, 9);
const randY = randomNumberBetween(0, 9);
if ((randX !== x1 || randY !== y1) && (randX !== x2 || randY !== y2)) {
matrix[randX][randY] = 'Obstacle';
placedBlocks += 1;
}
} while (placedBlocks < blocks);
matrix[x1][y1] = 'Start';
matrix[x2][y2] = 'Goal';
return matrix;
Вотрабочая демонстрация логической эквивалентности:
const valid = (randX, randY, x1, x2, y1, y2) =>
(randX !== x1 || randY !== y1) &&
(randX !== x2 || randY !== y2)
;
const valid2 = (randX, randY, x1, x2, y1, y2) =>
!((randX === x1 && randY === y1) ||
(randX === x2 && randY === y2))
;
console.log(
[
[1, 1, 1, 1, 1, 1],
[1, 1, 1, 2, 2, 2],
[1, 1, 2, 1, 2, 2],
[1, 1, 2, 2, 1, 2],
[1, 1, 2, 2, 2, 1],
[1, 1, 1, 1, 2, 2],
[1, 1, 2, 2, 1, 1],
[1, 1, 2, 1, 1, 2],
[1, 1, 1, 2, 2, 1],
[1, 1, 2, 2, 2, 2]
].map(e => valid(...e) === valid2(...e))
.every(e => e)
);