У меня есть функция рисования лабиринта, которая не работает, как мне хотелось бы. В настоящее время он работает, беря среднюю точку, затем нахожу положения сверху, снизу, слева и справа от нее и помещая их в массив. Затем он проверяет, находится ли какая-либо из них вне решетки лабиринта и удаляет их из массива. Затем он проверяет, были ли какие-либо из них уже посещены (это будет функция лабиринта, но прямо сейчас она просто рисует длинную пунктирную линию) и удаляет их из массива.
Затем, если нет параметров, оставшихся он завершает работу или возвращается, в противном случае он нарисует цветной квадрат и снова запустит эту функцию.
Вы можете увидеть это здесь, в настоящее время у меня есть сетка очень маленькая, чтобы усилить 2 проблемы, которые я получаю:
он очень часто думает, что отрицательные координаты в порядке. Это заставляет меня думать, что что-то очень не так с линиями:
if(options[i][0]<0 || options[i][1]<0 || options[i][0]>size-1 || options[i][1]>size-1){
// ... let us know that you're removing them...
console.log("splicing: out of bounds "+options[i][0]+","+options[i][1]);
// ... then remove them
options.splice(i, 1);
он также очень часто не замечает, что квадрат уже был посещен, и напишет над ними, что заставляет меня думать, что эта строка работает не так, как ожидалось:
if(options.length > 0){
Если вы запускаете консоль, есть много выходных данных, которые объясняют некоторые из того, что происходит, если оно работает нормально, просто нажмите обновление несколько раз, и это пойдет не так - особенно если он попадает в верхний правый угол на ранней стадии,
Мой текущий код находится здесь: http://djave.co.uk/hosted/maze/js/script.js, но если это помогает, есть также zip файл всего на http://djave.co.uk/hosted/лабиринт/maze.zip
Если вы хотите, чтобы я прояснил что-либо просто комментарий.
NB он должен пропустить квадрат в данный момент, поэтому он не будет непрерывной линией.
Проблема в том, что вы сращиваете тот же массив, который вы повторяете. Таким образом, во второй итерации цикла, когда x=4, y=0
вы имеете следующее:
i=1, options[[2,0],[6,0],[4,-2],[4,2]]
После того, как вы соедините второй вариант, массив изменится, и для третьей итерации у вас будет следующее:
i=2, options[[2,0],[4,-2],[4,2]]
Обратите внимание, что [4,-2]
пропускается. Самым простым решением для этого было бы использовать $.grep
options = $.grep(options, function(option, index) {
return option[0]>=0 && option[0]<size && option[1]>=0 && option[1]<size;
});
Это приведет к итерации по массиву и возвращает массив объектов, где grep возвращает true
. Вы также должны делать то же самое, что и при переходе по уже посещенным площадям.
for(i=options.length-1; i>=0;i--){