Jump to content


Photo

Torre De Hannoi...


  • Faça o login para participar
3 replies to this topic

#1 ToeJam

ToeJam

    CENSURADO

  • Usuários
  • 212 posts
  • Sexo:Não informado
  • Localidade:Rio de Janeiro

Posted 19/08/2005, 12:35

vc conhecem a torre de hannoi????

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....

Attached Files


TOEJ@M - Fernando Ferreira

ALUNO
Engenharia elétrica, eletrônica e de computação

UrGiApOntOcOm.blogger.com.br

Adube sua vida, fale muita merrda!!!!

#2 ToeJam

ToeJam

    CENSURADO

  • Usuários
  • 212 posts
  • Sexo:Não informado
  • Localidade:Rio de Janeiro

Posted 20/08/2005, 14:20

Bom...
Cheguei a conclusão que o erro está no setInterval, ela não está chamando a função move ball.... se eu a tiro o programa funciona muito bem, porém não é possivel ver a animação... tudo acontece instantaneo.....
preciso disso pronto segunda!!! qqr sugestão é válida... não sei se todo mundo sacou, mas akele quadrado tosco vermelho que aparece é o botão que inicia a animação ... depois eu mudo...

aliás já poderiam me dizer como eu chamo a função sem precisar apertar botão.... começar automático....
/******************************************************************************************/

tEM ALGUEM AI????

bom mudei a função move bal e a hannoi para evitar o erro...

stop();
function sobeBola(origin, ypos, end)
{
pos=ypos - (100*index)
if(pos > -120){
 setProperty(origin,_y, pos);
 index++;
}
else
{
 setProperty(temp,_x, arrayB[0]);
 pos=pos + (100*index2)
 setProperty(origin,_y, pos);
 index2++;
 if(pos > end)
 {
  setProperty(origin,_y, end);
  clearInterval(intervalID);
 }
}
}

function Hannoi(num, arrayA, arrayB, arrayC){
var index, index2=0;
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
 temp=arrayA.pop();
 for(z=1; z<(arrayB.length); z++)
  endy= (getProperty ( arrayB[z], _y )- (getProperty ( temp, _height )+ getProperty ( arrayB[z], _height ))/2);
 
 intervalID = setInterval(sobeBola,42,temp, inity, endy);
 index=0;
 index2=0;
 
 arrayB.push(temp);
 //end move
 
 Hannoi(num -1,arrayC, arrayB,arrayA);
}//endif
}//endHannoi



este eh actions que faz tudo...

deixei em negrito a função setinterval....porém agora estou com outro problema....

eu preciso fazer que enquanto esteja sendo executada a sobeBall o script fiqu parado esperando.... ocorre que do jeito que está comandos sobeBall estão sendo sobreescritos e assim fica uma bagunça;;; antes de ser executada pela 1º ela já é chamada 3 vezes...

preciso então de uma função do tipo wait();;;

tentei um while(!ready), mas isto tem um custo muito grande, se comporta como se fosse um loop infinito.....
alguem pode me ajudar...

Edição feita por: ToeJam, 20/08/2005, 18:15.

TOEJ@M - Fernando Ferreira

ALUNO
Engenharia elétrica, eletrônica e de computação

UrGiApOntOcOm.blogger.com.br

Adube sua vida, fale muita merrda!!!!

#3 ToeJam

ToeJam

    CENSURADO

  • Usuários
  • 212 posts
  • Sexo:Não informado
  • Localidade:Rio de Janeiro

Posted 25/08/2005, 13:24

Po, ninguem tem outra sugestão.... outra forma de fazer, qualquer coisa,,,
estou indo pelo caminho certo??? ou errei em algo, não eh possível que não haja uma maneira de fazer... concordam... Espero respostas...
TOEJ@M - Fernando Ferreira

ALUNO
Engenharia elétrica, eletrônica e de computação

UrGiApOntOcOm.blogger.com.br

Adube sua vida, fale muita merrda!!!!

#4 Patrique

Patrique

    Super Veterano

  • Usuários
  • 1859 posts
  • Sexo:Não informado

Posted 26/08/2005, 00:31

Cara tentei fazer aqui o download do arquivo mais naum ta dando vc poderia me enviar por email:

patriqueandre@gmail.com

Assim vai ficar mais facil de eu te ajudar

E se mandar, mande-o compilado na versão MX 2002 pois se vc me mandar na versao 2004 ou 8 naum vou conseguir abrir.

E preste atenção:
Os três posts que vc mandou naum é permitido isso é flood é contra as regras do fórum da próxima vez edite o seu post e coloque lá as informações que vc quer adicionar. Ok (y)


Um abraço,
Patrique André




1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq