Показать сообщение отдельно
Старый 30.08.2007, 23:41
VovkaMorkovka вне форума Посмотреть профиль Отправить личное сообщение для VovkaMorkovka Найти все сообщения от VovkaMorkovka
  № 1  
Ответить с цитированием
VovkaMorkovka

Регистрация: Apr 2006
Сообщений: 421
По умолчанию Непонятная мне ошибка

Здравствуйте господа.
Вот начал работать с AS 3.0 и натолкнулся на исключение, которое мне порато сильно непонятно. Гуглил, но сносного ответа не дал

Вот текст самой ошибки
Код:
TypeError: Error #1010: A term is undefined and has no properties.
	at classes::Model/branchAndBoundAlgorithm()
	at classes::Model/branchAndBoundAlgorithm()
	at classes::Model/branchAndBoundAlgorithm()
	at classes::Model/branchAndBoundAlgorithm()
	at classes::Model/findBestMove()
	at classes::Model/update()
	at Function/http://adobe.com/AS3/2006/builtin::apply()
	at ()
	at flash.utils::SetIntervalTimer/flash.utils:SetIntervalTimer::onTimer()
	at flash.utils::Timer/flash.utils:Timer::_timerDispatch()
	at flash.utils::Timer/flash.utils:Timer::tick()
Вот код моего класса, он длинный но что делать.

