Ir ao conteúdo
  • Cadastre-se

Java Java POO - Mover um objeto em uma Matriz


Posts recomendados

Opa pessoal,

 

Estou desenvolvendo um programa POO em java que consiste em uma matriz com uns veiculos se movendo para lados aleatoriamente.

 

Minha duvida é , como mover o objeto na matriz de uma forma aleatória e cada objeto para um lado aleatoriamente ao invés de se movimentarem para as mesmas direções juntos.

 

Segue exemplo do projeto:

https://www.youtube.com/watch?v=gUhhcSjnErQ&feature=youtu.be

 

Obrigado

Link para o comentário
Compartilhar em outros sites

primeiro crie uma matriz de booleanos com X linha e Y colunas. Essa matriz será O MAPA onde os veículos irão se movimentar. A linha 0 (zero) vai ficar "em cima", será o "norte". A coluna 0 vai ficar a esquerda, será o "oeste". Então quando o veículo anda para o norte, o número da linha diminui. Quando o veículo anda para o sul, o número da linha aumenta. Quando o veículo anda para o oeste, o número da coluna diminui, quando o veículo anda para o leste, o número da coluna aumenta. Sacou as coordenadas do MAPA ? Cada linha x coluna é um "espaço" que vamos chamar de pixel.

 

Coloque TRUE nos lugares em que é possível o veículo ir e FALSE onde o veículo não pode ir. Isso definirá as "ruas", ou seja, o espaços contíguos onde os veículos podem trafegar. A fronteira TRUE->FALSE é a beira das ruas. Um bloco de pixesl juntos com FALSE pode ser um prédio, ou uma praça, ou um rio/lago onde os veículos não podem trafegar. Mais sobre isso adiante.

 

Para cada objeto veículo deve ter um par de números lin, col que dirá a linha e a coluna em que o veículo se encontra. Vamos chamá-lo de "posicao" do veículo

 

Crie um vetor ou lista de veículos e adicione a esse vetor os veículos que você for criando. Pelo vídeo, dá a entender que existem 3 classes de veículos : carros, caminhões e motos. Isso pode apontar para uma classe abstrata genérica veículo com alguns atributos : tamanho, velocidade, manobrabilidade. Por exemplo, um caminhão deve ter mais dificuldades para girar a esquerda/direita. Já uma moto não pode dar marcha a ré. Um carro pode ser mais veloz que um caminhão, já uma moto acelera mais rápido que um carro. Isso aqui são apenas ideias de como os objetos podem ter características diferentes portanto as sub-classes da classe genérica abstrata veículo terão atributos, métodos diferentes.

 

Importe a classe de randomização

import java.util.Random;

 

Instancie um objeto da classe Random que será o gerador de números aleatórios assim

Random geradorAleatório = new Random();

Quando precisar gerar um número aleatório faça assim:

direcao = geradoroAleatório.nextInt(1000) % 8;

 

Porque isso ? 

Ao acionar  nextInt( valor) o método irá gerar um número aleatório entre 0 e valor-1. No caso, estamos usando 1000 ou seja, entre 0 e 999, em seguida tiramos o resto da divisão por 8. Isso vai dar um número entre 0 e 7. Essa fórmula pode ser sustituita pora 

direcao = geradorAleatório.nextInt(8) ;

 

E porque queremos 8 ??? Porque são as 8 possíveis direções que o veículo pode ir.

Pense da seguinte forma:

No nosso MAPA  mencionado anteriormente, pense que cada interseção de linha/coluna é um "espaço" que pode ser ocupado. Suponha um veículo pequeno, uma moto, que ocupa apenas um espaço (pixel). Ao redor desse espaço, existem outros 8 espaços que são as direções para as quais o veículo pode ir

assim

___________

|___|___|___|

|___|_X_|___|
|___|___|___|

 

Podemos numerá-las assim

___________

|_0_|_1_|_2_|

|_3_|_X_|_4_|
|_5_|_6_|_7_|

 

então, ao aleatorizarmos de 0 a 7, estaremos dizendo em que direção o veículo deve ir. 
0 ->  o veículo vai para a diagonal superior esquerda, ou seja, a linha vai diminuir 1, a coluna diminui 1

1 -> o veículo vai para frente reto (norte), ou seja, a linha vai diminuir  1, a coluna vai ficar igual

2 -> o veículo vai para a diagonal superior direita, ou seja, a linha vai diminuir 1, a coluna vai aumentar 1

3 -> o veículo vai para a lateral esquerda (oeste), ou seja, a linha fica igual, a coluna diminui um

4 -> o veículo vai para a lateral direita (leste), ou seja, a linha fica igual, a coluna aumenta 1

5 -> o veículo vai para a diagonal inferior esquerda, ou seja, a linha aumenta 1, a coluna diminui 1

6 -> o veículo vai para a traz reto (sul), ou seja, a linha aumenta 1, a coluna fica igual

7 -> o veículo vai para a diagonal inferior direita, linha +1, coluna +1

 

Podemos fazer um vetor com essas modifiações (isso é álgebra linear aplicada)

private int movimentos[][] = { { -1, -1} , { -1, 0} , { -1 , 1} , { 0, -1} , { 0, 1} , { 1, -1} , { 1,0} , { 1, 1} } ; 


Então um método chamado movaSe( int direcao) receberia um número entre 0 e 7 e aplicaria esse elemento do vetor a posição do veículo.

 

Essa é em poucas palavras a essencia desse programa. Os detalhes agora são criar as classes. Recomendo criar a classe abstrata veículo com as seguintes caracteristicas

abstract classe Veículos {
    private int linha;
    private int coluna;
    private String cor;
    boolean mexaSe( int direcao ) {  // retorna TRUE se o veículo conseguiu se mexer, falso caso contrário 
         private int praOnde[][] = {} ;
         private int novaLinha,novaColuna ;
         novaLinha = this.linha + praOnde[direcao][0] ;
         novaColuna = this.coluna + praOnde[direcao][1];
         if ( mapa[novaLinha][novaColuna] ) {   // espaço está ocupado
             return False;
         } else {   // espaço está vazio ! vamos ocupá-lo 
             this.linha = novaLinha;
             this.coluna = novaColuna;
             return True;
         }
	}
    /*  outras definições da classe veículo podem ser feitas aqui */ 

}

a casse moto extenderia a classe veículo e permitiria a criação de uma moto que se mexe rapidamente, ocupa só um pixel, por exemplo. Depois que você fizer uma moto se mexer aleatóriamente, tente mexer várias motos.


Esse exercício está excelente e serve para praticar praticamente todos os conceitos de orientação a objetos e quem sabe até de multiprogramaçao !!! Imagine que cada veículo é um processo autonomo andando pelo mapa.

 

 

Essas sao algumas dicas iniciais de como eu faria. Pode sofisticar mais, por exemplo, quando o veículo se mexe ele a rigor "desocupa" um espaço e ocupa outro, concorda ? Podemos até prever no programa a situação de detectar uma "colisão" em que um veículo bate no outro. Imagina, se um caminhão bate numa moto , destrói a moto, por exemplo ... 

 

 

 

adicionado 1 minuto depois

Se precisar de mais dicas, pode entrar em contato ok ? 

 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...