Desafio

7 respostas
Cacapava

Boa tarde pessoal.
Sou novo em Java, comecei a estudar esse ano, estava lendo o livro Big Java de Cay Horstmann e fazendo alguns exercícios até que me deparei com esse:
O exercício é fazer uma applet que simula o andar de um bêbado, eu consegui fazer a simulação mas duas coisas ficaram pendentes.

1 - Gostaria de inserir um timer ou um delay algo assim que mostrasse os passos do bebâdo de segundo em segundo e não todos de uma vez.
2 - Quando eu modifico o tamanho da applet na hora da execução são gerados novos números aleatórios, como me livrar disso? (Estou usando o "simulador de applets" do Eclipse e não uma página HTML)

Obrigado pela a ajuda, aí vai o código.

import java.applet.Applet;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Line2D;
import java.awt.geom.Point2D;
import java.util.Random;

public class Exerc62 extends Applet {

	public void paint(Graphics g) {

		setSize(600, 600);
		final Graphics2D g2 = (Graphics2D) g;

		for (int i = 100; i < 420; i += 21) { // Desenha a grade

			// Linhas horizontais
			Point2D pt1 = new Point2D.Double(415, i);
			Point2D pt2 = new Point2D.Double(100, i);

			Line2D ln1 = new Line2D.Double(pt1, pt2);

			g2.draw(ln1);

			// Linhas verticais
			Point2D pt3 = new Point2D.Double(i, 415);
			Point2D pt4 = new Point2D.Double(i, 100);

			Line2D ln2 = new Line2D.Double(pt3, pt4);

			g2.draw(ln2);
			g2.drawString("Simulação de um  bebado", 100, 80);

		}
		this.andar(g2);// Chama o método andar que simula o bebado

	}

	public void andar(final Graphics2D g2) {

		Ellipse2D pessoa = new Ellipse2D.Double(250, 230, 15, 15);
		g2.draw(pessoa);
		g2.fill(pessoa);

		// ANDANDO
		for (int i = 0; i < 100; i++) {
			int rand = gerarRandom();

			switch(rand) {
			case 1:// Leste
				pessoa.setFrame(pessoa.getX() + 21, pessoa.getY(), 15, 15);
				g2.draw(pessoa);
				break;
			case 2:// Sul
				pessoa.setFrame(pessoa.getX(), pessoa.getY() + 21, 15, 15);
				g2.draw(pessoa);
				break;
			case 3:// Oeste
				pessoa.setFrame(pessoa.getX() - 21, pessoa.getY(), 15, 15);
				g2.draw(pessoa);
				break;
			case 4:// Norte
				pessoa.setFrame(pessoa.getX(), pessoa.getY() - 21, 15, 15);
				g2.draw(pessoa);
				break;
			}
		}
	}

	public int gerarRandom() {

		Random rd1 = new Random();
		int rd = ((1 + rd1.nextInt(4)));// Gera um numero aleatorio entre 1 e 4,
		// cada um é um ponto cardeal

		return rd;
	}

}

[IMG]http://i184.photobucket.com/albums/x262/Lufia_album/example.jpg[/IMG]

7 Respostas

thundercas

Bom, quanto a sua primeira solicitação, utilize Thread que resolverá o problema:

thread.sleep(1 * 1000)

ou seja, o método sleep da uma “pausa” na execução em x milissegundos.

Quando a sua segunda solicitação, para mim não ficou bem clara, poderia esclarecer melhor??

Cacapava

A sim, velho isso não me ajuda muito, você poderia especificar onde devo colocar o thread sleep? Dentro do for?
E o comando certo seria Thread.sleep(1 * 1000) e não

thread.sleep(1 * 1000)

Se possível tente compilar meu código para poder me ajudar afinal está funcionando.
E a segunda parte você percebe quando compila, se você aumentar o tamanho da janela da applet ela gera outros passos aleatórios para o bêbado …
Se puder ser mais específico agradeço já que colocar um thread antes do desenho de cada passo não ajuda muito.

Cacapava

Alguém me ajuda por favor! Eu coloquei até a foto da execução!

Valeu.

GustavoLaguna

Acho que voce pode colocar a pause dentro do método andar, assim a cada “andar” vai ter uma pausa.

Com relação a sua segunda pergunta, se entendi bem… ele está fazendo todo o cálculo novamente porque voce chama o método andar dentro de paint, ou seja, toda que vez que sua aplicação for repintada (se não me engano, ao mudar o tamanho da aplicação, isso ocorrerá) todo o calculo será feito novamente.

Abraço

Cacapava

Exato Gustavo, é exatamente por isso que o programa redefine os passos toda vez, porém colocar a Thread.sleep(1000) dentro do método paint ou do for que desenha os passos não adiantou muita coisa( Creio que seja porque o método andar é chamado só uma vez). Mesmo assim muito obrigado pela ajuda.

GustavoLaguna

Não sei se estou falando besteira, mas voce pode criar um timer com intervalo de 1000 (1 segundo) e depois a cada tick desse timer, voce faz 1 movimento do bebado. Crie também um contador, assim a cada passo do bebado voce adiciona esse contador (para executar um numero determinado de passos).

Finalizando, no seu método andar voce só da um timer.start() e deixa rodar…

ficou muito estranha minha idéia? Quando chegar em casa vou ver se implemento.

Abraço

sergiotaborda

Use a classe timer. A cada tick do timer vc pinta uma posição

Voce deve usar sempre o mesmo seed ( semente ) no Random. Isso irá gerar a mesma sequencia de numero toda a vez.

Criado 20 de abril de 2008
Ultima resposta 21 de abr. de 2008
Respostas 7
Participantes 4