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 }//endHannoi
que 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 , mas para duas por exemplo, naun funfa.... ela so mexe na última bola.... enchi o código de traces e percebi que com 2 , por exemplo....
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....