Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Valiwne

Java Java POO - Mover um objeto em uma Matriz

Recommended Posts

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

Compartilhar este post


Link para o post
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 ? 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário






Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×