Programa Campo Minado OO[Resolvido]

Olá pessoal, preciso desenvolver um jogo orientado a objeto em java. A logica é a que está embaixo.

[code]int n = 0, i;
int vetorE[]=new int[5];
int vetorS[] = new int[5];

vetorE[0] =Integer.parseInt(JOptionPane.showInputDialog("Digite 0 quando não existir mina e 1 quando existir: "));
vetorE[1] =Integer.parseInt(JOptionPane.showInputDialog("Digite 0 quando não existir mina e 1 quando existir: "));
vetorE[2] =Integer.parseInt(JOptionPane.showInputDialog("Digite 0 quando não existir mina e 1 quando existir: "));
vetorE[3] =Integer.parseInt(JOptionPane.showInputDialog("Digite 0 quando não existir mina e 1 quando existir: "));
vetorE[4] =Integer.parseInt(JOptionPane.showInputDialog("Digite 0 quando não existir mina e 1 quando existir: "));

vetorS[0] = vetorE[0]+vetorE[1];
vetorS[1] = vetorE[0]+vetorE[1]+vetorE[2];;
vetorS[2] = vetorE[1]+vetorE[2]+vetorE[3];;
vetorS[3] = vetorE[2]+vetorE[3]+vetorE[4];;
vetorS[4] = vetorE[3]+vetorE[4];

System.out.println(+vetorS[0]);
System.out.println(+vetorS[1]);
System.out.println(+vetorS[2]);
System.out.println(+vetorS[3]);
System.out.println(+vetorS[4]);
[/code]

A quetão é: a lógica do programa deve ser Orientada a Objeto e deverão ser utilizados métodos. O programa deverá ter obrigatoriamente alguns atributos privados, construtores e chamar métodos set e get na classe principal.

Estou quebrando a cabeça a duas semanas com isso, e que o que consegui fazer foi:


import javax.swing.JOptionPane;

public class CampoMinado {
    
   
    int n;//numero de celulas
    int vetorE[] = new int[n]; 
    int vetorS[] = new int[n];
    
    
        CampoMinado(){
            
            n = Integer.parseInt(JOptionPane.showInputDialog("Quantas celulas possui o jogo: "));

        }
        
        void le(int vetorE[]){
        
            for(int i=0;i<vetorE.length;i++){
            
                vetorE[i] = Integer.parseInt(JOptionPane.showInputDialog("1 para mina e 0 para sem mina: "));
            
            }
        
        }
        
        
        void imprime(int vetorS[]){
        
            for(int i=0;i<vetorS.length;i++){
                
                System.out.println(vetorS[i]);
            
            }
        }
    
    
    }

A classe principal:


import javax.swing.JOptionPane;

public class Executa {
   
   public static void main(String[] args){
   
   CampoMinado obj;
   obj= new CampoMinado();
   int n=0;
   
   
   
    
              
   
   }
   
       
    }
}


Por favor pessoal, preciso de orientação, já tentei por semanas resolver esta questão sozinha, procurando em foruns, pesquisando, e nada. Não estou conseguindo fazer sozinha, preciso de ajuda, e ajuda o quanto antes pois preciso entregar este trabalho esta semana.

li várias vezes e não entendi o que é pra fazer.

abs.

Você comentou que não sabe usar um loop “for”. Na verdade, seu problema é muito comum, que é o de se confundir com o fato de você definir um array com a instrução:

int x = new int[5];

e os índices possíveis irem apenas até 4:

x[0], x[1], x[2], x[3], x[4]

Uma coisa que costumo fazer, quando tenho problemas com arrays, é o de simplesmente pular a posição 0, e definir a dimensão como sendo 1 maior que o necessário - só para evitar esses problemas.

Infelizmente provavelmente o seu professor não vai gostar desse “desperdício de memória” e vai lhe tirar alguns pontos. Portanto, é melhor aprender da maneira correta.

Por exemplo, você escreveu o código abaixo - copy & paste - que é uma péssima prática:

vetorE[0] =Integer.parseInt(JOptionPane.showInputDialog("Digite 0 quando não existir mina e 1 quando existir: "));  
vetorE[1] =Integer.parseInt(JOptionPane.showInputDialog("Digite 0 quando não existir mina e 1 quando existir: "));  
vetorE[2] =Integer.parseInt(JOptionPane.showInputDialog("Digite 0 quando não existir mina e 1 quando existir: "));  
vetorE[3] =Integer.parseInt(JOptionPane.showInputDialog("Digite 0 quando não existir mina e 1 quando existir: "));  
vetorE[4] =Integer.parseInt(JOptionPane.showInputDialog("Digite 0 quando não existir mina e 1 quando existir: "));

O correto é fazer isto aqui:

for (int i = 0; i < 5; i++) {
    vetorE[i] =Integer.parseInt(JOptionPane.showInputDialog("Digite 0 quando não existir mina e 1 quando existir: "));  
}

Quando você usa “i < 5”, você está pedindo para ir andando sobre os índices i = 0, i = 1, … i = 4, enquanto for menor que 5… Ou seja, ele não vai chegar a i = 5, e ele vai parar no 4, como você deseja.

Agora seu problema é com a lógica do campo minado.

Você já conseguiu fazer a lógica com lápis e papel? Faça isso antes de começar a escrever o programa.

Depois, tente ver se consegue escrever em português estruturado (ou portugol, ou sei lá como se chama isso na sua faculdade).

Aí, você pode começar a escrever o resto do programa.

Pode ser que, testando, haja ainda algum problema (com certeza vai haver).

Mas então você pode ir perguntando aqui (quando estiver com o programa quase pronto) e ir perguntando para a gente.

OK?

Depois que estiver funcionando (não se preocupe ainda com objetos etc.), você pode ver se é possível passar para objetos.

Mas como você nem sabe como fazer funcionar sem OO, a parte do OO não vai chegar tão cedo :slight_smile:

E mais, não adianta ficar só “procurando em fóruns”. Provavelmente você vai ter é de pegar seus colegas e discutir como é que se resolve o tal problema. (Acho que o professor passou o tal do “campo minado” justamente porque:

a) Não se acha a solução facilmente em fóruns,
b) Não é um problema assustadoramente difícil,
c) Entretanto, requer bastante trabalho e atenção.

[quote=douglaskd]li várias vezes e não entendi o que é pra fazer.

abs.[/quote]

O objetivo desse jogo é determinar, para cada célula do tabuleiro, o número de minas explosivas adjacentes (que são a própria célula e as células vizinhas à direita e à esquerda, caso essas existam).

Se a primeira célula não possui nenhuma mina explosiva, mas é vizinha de uma célula que possui uma mina explosiva. Nos arredores da segunda célula temos duas minas, e o mesmo acontece para a terceira e quarta células; a quinta célula só tem uma mina explosiva em seus arredores. A resposta para esse caso será:

1 2 2 2 1

Este programa deve: imprimir o número de minas na vizinhança de cada posição.

Exemplo:

Entrada
Deverá ser informado zero se não existe mina e 1(um) se existe mina na célula.
Saída
De acordo com as opções do menu.

[quote=entanglement]Você comentou que não sabe usar um loop “for”. Na verdade, seu problema é muito comum, que é o de se confundir com o fato de você definir um array com a instrução:

int x = new int[5];

e os índices possíveis irem apenas até 4:

x[0], x[1], x[2], x[3], x[4]

Uma coisa que costumo fazer, quando tenho problemas com arrays, é o de simplesmente pular a posição 0, e definir a dimensão como sendo 1 maior que o necessário - só para evitar esses problemas.

Infelizmente provavelmente o seu professor não vai gostar desse “desperdício de memória” e vai lhe tirar alguns pontos. Portanto, é melhor aprender da maneira correta.

Por exemplo, você escreveu o código abaixo - copy & paste - que é uma péssima prática:

