para quem não conhece ai vai uma explicação:
Consiste de 3 pinos (A B e C) respectivamente descritos como origem, destino e trabalho. Inicialmente, tem-se n discos empilhados no pino A (origem), em ordem decrescente de tamanho, de baixo para cima. O objetivo é empilhar todos os n discos no pino B (destino), respeitando-se as seguintes restrições:
(1) apenas um disco pode ser movido de cada vez;
(2) qualquer disco JAMAIS pode ser colocado sobre outro disco com diâmetro menor.
OK, o algoritmo disso eh fácil... to desenvolvendo uma animção em flash mostrando... trabalho da facu.... troquei os discos por bolas...
fiz primeiro uma scene de entrada para o usuario escolher qntas bolas...
isto tah funfando...
//stacking the balls
var i = 2;
var amount = (num-1);
while(amount>0)
{
diametre = (getProperty ( "ball"+(i-1), _height ));
posy = (getProperty ( "ball"+(i-1), _y ));
ball1.duplicateMovieClip("ball"+i, i);
setProperty ("ball"+i, _width, (ball1._width)*(amount/num));
setProperty ("ball"+i, _height, (ball1._height)*(amount/num));
diametre2 = (getProperty ( "ball"+i, _height ));
setProperty ("ball"+i, _y,(posy - (diametre + diametre2)/2));
i ++;
amount --;
}
frontpart.duplicateMovieClip(frontpart2, i);
frontpart.removeMovieClip();
ai criei 3 arrays...e empilheias bolas no 1º
var arrayA = new Array("40");
var arrayB = new Array("283");
var arrayC = new Array("450");
for (n=1; n<=num; n++)
{
ballName = "ball"+n;
arrayA.push(ballName);
}
ai desenvolvi uma função hannoi
function Hannoi(num, arrayA, arrayB, arrayC){
if(num >0)
{
Hannoi(num-1,arrayA, arrayC, arrayB);
//moving balls
for(z=0; z<(arrayA.length); z++)//getting the initial position of y
inity= getProperty (arrayA[z], _y );
endy= getProperty ( arrayA[1], _y );//getting the final position of y
for(z=1; z<(arrayB.length); z++)
endy= getProperty ( arrayB[z], _y );
temp=arrayA.pop();
moveBall(temp, arrayB[0], false, false, inity, endy);
arrayB.push(temp);
//end move
Hannoi(num -1,arrayC, arrayB,arrayA);
}//endif
}//endHannoique tbm funfa, pois no final todas as bolas estaun no arrayB....
OK... a unica coisa que estou com dificuldade eh na função moveBall....
function moveBall(origin, destiny, fall, ready, ypos, endy){
setProperty (origin, _y, ypos);
if((ypos>-120)&&!(fall))
ypos = ypos - 100;
else
{
if(!fall)
{
setProperty (origin, _x, destiny);
fall = true;
}
if(ypos+100 < endy)
ypos = ypos + 100;
else
{
ypos= endy;
ready=true;
setProperty (origin, _y, ypos);
}
}
if(intervalID != null)
clearInterval(intervalID);
if(!ready)
intervalID= setInterval (moveBall, 42, origin, destiny, fall, false, ypos, endy);
}Para 1 bola funciona
ela faz o seguinte
a origem eh a bola ball2 com posição = 437.85com destino = 450 entrou no !ready a origem eh a bola ball1 com posição = 513com destino = 283 entrou no !ready a origem eh a bola ball2 com posição = 437.85com destino = 283 entrou no !ready a origem eh a bola ball2 com posição = 337.85com destino = 283 entrou no !ready a origem eh a bola ball2 com posição = 237.85com destino = 283 entrou no !ready a origem eh a bola ball2 com posição = 137.85com destino = 283 entrou no !ready a origem eh a bola ball2 com posição = 37.85com destino = 283 entrou no !ready a origem eh a bola ball2 com posição = -62.15com destino = 283 entrou no !ready a origem eh a bola ball2 com posição = -162.15com destino = 283 entrou no !ready a origem eh a bola ball2 com posição = -62.15com destino = 283 entrou no !ready a origem eh a bola ball2 com posição = 37.85com destino = 283 entrou no !ready a origem eh a bola ball2 com posição = 137.85com destino = 283 entrou no !ready a origem eh a bola ball2 com posição = 237.85com destino = 283 entrou no !ready a origem eh a bola ball2 com posição = 337.85com destino = 283 entrou no !ready a origem eh a bola ball2 com posição = 437.85com destino = 283
observem que entra a bola2 a posição eh 437 o destino 450 e esta etapa eh "ignorada" passando direto pra bola1.... pq ?
eh alguma coisa no setInterval????
eu naun mais o que pode estar errado... VCS pode m me ajudar.;... eh urgente
o arquivo swf esta aki....











