Ошибка кода лабиринта JavaScript

0

У меня есть функция рисования лабиринта, которая не работает, как мне хотелось бы. В настоящее время он работает, беря среднюю точку, затем нахожу положения сверху, снизу, слева и справа от нее и помещая их в массив. Затем он проверяет, находится ли какая-либо из них вне решетки лабиринта и удаляет их из массива. Затем он проверяет, были ли какие-либо из них уже посещены (это будет функция лабиринта, но прямо сейчас она просто рисует длинную пунктирную линию) и удаляет их из массива.

Затем, если нет параметров, оставшихся он завершает работу или возвращается, в противном случае он нарисует цветной квадрат и снова запустит эту функцию.

Вы можете увидеть это здесь, в настоящее время у меня есть сетка очень маленькая, чтобы усилить 2 проблемы, которые я получаю:

  1. он очень часто думает, что отрицательные координаты в порядке. Это заставляет меня думать, что что-то очень не так с линиями:

    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);
    
  2. он также очень часто не замечает, что квадрат уже был посещен, и напишет над ними, что заставляет меня думать, что эта строка работает не так, как ожидалось:

    if(options.length > 0){
    

Если вы запускаете консоль, есть много выходных данных, которые объясняют некоторые из того, что происходит, если оно работает нормально, просто нажмите обновление несколько раз, и это пойдет не так - особенно если он попадает в верхний правый угол на ранней стадии,

Мой текущий код находится здесь: http://djave.co.uk/hosted/maze/js/script.js, но если это помогает, есть также zip файл всего на http://djave.co.uk/hosted/лабиринт/maze.zip

Если вы хотите, чтобы я прояснил что-либо просто комментарий.

NB он должен пропустить квадрат в данный момент, поэтому он не будет непрерывной линией.

Теги:
algorithm
maze

1 ответ

4
Лучший ответ

Проблема в том, что вы сращиваете тот же массив, который вы повторяете. Таким образом, во второй итерации цикла, когда 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. Вы также должны делать то же самое, что и при переходе по уже посещенным площадям.

  • 0
    Аааа ... это так важно! Спасибо за вашу помощь.
  • 0
    Другой вариант состоял в том, чтобы просто поменять цикл for, чтобы начать с конца и считать в обратном порядке - for(i=options.length-1; i>=0;i--){

Ещё вопросы

Сообщество Overcoder
Наверх
Меню