vetorE[0] =Integer.parseInt(JOptionPane.showInputDialog("Digite 0 quando não existir mina e 1 quando existir: "));  
vetorE[1] =Integer.parseInt(JOptionPane.showInputDialog("Digite 0 quando não existir mina e 1 quando existir: "));  
vetorE[2] =Integer.parseInt(JOptionPane.showInputDialog("Digite 0 quando não existir mina e 1 quando existir: "));  
vetorE[3] =Integer.parseInt(JOptionPane.showInputDialog("Digite 0 quando não existir mina e 1 quando existir: "));  
vetorE[4] =Integer.parseInt(JOptionPane.showInputDialog("Digite 0 quando não existir mina e 1 quando existir: "));

O correto é fazer isto aqui:

for (int i = 0; i < 5; i++) {
    vetorE[i] =Integer.parseInt(JOptionPane.showInputDialog("Digite 0 quando não existir mina e 1 quando existir: "));  
}

Quando você usa “i < 5”, você está pedindo para ir andando sobre os índices i = 0, i = 1, … i = 4, enquanto for menor que 5… Ou seja, ele não vai chegar a i = 5, e ele vai parar no 4, como você deseja.
[/quote]

Já havia tentado dessa maneira, porem me reorna o seguinte erro:

[quote=entanglement]Agora seu problema é com a lógica do campo minado.

Você já conseguiu fazer a lógica com lápis e papel? Faça isso antes de começar a escrever o programa.

Depois, tente ver se consegue escrever em português estruturado (ou portugol, ou sei lá como se chama isso na sua faculdade).

Aí, você pode começar a escrever o resto do programa.

Pode ser que, testando, haja ainda algum problema (com certeza vai haver).

Mas então você pode ir perguntando aqui (quando estiver com o programa quase pronto) e ir perguntando para a gente.

OK?[/quote]

A logica é aquela mesma que está na minha pergunta, eu desenvolvi no papel mesmo, e passei para o netbeans para testar. Porém no lugar de eu alocar cada valor digitado (1 ou zero) estaticamente, isso deve ser feito pelo for, mais dinamicamente, e outras coisinhas que preciso mudar ai nesse codigo.

essa exceção acontece ´q vc ta tentando acessar o indice de um array q n tem indice 10, verifique a condição do seu for e o tamanho do seu array

[quote=Ckralls]

Já havia tentado dessa maneira, porem me reorna o seguinte erro:
[/quote]

Qual é a diferença entre 5 e 10? Você provavelmente terá de dimensionar seu array DEPOIS de ler o número n, não antes (onde você deixou fixo como 5.).

[quote=entanglement][quote=Ckralls]

Já havia tentado dessa maneira, porem me reorna o seguinte erro:
[/quote]

Qual é a diferença entre 5 e 10? Você provavelmente terá de dimensionar seu array DEPOIS de ler o número n, não antes (onde você deixou fixo como 5.). [/quote]

A questão não está entre 5 ou 10. Esse ai foi só um exemplo que peguei do erro que aparece caso eu faça da maneira que estão me dizendo para fazer, fiz e refiz inumeras vezes a me apresentava o erro em questão, ou seja que estou excedendo o vetor. Tipo, se n = 5, eu eu colocar:

for(i=0;i<n;i++){

       vetorE[i] = Integer.parseInt(JOptionPane.showInputDialog("1 para mina e 0 para sem mina: ")); 


}

Como disse estou a duas semanas quebrando cabeça com essa questão, já estou até desistindo.

Pois bem, é só uma questão de QUANDO você dimensiona as variáveis.

Acho que o professor não ensinou direito QUANDO é que se dimensiona um array. (Ele deve ter ensinado só “COMO”).
(Professores costumam esquecer desses detalhes… eles se esqueceram que tipos de problemas eles tiveram quando aprenderam a programar.)
Você pode dimensioná-lo um pouco antes de usá-lo, não é preciso dimensioná-lo durante a declaração.
Nesse ponto, é diferente de algumas linguagens onde você tem de declarar um vetor com o tamanho certo (que é o caso do C).
Você pode fazer algo como:

