1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

[Java] Movimento bola aleatorio

Discussão em 'Programação' iniciada por Sky_Boy_, 25 de Março de 2008. (Respostas: 12; Visualizações: 3947)

  1. Sky_Boy_

    Sky_Boy_ Power Member

    Boas pessoal....estou a fazer um programar que consiste em construir uma applet com determinada dimensao (um quadro ou rectangulo....consideremos 480*480por ex) e uma bola que tem de andar dentro do mesmo batendo aleatoriamente nas paredes....teremos tambem de retirar um pc do quadrado e quando a bola acertar nesse buraco a applet deve terminar...

    o quadrado esta desenhado com o respectivo buraco, alguem pode ajudar a fazer o movimento aleatorio da bola e, quando ela acertar no buraco, o programa terminar?

    Obgd desde ja

    Código:
    import java.awt.*;
    import java.applet.*;
    import java.math.*;
    
    public class pong extends Applet {
      int x, y;
      int deltaX, deltaY;
      
      public void init() {
        setSize(480, 480);
        x = this.getSize().width / 2;
        y = this.getSize().height / 2;
        deltaX = 5;
        deltaY = 5;
      }
    
      public void paint(Graphics g) {
        g.drawRect(10, 10, 460, 460);
        g.clearRect(220,10,60,460);
        while (true) {
          x += deltaX;
          y += deltaY;
          g.clearRect(x - deltaX, y - deltaY, 25, 25);
          g.fillOval(x, y, 25, 25);
          try {
            Thread.sleep(10);
          }
          catch (Exception e) {
            System.err.println("[ERRO: a Thread terminou...]");
          }
          if ((x >= 445) || (x <= 15)){
            deltaX = -deltaX;
          }
          if ((y >= 445) || (y <= 15)){
            deltaY = -deltaY;
          }
        }
      }
    }
    
     
  2. S7sRuss

    S7sRuss What is folding?

    Movimento aleatório como? Alguma função matemática específica?

    Da forma como o código está escrito vai sempre voltar ao ponto de origem...

    Não podes imaginar que a bola segue um determinado ângulo em relação à abcissa? E quando bate numa parede o valor do ângulo muda?
     
  3. Sky_Boy_

    Sky_Boy_ Power Member

    O programa da maneira que esta a bola vai bater sempre no mm sitio caso desenhemos um quadrado....o objectivo e que isso nao aconteça, ou seja, o movimento seja aleatorio...

    A sugestao que me foi dada pelo docente da cadeira foi utilizar o random da biblioteca Math
     
  4. MadOnion

    MadOnion Folding Member

    O metodo Math.random(), devolve um double entre 0(inclusivé) e 1(exclusivé), e podes multiplicar esse valor pela altura da applet e pela largura da applet, e assim encontrar um novo x e um novo y, por exemplo:
    PHP:
    /** Tens sempre a certeza que é um valor dentro da janela */
    Math.random() * getSize().width;
    Math.random() * getSize().heigth;
    Sabendo que o (x,y) é o centro da bola, é andar com deltas(radius) para não permitir que metade da bola fique de fora do ecrã. Ou outra solução, seria em vez de ... * getSize().width; fazer ... * getSize().width - delta(isto é, o raio).
    Para saber se a bola está dentro do quadrado, é verificar se as coordenadas estão "dentro" do quadrado.
    Já agora uma applet não(penso que não) termina, porque é carregada em browser, podes é um fazer aparecer um popup, ou imprimir algo no status do browser através do metodo showStatus(String str).
     
  5. Sky_Boy_

    Sky_Boy_ Power Member

    Nao consegues implementar isso no meu codigo? Estou a ter algumas dificuldades...

    Obrigado
     
  6. MadOnion

    MadOnion Folding Member

    PHP:
    while (true) {
                
    = (int) (Math.random() * (getSize().width-25));
                
    = (int) (Math.random() * (getSize().height-25));
                
    //g.clearRect(x - deltaX, y - deltaY, 25, 25);
                
    g.fillOval(xy2525);
                try {
                    
    Thread.sleep(10);
                }
                catch (
    Exception e) {
                    
    System.err.println("[ERRO: a Thread terminou...]");
                }
            }
    Nesse trecho de código, consegues ter várias bolas no ecrã, sem exceder o limite da applet.
    Agora sempre que é adicionado uma bola e um quadrado, tens que verificar se a bola está "dentro" do quadrado, através das coordenadas.
    Eu não fiz essa parte, mas não é dificil, é so envolver alguma matemática elementar.
     
  7. Sky_Boy_

    Sky_Boy_ Power Member

    Neste momento o meu prog está assim:

    Código:
    import java.awt.*;
    import java.applet.*;
    import java.math.*;
    
    public class pong extends Applet {
      int x, y;
      int deltaX, deltaY;
      
      public void init() {
        setSize(480, 480);
        /*x = this.getSize().width / 2;
        y = this.getSize().height / 2;*/
        deltaX = 5;
        deltaY = 5;
      }
    
      public void paint(Graphics g) {
        g.drawRect(10, 10, 460, 460);
        g.clearRect(220,10,60,460);
        while (true) {
            x += (int) (Math.random() * (getSize().width-25));
            y += (int) (Math.random() * (getSize().height-25));
            //g.clearRect(x - deltaX, y - deltaY, 25, 25);
            g.fillOval(x, y, 25, 25);
            try {
                Thread.sleep(10);
            }
            catch (Exception e) {
                System.err.println("[ERRO: a Thread terminou...]");
            }
          if ((x >= 445) || (x <= 15)){
            deltaX = -deltaX;
          }
          if ((y >= 445) || (y <= 15)){
            deltaY = -deltaY;
          }
        }
      }
    }
    
    Resultando nisto:

    [​IMG]

    No entanto, o que eu pretendia era que ela fosse batendo aleatoriamente pelas paredes até ao momento em que passa-se pelo buraco e ai desaparecesse ou desse alguma mensagem....alguem me consegue ajudar?

    Ela como está nem seker se mexe :005:
     
  8. napalm

    napalm Power Member

  9. Sky_Boy_

    Sky_Boy_ Power Member

    Código:
    import java.awt.*;
    import java.applet.*;
    
    public class PingPong extends Applet {
      int x, y;
      int deltaX, deltaY;
      
      public void init() {
        setSize(640, 480);
        x = this.getSize().width / 2;
        y = this.getSize().height / 2;
        deltaX = 5;
        deltaY = 5;
      }
    
      public void paint(Graphics g) {
        g.drawRect(10, 10, 620, 460);
        while (true) {
          x += deltaX;
          y += deltaY;
          g.clearRect(x - deltaX, y - deltaY, 25, 25);
          g.fillOval(x, y, 25, 25);
          try {
            Thread.sleep(10);
          }
          catch (Exception e) {
            System.err.println("[ERRO: a Thread terminou...]");
          }
          if ((x >= 605) || (x <= 15)){
            deltaX = -deltaX;
          }
          if ((y >= 445) || (y <= 15)){
            deltaY = -deltaY;
          }
        }
      }
    }
    
    Assim ela movimenta-se mas n e de modo aleatorio... :rolleyes:
     
  10. napalm

    napalm Power Member

    Bom para ti. Agora fica a saber que não é assim o modelo de programação de animações em AWT ou em qualquer motor gráfico, mas vai tentando.
    (ou podes ler o link que te dei)

    Em todo o caso, boa sorte.
     
  11. Sky_Boy_

    Sky_Boy_ Power Member

    Só tive 2 aulas disto e normal que nao seja nenhum expert...i guess :wscared:
     
  12. Sky_Boy_

    Sky_Boy_ Power Member

    MadOnion, de acordo com a tua ajuda o resultado foi este:

    [​IMG]

    Não sendo o meu objectivo (possivelmente expliquei-me mal) :005:

    Com as imagens de cima que permitem compreender melhor o proposito do prog nng me consegue dar uma ajuda :sad:

    Tks
     
  13. Sky_Boy_

    Sky_Boy_ Power Member

    Código:
    import java.awt.*;
    import java.applet.*;
    import java.math.*;
    
    public class bouncing extends Applet {
    
    	int deltaX = (int)(Math.random() * 10);
    	int deltaY = (int)(Math.random() * 10);
    
    	int x, y;
    
    
    	public void init() {
    		setSize(480, 480);
    		x = this.getSize().width / 2;
    		y = this.getSize().height / 2;
    	}
    
    	public void paint(Graphics g) {
    		g.drawRect(10, 10, 460, 460);
    		g.clearRect(220,10,80,440);
    		while (true) {
    			x += deltaX;
    			y += deltaY;
    
    			g.clearRect(x - deltaX, y - deltaY, 20, 20);
    			g.fillOval(x, y, 20, 20);
    			try {
    				Thread.sleep(10);
    			}
    			catch (Exception e) {
    				System.err.println("[ERRO: a Thread terminou...]");
    			}
    			if ((x >= 440) || (x <= 20)){
    				deltaX = (int)(Math.random() * 10);
    				if (x >= 440) {
    					deltaX = -deltaX;
    				}
    			}
    			if ((y >= 440) || (y <= 20)){
    				deltaY = (int)(Math.random() * 10);
    				if (y >= 440) {
    					deltaY = -deltaY;
    				}
    			}
    
    		}
    
    	}
    }
    
    Ja faz o movimento aleatorio.....agora alguem sabe como posso verificar se a posição da bola coincide com as coordenadas da baliza (220,10,80,440)?
     

Partilhar esta Página