2:47 - В алгоритме ошибка. Такое перемешивание дает неразрешимые ситуации, т.к. в пятнашках важно сохранять паритет. Для этого число свапов должно быть чётным, при этом нельзя включать пустую клетку в такой алгоритм, т.к. перемещение пустой клетки сбивает корректность подсчета количества свапов (перемещение двух чисел не тоже самое, что и перемещение пустой клетки, например, в соседнее число, результаты непредсказуемы). Если обязательно нужно замешать пустую клетку, далее можно сгенерировать два случайных числа, и переместить ее в матрице по горизонтали и вертикали, таким образом можно корректно получить случайные состояния.
@dphdmn5 ай бұрын
function getScramble(n) { let arr = Array.from({ length: n * n - 1 }, (_, i) => i + 1), parity = false; for (let i = 0; i < n * n - 3; i++) { let t = Math.floor(Math.random() * (n * n - 1 - i)) + i; if (i !== t) parity = !parity; [arr[i], arr[t]] = [arr[t], arr[i]]; } if (parity) [arr[n * n - 3], arr[n * n - 2]] = [arr[n * n - 2], arr[n * n - 3]]; arr.push(0); let g = n * n - 1, d = Math.floor(Math.random() * n), r = Math.floor(Math.random() * n); for (let i = 0; i < d; i++, g -= n) [arr[g], arr[g - n]] = [arr[g - n], arr[g]]; for (let i = 0; i < r; i++, g -= 1) [arr[g], arr[g - 1]] = [arr[g - 1], arr[g]]; return arr; } getScramble(4)
@tipichnyj_web_razrabotchik5 ай бұрын
Привет. Огромное спасибо за комментарий. Похоже надо глубже изучать материал перед началом разработки. Сделал пошаговое перемешивание в 200 ходов.
@falcon94q3 ай бұрын
Молодец
@vadimkh5 ай бұрын
надо учесть, что не каждый случайный набор возможно собрать в данной головоломке. есть алгоритм, проверяющий такую возможность, но я бы реализовал тасовку как просто 100 ходов в случайном направлении от пустого поля, кроме обратного хода.
@tipichnyj_web_razrabotchik5 ай бұрын
Привет. Я так и сделал. Исправил функцию на гите проекта. Сделал 200 случайных ходов от пустого поля. Не нашел как добавить текстовую подсказку в видео чтобы не перезаливать.