int[] vetorE; // só estou declarando a variável, não estou dimensionando ainda!!!!
int n;
...
n = ... valor lido do teclado ou de um JOptionPane, pode ser 10, por exemplo ...
vetorE = new int[n]; // note que estou dimensionando DEPOIS da declaração. 
for (int i = 0; i < n; i++) {
    vetorE [i] = .... valor lido do teclado ....
}

Note aqui que você não vai ter problemas se n = 5 ou 10, só não digitar um valor negativo, zero ou muito grande para n.

[quote=Ckralls]Olá pessoal, preciso desenvolver um jogo orientado a objeto em java. A logica é a que está embaixo.

[code]int n = 0, i;
int vetorE[]=new int[5];
int vetorS[] = new int[5];

vetorE[0] =Integer.parseInt(JOptionPane.showInputDialog("Digite 0 quando não existir mina e 1 quando existir: "));
vetorE[1] =Integer.parseInt(JOptionPane.showInputDialog("Digite 0 quando não existir mina e 1 quando existir: "));
vetorE[2] =Integer.parseInt(JOptionPane.showInputDialog("Digite 0 quando não existir mina e 1 quando existir: "));
vetorE[3] =Integer.parseInt(JOptionPane.showInputDialog("Digite 0 quando não existir mina e 1 quando existir: "));
vetorE[4] =Integer.parseInt(JOptionPane.showInputDialog("Digite 0 quando não existir mina e 1 quando existir: "));

vetorS[0] = vetorE[0]+vetorE[1];
vetorS[1] = vetorE[0]+vetorE[1]+vetorE[2];;
vetorS[2] = vetorE[1]+vetorE[2]+vetorE[3];;
vetorS[3] = vetorE[2]+vetorE[3]+vetorE[4];;
vetorS[4] = vetorE[3]+vetorE[4];

System.out.println(+vetorS[0]);
System.out.println(+vetorS[1]);
System.out.println(+vetorS[2]);
System.out.println(+vetorS[3]);
System.out.println(+vetorS[4]);
[/code]

A quetão é: a lógica do programa deve ser Orientada a Objeto e deverão ser utilizados métodos. O programa deverá ter obrigatoriamente alguns atributos privados, construtores e chamar métodos set e get na classe principal.

Estou quebrando a cabeça a duas semanas com isso, e que o que consegui fazer foi:


import javax.swing.JOptionPane;

public class CampoMinado {
    
   
    int n;//numero de celulas
    int vetorE[] = new int[n]; 
    int vetorS[] = new int[n];
    
    
        CampoMinado(){
            
            n = Integer.parseInt(JOptionPane.showInputDialog("Quantas celulas possui o jogo: "));

        }
        
        void le(int vetorE[]){
        
            for(int i=0;i<vetorE.length;i++){
            
                vetorE[i] = Integer.parseInt(JOptionPane.showInputDialog("1 para mina e 0 para sem mina: "));
            
            }
        
        }
        
        
        void imprime(int vetorS[]){
        
            for(int i=0;i<vetorS.length;i++){
                
                System.out.println(vetorS[i]);
            
            }
        }
    
    
    }

A classe principal:


import javax.swing.JOptionPane;

public class Executa {
   
   public static void main(String[] args){
   
   CampoMinado obj;
   obj= new CampoMinado();
   int n=0;
   
   
   
    
              
   
   }
   
       
    }
}


Por favor pessoal, preciso de orientação, já tentei por semanas resolver esta questão sozinha, procurando em foruns, pesquisando, e nada. Não estou conseguindo fazer sozinha, preciso de ajuda, e ajuda o quanto antes pois preciso entregar este trabalho esta semana.[/quote]

Pessoal resumindo, observem o seguinte codigo :

[code]
for (int i = 0; i < n; i++) {

       vetorE [i] = Integer.parseInt(JOptionPane.showInputDialog("1 para mina e 0 para sem mina: "));
    
   
  
       vetorS[i] = vetorE[i]+vetorE[i+i];
        System.out.println(vetorS[i]);
   }   
  [/code]

O que eu quero na linha 07 é fazer com que o vetorS[i] receba o vetorE[i] somado com o vetorE[i + 1] . Entenderam ? Como faço essa logica, como ?

