Я работаю над версией пятнадцатой головоломки (http://en.wikipedia.org/wiki/15_puzzle), используя html и javascript (без JQuery). Для разработки основных функций я создал сетку 9 x 9. У меня есть восемь цветных изображений 100 x 100 пикселей (id = box1 через box8) и один 100 x 100 px белый или «пустой» бокс (boxW). Это девять плиток в моей сетке. Я выяснил, как перемещать смежную плиту изображения в пустую плитку и как выделить границу плитки, которая может перемещаться. Теперь я пытаюсь создать функцию, которая будет перемешивать плитки в начале игры. Я выбираю случайный квадрат и вижу, является ли он подвижным, сравнивая его поля с полями пустой плитки. Если это так, я перемещаю его и повторяю. Проблема в том, что мой цикл for-loop, кажется, выходит после нескольких шагов - иногда 1, иногда 20, но не 100 или 500 или 1000, независимо от верхнего предела, установленного для цикла. Я создал функцию администратора, чтобы распечатать, что происходит. Я попытался добавить «продолжить» в разных точках в предположении, что что-то о моих высказываниях «if» выбивает его из цикла, но это, похоже, не помогает. Я уверен, что мне не хватает чего-то очевидного, но я не вижу этого. (Кстати, «tileHold» - это попытка избежать обратного хода последнего хода.) Любая обратная связь будет принята с благодарностью. Благодарю.для петли уходит рано
Вот моя функция, а также пример выхода администратора:
function shuffle(){
var tileHold=boxW;
for(var i=1;i<1000;i++){
var tile = "box"+(Math.round(Math.random() * 8));
if (tile != tileHold){
var toppx = document.getElementById(tile).style.marginTop;
var leftpx =document.getElementById(tile).style.marginLeft;
var top = toppx.substring(0,3);
var left = leftpx.substring(0,3);
var topWpx = document.getElementById("boxW").style.marginTop;
var leftWpx = document.getElementById("boxW").style.marginLeft;
var topW = topWpx.substring(0,3);
var leftW = leftWpx.substring(0,3);
if (((top===topW) && ((Math.abs(left-leftW))<200)) || ((left===leftW) && ((Math.abs(top-topW))<200))) {
document.getElementById(tile).style.marginTop = topWpx;
document.getElementById(tile).style.marginLeft = leftWpx;
document.getElementById("boxW").style.marginTop = toppx;
document.getElementById("boxW").style.marginLeft = leftpx;
document.getElementById("guess_2").innerHTML = guess_2.innerHTML+tile+" <br />";
}
document.getElementById("guess_2").innerHTML = guess_2.innerHTML+tile+" i="+ i+ " <br />";
}
tileHold=tile;
}
}
А вот пример вывода, в том числе плитки, которая была перемещена (например, box7) и цикл обратной связи. На этот раз перед выходом было одиннадцать циклов. Как вы можете видеть, верхний предел петли 1000.
Admin box7 i=1
box6
box6 i=2
box2 i=4
box5
box5 i=5
box7 i=6
box6 i=7
box3 i=8
box1 i=10
box6 i=11
есть ли у вас какие-либо ошибки? Возможно, это причина его выхода – DevelopmentIsMyPassion
Можете ли вы сделать демо jsfiddle? – Barmar
Просто запустите это под отладчиком. В коде есть много ошибок. В частности, вызовы подстроки, которые вы делаете, могут быть над строками, длина которых меньше 3 символов. Кроме того, вы не должны вычитать две строки друг от друга, например, смотрите «Math.abs (left-leftW)». Вы передаете результат вычитания 2 строк в абсолютную функцию. Сначала вы shuold преобразуете значения в Numbers, а затем проверьте разницу. – Ameen