Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   проблема с рекурсией, не могу понять почему скрипт не выходит из неё. (https://javascript.ru/forum/misc/6801-problema-s-rekursiejj-ne-mogu-ponyat-pochemu-skript-ne-vykhodit-iz-nejo.html)

Flirer 23.12.2009 18:48

проблема с рекурсией, не могу понять почему скрипт не выходит из неё.
 
Здравствуйте.

Изучаю javascript, пишу небольшие скрипты, чтобы освоить основы и привыкнуть к синтаксису. Сейчас описываю модель движения корабля в двухмерном пространстве, задача состоит в том, чтобы подсветить клетки на которые корабль может перейти.
Смысл в том, чтобы корабль не мог повернуться на месте, то-есть он всегда идёт вперёд и может начать поворачивать. Сейчас задача только в том чтобы подсветить нужные ячейки в таблице.
Логика такова:
у коробля етсь параметры:
speed, turnSpeed, turnSpeedRate.
когда корабль пересекает количество клеток равное turnSpeedRate, у него появляется возможность сместиться вправо или влево. Подствечиваются дополнительные ячейки по бокам. Всего он может пересеч количество ячеек, равное speed.
Рекурсия находится в функцие moveFieldTurn.
http://phpsandbox.freevar.com/1/ - вот тут находится html файл, в который втсроен скрипт, и сам скрипт: http://phpsandbox.freevar.com/1/script.js

window.onload = tableDraw;
document.loopSize = 10;
ship=0;
function initAll() {
	document.onload = tableDraw;
}

function tableDraw() {
	document.fieldH = 30;
	document.fieldV = 30;
	var field = document.getElementById("field");
	for (var i=0;i<document.fieldV;i++){
		field.innerHTML = field.innerHTML + rowDraw(i);
	}

	uPosini();
}

function rowDraw(j) {
	var rows = "<tr>";
	for (var i=0;i<document.fieldH;i++){
		rows = rows + "<td id='v"+j+"h"+i+"' class='none'></td>";
	}
	rows = rows + "</td>";
	return rows;
}

function uPosini () {
	cordH = Math.floor(Math.random() * document.fieldH);
	cordV = Math.floor(Math.random() * document.fieldV);
	var position = "v" + cordV  + "h" + cordH;
	document.getElementById(position).className = "ship";
	shipIni(cordH, cordV);
	}
function shipIni() {
	ship = getElementsByClassName("ship");
	speed  = 13;
	turnSpeed = 1;
	turnSpeedRate = 3;
	alignAngle = 1;
	moveFieldIni();
}

function getElementsByClassName(classname, node) {
	if(!node) node = document.getElementsByTagName("body")[0];
	var a = [];
	var re = new RegExp('\\b' + classname + '\\b');
	var els = node.getElementsByTagName("*");
	for(var i=0,j=els.length; i<j; i++)
	if(re.test(els[i].className))a.push(els[i]);
	return a;
}

function moveFieldIni () {
	shipDate();	
	document.body.innerHTML += "<p>cords=" + cordV +"__"+ cordH+ "</p>"
	var turn=0;
	for (i=0;i!=speed;i++){
		var position = "v"+cordV+"h"+(cordH+i+1);
		if (document.getElementById(position)) {
			document.getElementById(position).className = "moveable";
			turn++;
			/*document.body.innerHTML += "<p>position befor turn=" + position + "</p>"*/
			if (turn==turnSpeedRate) {
				moveFieldTurn(i);
				var turn=0;
			}	
			/*document.body.innerHTML += "<p>position after turn=" + position + "</p>"*/
		}
	}	
}
function moveFieldTurn(turn){
	var rotate=0;
	for (var j=0;j!=(speed-turn);j++) {
	var positionInTurn = "v"+(cordV+1)+"h"+(cordH+turn+j+1);	
	if (document.getElementById(positionInTurn)){
		document.getElementById(positionInTurn).className = "moveable";
			if (rotate==turnSpeedRate) {
				moveFieldTurn(i);
				var rotate=0;
			}
			rotate++;
		}
		
	}
}

function shipDate() {

	document.body.innerHTML += "<p>speed=" + speed + "</p>"
	document.body.innerHTML += "<p>turnSpeed=" + turnSpeed + "</p>"
	document.body.innerHTML += "<p>turnSpeedRate=" + turnSpeedRate + "</p>"
	document.body.innerHTML += "<p>cordV=" + ship.cordV + "</p>"
	document.body.innerHTML += "<p>cordH=" + ship.cordH + "</p>"
}


Спасибо, прошу помощи, никак не могу понять в чём проблема.

x-yuri 23.12.2009 19:27

отлаживать пробовал?

Flirer 23.12.2009 19:55

Цитата:

Сообщение от x-yuri (Сообщение 38977)
отлаживать пробовал?

А чем порекомендуешь отлаживать? я совсем новичок в программировании, не понял как дебагать firebug'ом, я могу по очереди выполнять функции и контролировать переход от одной к другой только не понял где смотреть результат и что вообще искать.

x-yuri 23.12.2009 20:03

справа на первой вкладке. Но тут, думаю, лучше логирование подойдет. Что-то типа того что ты делал с помощью innerHTML, только используя console.log. Результаты будут попадать на вкладку Консоль

Flirer 23.12.2009 20:23

а как это логирование делать?

x-yuri 24.12.2009 01:01

я ж говорю. То, что ты делал с помощью innerHTML удобнее делать с помощью console.log


Часовой пояс GMT +3, время: 00:13.