Код:
package classes{
	import flash.events.EventDispatcher;
	import flash.events.Event;
	import classes.game_events.GameEvent;
	
	
	
		
	public class Model extends EventDispatcher 
	{
		//Это массив клеток на которые разбито игровое поле, 
		//По этому массиву осуществляется поиск пути к игроку
		//Клетки с номерами >0 считаются непроходимыми
		public var arrayOfCells:Array;
		//Массив существ, каждое существо занимает определенную клетку в 
		//массиве или движется от одной клетки к другой
		public var arrayOfCreatures:Array;
		//Массив стоимостей пути к выбранной вершине
		//Если стоимость пути к вершине больше уже найденной, то 
		private var arrayOfCost:Array;
		private var startX:Number=3;
		private var startY:Number=3;
		
		public function Model()
		{
			arrayOfCells=new Array();
			for (var i:Number=0;i<SetParameters.GAME_HEIGHT;i++){
				var tmp:Array=new Array();
				for (var j:Number=0;j<SetParameters.GAME_WIDTH;j++){
					tmp.push(0);
				}
				
				
				arrayOfCells.push(tmp);
			}
			
			for (var i:Number=0;i<Math.floor(SetParameters.GAME_WIDTH/2);i++){
				arrayOfCells[Math.floor(SetParameters.GAME_HEIGHT/2)][i]=1;	
			}
		}
		
		
		public function update():void{
			
			
				var object:Object=findBestMove(startX,startY,8,8);
				startX=object.stepX;
				startY=object.stepY;
				trace("startX:"+startX+" startY:"+startY);
			
			
			dispatchEvent(new GameEvent());
		}
		
		public function getArrayOfCells():Array{
			return arrayOfCells;
		}	
		//Ф - ция возвращает путь куда нужно повернуть для выбранного бота
		//theX,theY - координаты той точки, из которой производится поиск
		//Ф - ция возвращает объект с точкой в которую необходимо переместиться
		
		
		public function findBestMove(theX:Number,theY:Number,targetX:Number,targetY:Number):Object{
			arrayOfCost=SetParameters.getArrayOfCostNum();
			if ((theX>=SetParameters.GAME_WIDTH) || (theX<0) || (theY >= SetParameters.GAME_HEIGHT) || (theY<0)) return null;		
				
			var len1:Number=branchAndBoundAlgorithm(theX,theY,theX+1,theY,targetX,targetY,3,0,10);
			//
			var len2:Number=branchAndBoundAlgorithm(theX,theY,theX-1,theY,targetX,targetY,3,0,10);
     		//
			var len3:Number=branchAndBoundAlgorithm(theX,theY,theX,theY+1,targetX,targetY,3,0,10);
   		    //
			var len4:Number=branchAndBoundAlgorithm(theX,theY,theX,theY-1,targetX,targetY,3,0,10);
   		    //
			var len5:Number=branchAndBoundAlgorithm(theX,theY,theX+1,theY+1,targetX,targetY,3,0,14);
					//
					
			var len6:Number=branchAndBoundAlgorithm(theX,theY,theX+1,theY-1,targetX,targetY,3,0,14);
					//
			var len7:Number=branchAndBoundAlgorithm(theX,theY,theX-1,theY+1,targetX,targetY	,3,0,14);
					//
			var len8:Number=branchAndBoundAlgorithm(theX,theY,theX-1,theY-1,targetX,targetY,3,0,14);
					
			var tmpArray:Array=new Array();
					//
			tmpArray.push(len1);
			tmpArray.push(len2);
			tmpArray.push(len3);
			tmpArray.push(len4);
			tmpArray.push(len5);
			tmpArray.push(len6);
			tmpArray.push(len7);
			tmpArray.push(len8);
				
			var minElement:Number=arrayCompare(tmpArray);
				
			if (minElement==len1) return {stepX:theX+1,stepY:theY};
			if (minElement==len2) return {stepX:theX-1,stepY:theY};
			if (minElement==len3) return {stepX:theX,stepY:theY+1};
			if (minElement==len4) return {stepX:theX,stepY:theY-1};
			if (minElement==len5) return {stepX:theX+1,stepY:theY+1};
			if (minElement==len6) return {stepX:theX+1,stepY:theY-1};
			if (minElement==len7) return {stepX:theX-1,stepY:theY+1};
			if (minElement==len8) return {stepX:theX-1,stepY:theY-1};
			return {stepX:theX+1,stepY:theY+1};										
		}
		//Рекурсивная ф - ция возвращающая минимальную длинну найденного пути
		//previousX,previousY - координаты предидущей клетки
		//В них ф - ция не возвращается экономя тем самым процессорное время
		//theX,theY - координаты текущей клетки
		//targetX,targetY - целевая клетка
		//maxDepth - максимальная глубина поиска
		//currentCost - cтоимость перехода в текущую клетку
		
		public function branchAndBoundAlgorithm(previousX:Number,
												previousY:Number,
												theX:Number,
												theY:Number,
												targetX:Number,
												targetY:Number,
												maxDepth:Number,
												currentDepth:Number,
												currentCost:Number):Number{
			//trace("maxDepth:"+maxDepth+" currentDepth:"+currentDepth);
			if ((theX>SetParameters.GAME_WIDTH) || (theX<0) || (theY>SetParameters.GAME_HEIGHT) ||
				//Максимальное число очень большое, 
				//Поэтому в дальнейшем от него нужно избавиться 
				//чтобы не тормозить вычисления
				(theY<0)) return Number.MAX_VALUE;
				
				//Если эта клетка уже была посещена, 
				//и пройденное расстояние меньше, то не имеет смысла далее двигаться в этом направлении
				//Иначе присваиваем клетке минимальную длинну
				if ((arrayOfCost[theY][theX]<currentCost) || (arrayOfCells[theY][theX]!=0)){
					//trace("Вернули максимальное значение:"+" arrayOfCost[theY][theX]:"+arrayOfCost[theY][theX]+" arrayOfCells[theY][theX]:"+arrayOfCells[theY][theX]);
					return Number.MAX_VALUE;
				}else {
					arrayOfCost[theY][theX]=currentCost;
				}
				
				if ((theX==targetX) && (theY==targetY)) return currentCost; 
				//
				if (currentDepth>=maxDepth){
					//trace("theX:"+theX+" theY:"+theY);
					return currentCost+evristicFunction(theX,theY,targetX,targetY);
				}else{
					var len1:Number=branchAndBoundAlgorithm(theX,theY,theX+1,theY,targetX,targetY,maxDepth,currentDepth+1,currentCost+10);
					//
					var len2:Number=branchAndBoundAlgorithm(theX,theY,theX-1,theY,targetX,targetY,maxDepth,currentDepth+1,currentCost+10);
					//
					var len3:Number=branchAndBoundAlgorithm(theX,theY,theX,theY+1,targetX,targetY,maxDepth,currentDepth+1,currentCost+10);
					//
					var len4:Number=branchAndBoundAlgorithm(theX,theY,theX,theY-1,targetX,targetY,maxDepth,currentDepth+1,currentCost+10);
					//
					var len5:Number=branchAndBoundAlgorithm(theX,theY,theX+1,theY+1,targetX,targetY,maxDepth,currentDepth+1,currentCost+14);
					//
					
					var len6:Number=branchAndBoundAlgorithm(theX,theY,theX+1,theY-1,targetX,targetY,maxDepth,currentDepth+1,currentCost+14);
					//
					var len7:Number=branchAndBoundAlgorithm(theX,theY,theX-1,theY+1,targetX,targetY,maxDepth,currentDepth+1,currentCost+14);
					//
					var len8:Number=branchAndBoundAlgorithm(theX,theY,theX-1,theY-1,targetX,targetY,maxDepth,currentDepth+1,currentCost+14);
					
					var tmpArray:Array=new Array();
					//
					tmpArray.push(len1);
					tmpArray.push(len2);
					tmpArray.push(len3);
					tmpArray.push(len4);
					tmpArray.push(len5);
					tmpArray.push(len6);
					tmpArray.push(len7);
					tmpArray.push(len8);
					//
					//trace("arrayCompare(tmpArray):"+arrayCompare(tmpArray));
					return arrayCompare(tmpArray);
					
				}
			
				
													
		}
		
		private function arrayCompare(array:Array):Number{
			array.sort(Array.NUMERIC);
			return array[0];			 
		}
		//Эвристическая ф - ция, которая возвращает оценку расстояния от данной до целевой клетки
		private function evristicFunction(currentX:Number,currentY:Number,targetX:Number,targetY:Number):Number{
			var xDistance:Number = Math.abs(currentX-targetX);
			var yDistance:Number = Math.abs(currentY-targetY)
			if (xDistance > yDistance) return 14*yDistance + 10*(xDistance-yDistance);
			return 14*xDistance + 10*(yDistance-xDistance);

		}
		
		
		
	}
}
Вопрос такой
1) От чего эта ошибка может быть
2) Как с ней бороться

Зараннее благодарен,
Владимир