![]() |
|
||||||||||
|
|||||
|
[+3 13.02.08]
Регистрация: 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) Как с ней бороться Зараннее благодарен, Владимир |
|
|||||
|
Контрибьютор базы знаний по Флекс
Регистрация: Aug 2005
Сообщений: 690
|
чего то, что необходимо функции branchAndBoundAlgorithm() нет.
__________________
Flex 2 и Co |
|
|||||
|
Регистрация: Aug 2007
Сообщений: 467
|
А AS3 хоть рекурсию поддерживает?
|
|
|||||
|
Цитата:
|
|
|||||
|
[+3 13.02.08]
Регистрация: Apr 2006
Сообщений: 421
|
Цитата:
Т.е. рекурсия работает и ф - ция существует. Может ей передаются неверные параметры? Вот привел полный вывод до возникновения первой ошибки startX:2 startY:2 Test startX:3 startY:3 Test startX:4 startY:4 Test startX:5 startY:5 Test startX:6 startY:6 Test 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() Последний раз редактировалось VovkaMorkovka; 31.08.2007 в 12:59. |
|
|||||
|
[+3 13.02.08]
Регистрация: Apr 2006
Сообщений: 421
|
Все, разобрался сам: была ссылка на несуществующий элемент массива.
Кстати, сообщение об ошибке нифига не понятное Цитата:
Последний раз редактировалось etc; 31.08.2007 в 14:46. |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
256 уровней.
Дебаггер флекса надо юзать, он укажет на конкретное место ошибки. |
![]() |
![]() |
Часовой пояс GMT +4, время: 14:39. |
|
|
« Предыдущая тема | Следующая тема » |
|
|