Регистрация: 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) Как с ней бороться
Зараннее благодарен,
Владимир
|