Aqui é o famoso problema “estou precisando de óculos novos”, mais conhecido por “estou lutando com esse problema faz tanto tempo que não estou conseguindo pensar direito, e preciso de alguém para me ajudar”. No seu caso, você disse que você queria fazer:

e o código abaixo está escrito:

vetorS[i] = vetorE[i]+vetorE[i+i];  

Está percebendo um “i + i” ? Não deveria ser “i + 1”?

A propósito, você tem de tomar um pouco de cuidado ao testar, no campo minado, o canto direito (digamos que o tabuleiro tenha 5 posições. i vai ser 4, mas i + 1 vai ser 5, que está fora do tabuleiro. Portanto, você não pode fazer o loop até < n, e sim até < n - 1.

[quote=entanglement]Aqui é o famoso problema “estou precisando de óculos novos”, mais conhecido por “estou lutando com esse problema faz tanto tempo que não estou conseguindo pensar direito, e preciso de alguém para me ajudar”. No seu caso, você disse que você queria fazer:

e o código abaixo está escrito:

vetorS[i] = vetorE[i]+vetorE[i+i];  

Está percebendo um “i + i” ? Não deveria ser “i + 1”?

A propósito, você tem de tomar um pouco de cuidado ao testar, no campo minado, o canto direito (digamos que o tabuleiro tenha 5 posições. i vai ser 4, mas i + 1 vai ser 5, que está fora do tabuleiro. Portanto, você não pode fazer o loop até < n, e sim até < n - 1.
[/quote]

Tudo o que quero é colocar aquela logica lá na pergunta de uma forma mais dinamica. Dentro do for, e tentar atender alguns requisitos do professor. A logica é aquela mesmo. Para eu saber o valor da primeira celula eu tenho que somar ela mesma com a seguinte, vet[0]=vet[0]+vet[1], e assim por diante, como tá lá em cima na pergunta, a questão é: Como colocar isso da forma que o professor pede ? Dentro do for , etc. Alguém ai me dá uma ajuda.

Até o momento foi o que consegui fazer, mas não imprime como deveria, ele deveria imprimir : 1 2 2 2 1 para uma entrada: 0 1 1 0 1, Porém ele imprime: 1 2 2 1 4

import javax.swing.JOptionPane;

public class Minado {
 public static void main(String[] args){
          
    int[] vetorE; 
    int[] vetorS;// só estou declarando a variável, não estou dimensionando ainda!!!!  
    int n;  

       n = Integer.parseInt(JOptionPane.showInputDialog("Quantas celulas possui o jogo: "));

       vetorE = new int[n]; // note que estou dimensionando DEPOIS da declaração.   
       vetorS = new int[n];
       
       for (int i = 0; i < n; i++) {  
        
           vetorE [i] = Integer.parseInt(JOptionPane.showInputDialog("1 para mina e 0 para sem mina: "));
           
                if(vetorE[i]== 0){
             
                vetorS[i]= vetorE[i]+vetorE[i+1]+1;
           
                    System.out.println(vetorS[i]);
        
                }
                if(vetorE[i]== 1){
               
                vetorS[i]= vetorE[i]+vetorE[n-i]+vetorE[n-1]+1;
           
                    System.out.println(vetorS[i]);
        
                }
              
                }
}
 
           
       }

Sinto que estou quase lá, quem pode me ajudar a fechar essa questão ? preciso entregar no maximo até quinta-feira(25/07/2013).

[quote=Ckralls][quote=entanglement]Aqui é o famoso problema “estou precisando de óculos novos”, mais conhecido por “estou lutando com esse problema faz tanto tempo que não estou conseguindo pensar direito, e preciso de alguém para me ajudar”. No seu caso, você disse que você queria fazer:

e o código abaixo está escrito:

vetorS[i] = vetorE[i]+vetorE[i+i];  

Está percebendo um “i + i” ? Não deveria ser “i + 1”?

A propósito, você tem de tomar um pouco de cuidado ao testar, no campo minado, o canto direito (digamos que o tabuleiro tenha 5 posições. i vai ser 4, mas i + 1 vai ser 5, que está fora do tabuleiro. Portanto, você não pode fazer o loop até < n, e sim até < n - 1.
[/quote]

Tudo o que quero é colocar aquela logica lá na pergunta de uma forma mais dinamica. Dentro do for, e tentar atender alguns requisitos do professor. A logica é aquela mesmo. Para eu saber o valor da primeira celula eu tenho que somar ela mesma com a seguinte, vet[0]=vet[0]+vet[1], e assim por diante, como tá lá em cima na pergunta, a questão é: Como colocar isso da forma que o professor pede ? Dentro do for , etc. Alguém ai me dá uma ajuda.

Até o momento foi o que consegui fazer, mas não imprime como deveria, ele deveria imprimir : 1 2 2 2 1 para uma entrada: 0 1 1 0 1, Porém ele imprime: 1 2 2 1 4

import javax.swing.JOptionPane;

public class Minado {
 public static void main(String[] args){
          
    int[] vetorE; 
    int[] vetorS;// só estou declarando a variável, não estou dimensionando ainda!!!!  
    int n;  

       n = Integer.parseInt(JOptionPane.showInputDialog("Quantas celulas possui o jogo: "));

       vetorE = new int[n]; // note que estou dimensionando DEPOIS da declaração.   
       vetorS = new int[n];
       
       for (int i = 0; i < n; i++) {  
        
           vetorE [i] = Integer.parseInt(JOptionPane.showInputDialog("1 para mina e 0 para sem mina: "));
           
                if(vetorE[i]== 0){
             
                vetorS[i]= vetorE[i]+vetorE[i+1]+1;
           
                    System.out.println(vetorS[i]);
        
                }
                if(vetorE[i]== 1){
               
                vetorS[i]= vetorE[i]+vetorE[n-i]+vetorE[n-1]+1;
           
                    System.out.println(vetorS[i]);
        
                }
              
                }
}
 
           
       }

Sinto que estou quase lá, quem pode me ajudar a fechar essa questão ? preciso entregar no maximo até quinta-feira(25/07/2013).[/quote]

Pessoal CONSEGUI !!!

Agora me ajudem apenas a colocar orientado a objeto:

import javax.swing.JOptionPane;

public class Minado {
 public static void main(String[] args){
       
   
    int[] vetorE; 
    int[] vetorS;// só estou declarando a variável, não estou dimensionando ainda!!!!  
    int n, i;  

       n = Integer.parseInt(JOptionPane.showInputDialog("Quantas celulas possui o jogo: "));

       vetorE = new int[n]; // note que estou dimensionando DEPOIS da declaração.   
       vetorS = new int[n];
   
       
       
           for ( i = 0; i < n; i++) {  
        
           vetorE [i] = Integer.parseInt(JOptionPane.showInputDialog("1 para mina e 0 para sem mina: "));
            
            }
       
       
       for( i = 0; i < 1;i++){//roda a posição 0 até a oposição 1 do vetor
         
               
             
               
                vetorS[i]= vetorE[i]+vetorE[i+1];
               
                   System.out.println(vetorS[i]);     /*Retorna apenas primeira posição*/
        
       }
       
         for( i = 1; i <= 3;i++){//roda a posição de 1 até 3 do vetor, talvez precise trocar i=0 ou i=1.
               
              
                vetorS[i+1]= vetorE[i-1]+vetorE[i]+vetorE[i+1];
           
                 System.out.println(vetorS[i+1]);   /*Retorna apenas 3 posições */
               
         }
         
         for( i = 3; i < 4;i++){//roda apenas a posição 3 e 4
               
               
                vetorS[i+1]= vetorE[n-1]+vetorE[n-2];
           
                  System.out.println(vetorS[i+1]);   /*Retorna apenas a ultima posição*/
        
                
         }
       }
       

}

Eu entreguei o trabalho, e estava correto, orientado a objeto e tudo. Mas como se trata de uma avaliação resolvi não postar todo a solução.