Ajuda em jogo labirinto

4 respostas
G

Olá pessoal, estou tendo um problema ao executar meu código. Estou fazendo o jogo labirinto, onde tem 3 tipos de bonus que diminui o nr de passos dados pelo usuario. Só que quando eu uso o nr de passos nas classes bonus e pontuação, o getNrPassos zera porém só dentro das classes ele zera, no main ele funciona normalmente. Não sei por que, já tentei varias formas e nada dá resultado.

Essa é classe onde faço os get's e set's do nr de passos.
public class Jogo {
    private int nrPassos;
    ...

    public void contadorDePassos(){
        ++nrPassos;
    }
      
    public void setNrPassos(int nrPassos){
        this.nrPassos = nrPassos;
    }

   public int getNrPassos() {
        return nrPassos;
    }

}
Classe Bonus
public class Bonus{
    Jogo j = new Jogo();
    
    private final int VALOR_A = -7;
    private final int VALOR_B = -5;
    private final int VALOR_C = -2;
    
    public char[][] testaPosVazia(char[][] lab){
        Random rnd = new Random();
        char[] bonus = {'A','B','C'};  
        int x, y, i = 0;
        boolean teste = false;
        do{
            x = rnd.nextInt(21);
            y = rnd.nextInt(21);
            
            if(lab[x][y] == ' ' && x != 19 && y != 20){
                lab[x][y] = bonus[i];
                ++i;
                if(i == bonus.length)
                    teste = true;
            }
        }while(teste == false);
        return lab;
    }
 
    public void testaBonus(char[][] lab, char tipoBonus){
        int valorFinal;
        switch(tipoBonus){
            case 'A':
                valorFinal = getVALOR_A();
                System.out.println(valorFinal);
                j.setNrPassos(valorFinal);
                break;
            case 'B':
                valorFinal = getVALOR_B();
                System.out.println(valorFinal);
                j.setNrPassos(valorFinal);
                break;
            case 'C':
                valorFinal = getVALOR_C();
                System.out.println(valorFinal);
                j.setNrPassos(valorFinal);
                break;
        }
    }
    
    public int getVALOR_A(){
        return (j.getNrPassos() + VALOR_A);
    }
    
    public int getVALOR_B(){
        return (j.getNrPassos() + VALOR_B);
    }
    
    public int getVALOR_C(){
         return (j.getNrPassos() + VALOR_C);
    }
}
Classe pontuação
public class Pontuacao {

    private final int PASSOS_MIN = 47;
    private final int PASSOS_MAX = 999;
    private int pontuacao;
    Jogo malditoJogo = new Jogo();

    public void calculaPontuacao() {
        if (malditoJogo.getNrPassos() > 999) {
            pontuacao = 0;
        } else {
            pontuacao = 46593 / malditoJogo.getNrPassos();
        }
    }
    
    public int getPontuacao(){
        return pontuacao;
    }
}

4 Respostas

N

Amigo, não seria pq vc inicia dois objetos Jogo (um na classe Bonus e um na classe Pontuação)? Se voce deseja que mais de uma classe acesse o mesmo objeto, envie o mesmo por referencia na construção delas ou crie sua classe como estática.

Abs

A

Concordo com o colega acima. Mostre tbm a classe com metodo main, pra podemos avaliar melhor.

G
Então pessoal, tentei fazer o que vocês disseram mas nao consegui ): Aqui tá o main:
import java.util.Scanner;
import negocio.*;

public class Labirinto {

    public static int posX = 1, posY = 1, passos;

    public static void main(String[] args) {
        Scanner scn = new Scanner(System.in);
        MenuJogo menu = new MenuJogo();
        Movimento move = new Movimento();
        Jogo jogo = new Jogo();
        Pontuacao ponto = new Pontuacao();
        Bonus bonus = new Bonus();

        String[] login = new String[2];
        char[][] labirinto = new char[21][21];
        
        boolean m = false;
        labirinto = menu.imprimeLabirinto();
        char anda;
        do {
            System.out.println(menu.imprimeMenuInicial());
            switch (scn.nextInt()) {
                case 1:
                    //System.out.print("Login: ");
                    //menu.testaLogin(scn.nextLine());
                    
                   
                    System.out.println("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
                    menu.imprimeMapa(labirinto);
                    do {
                
                        switch (scn.next().toUpperCase().charAt(0)) {
                            case 'W':
                                bonus.setPasso(jogo.getNrPassos());
                                move.cima(labirinto, posX, posY);
                                break;
                            case 'A':
                                bonus.setPasso(jogo.getNrPassos());
                                move.esq(labirinto, posX, posY);
                                break;
                            case 'S':
                                bonus.setPasso(jogo.getNrPassos());
                                move.baixo(labirinto, posX, posY);
                                break;
                            case 'D':
                                bonus.setPasso(jogo.getNrPassos());
                                move.direita(labirinto, posX, posY);
                                break;
                        }
                        jogo.contadorDePassos();
                        
                        jogo.setNrPassos(passos);
                        System.out.println("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nPassos: " + jogo.getNrPassos());
                        menu.imprimeMapa(labirinto);

                    } while (jogo.fimMapa() == false);

                    System.out.println("Total de passos: " + jogo.getNrPassos());
                    ponto.calculaPontuacao();
                    System.out.println("Total de pontos: " + ponto.getPontuacao());
                    break;

                case 2:
                    scn.nextLine();
                    System.out.println("Login:");
                    login[0] = scn.nextLine();
                    System.out.println("Senha:");
                    login[1] = scn.nextLine();
                    menu.incluirLogin(login);
                    break;
                case 0:
                    System.exit(1);
                default:
                    m = false;
            }
        } while (m == false);
    }

   
}

class MenuJogo {

    Jogo jogo = new Jogo();
    Gerente gerente = new Gerente();
    
    public String imprimeMenuInicial() {
        return "1-Novo jogo \n2-Criar login \n3-Score\n4 - Instrucoes\n0 - Sair";
    }

    public String imprimeMenuScore() {
        return "Score: \n\nNome          Pontuacao: \n";
    }

    public char[][] imprimeLabirinto() {
        String[] lab_temp = new String[21];
        char[][] lab = new char[21][21];


        lab_temp[0] = "+++++++++++++++++++++";
        lab_temp[1] = "+O    +             +";
        lab_temp[2] = "+ +++++ + +++++++ + +";
        lab_temp[3] = "+ +     +     +   + +";
        lab_temp[4] = "+ + +++ +++ +++++++ +";
        lab_temp[5] = "+   +     +   +   + +";
        lab_temp[6] = "+ +++++ + +++ + + + +";
        lab_temp[7] = "+ +     +       +   +";
        lab_temp[8] = "+++++ +++ + +++ +++++";
        lab_temp[9] = "+   +     +   +   + +";
        lab_temp[10] = "+ + + +++++++ + + + +";
        lab_temp[11] = "+ + +   + +     +   +";
        lab_temp[12] = "+ + +++ + + +++++ + +";
        lab_temp[13] = "+ +         +     + +";
        lab_temp[14] = "+ +++ +++ + + + +++ +";
        lab_temp[15] = "+   + +   + + + +   +";
        lab_temp[16] = "+++ + + + + + +++ +++";
        lab_temp[17] = "+       + +   + + + +";
        lab_temp[18] = "+   +++++ +++ + + + +";
        lab_temp[19] = "+   +           +    ";
        lab_temp[20] = "+++++++++++++++++++++";
        Bonus jogo2 = new Bonus();
        
        for (int i = 0; i < 21; ++i) {
            for (int j = 0; j < 21; ++j) {
                lab[i][j] = lab_temp[i].charAt(j);
            }
        }
        lab = jogo2.testaPosVazia(lab);
        return lab;
    }

    public void imprimeMapa(char[][] labirinto) {
        for (int i = 0; i < 21; ++i) {
            for (int j = 0; j < 21; ++j) {
                System.out.print(labirinto[i][j]);
            }
            System.out.println();
        }

    }
    
  
    public void incluirLogin(String[] login) {
        gerente.addLogin(login);
    }

    void testaLogin(String login) {
        gerente.testaLogin(login);
    }
}
Essa é classe que testa e faz o movimento
public class Movimento {
    private char tipoBonus;
    Bonus b1 = new Bonus();
    public char[][] cima(char[][] lab, int posX, int posY){
              
        if(lab[posX - 1][posY]!= '+'){
           if(lab[posX-1][posY] != ' '){
               tipoBonus = lab[posX - 1][posY];
               Labirinto.passos = b1.testaBonus(lab[posX - 1][posY]);
           }
           lab[posX - 1][posY] = 'O';
           lab[posX][posY] = ' ';
           Labirinto.posX = posX -1;
           
       }  
       return lab;
    }
    
    public char[][] baixo(char[][] lab, int posX, int posY){
        if(lab[posX + 1][posY]!= '+'){
           if(lab[posX+1][posY] != ' '){
               tipoBonus = lab[posX + 1][posY];
               b1.testaBonus(lab[posX + 1][posY]);
           }
           lab[posX + 1][posY] = 'O';
           lab[posX][posY] = ' ';
           Labirinto.posX = posX +1;
           
       }  
       return lab;
    }
    
    public char[][] esq(char[][] lab, int posX, int posY){
        if(lab[posX][posY -1]!= '+'){
           if(lab[posX][posY-1] != ' '){
               tipoBonus = lab[posX][posY-1];
               b1.testaBonus(lab[posX][posY-1]);
           }
           lab[posX][posY -1] = 'O';
           lab[posX][posY] = ' ';
           Labirinto.posY = posY -1;
           
       }  
       return lab;
    }
    
    public char[][] direita(char[][] lab, int posX, int posY){
        if(lab[posX][posY +1]!= '+'){
           if(lab[posX][posY+1] != ' '){
               tipoBonus = lab[posX][posY + 1];
               b1.testaBonus(lab[posX][posY + 1]);
           }
            lab[posX][posY +1] = 'O';
           lab[posX][posY] = ' ';
           Labirinto.posY = posY +1;
           
       }  
       return lab;
    
    }
    
}
A

Vou comenta o codigo:

public class Bonus{
    //Jogo j = new Jogo(); desnecessario, o certo é ter apenas um objeto Jogo pra todo o codigo
    
    private final int VALOR_A = -7;
    private final int VALOR_B = -5;
    private final int VALOR_C = -2;
    
    public char[][] testaPosVazia(char[][] lab){
        Random rnd = new Random();
        char[] bonus = {'A','B','C'};  
        int x, y, i = 0;
        boolean teste = false;
        do{
            x = rnd.nextInt(21);
            y = rnd.nextInt(21);
            
            if(lab[x][y] == ' ' && x != 19 && y != 20){
                lab[x][y] = bonus[i];
                ++i;
                if(i == bonus.length)
                    teste = true;
            }
        }while(teste == false);
        return lab;
    }
 
   
	    //altera o metodo para receber um objeto Jogo
		public void testaBonus(char tipoBonus, Jogo j){
        int valorFinal;
        switch(tipoBonus){
            case 'A':
				//passa o objeto jogo para os metodo getValor
                valorFinal = getVALOR_A(j);
                System.out.println(valorFinal);
                j.setNrPassos(valorFinal);
                break;
            case 'B':
                valorFinal = getVALOR_B(j);
                System.out.println(valorFinal);
                j.setNrPassos(valorFinal);
                break;
            case 'C':
                valorFinal = getVALOR_C(j);
                System.out.println(valorFinal);
                j.setNrPassos(valorFinal);
                break;
        }
    }
    //altera o metodo pra recebe objeto Jogo
    public int getVALOR_A(Jogo j){
        return (j.getNrPassos() + VALOR_A);
    }
    
    public int getVALOR_B(Jogo j){
        return (j.getNrPassos() + VALOR_B);
    }
    
    public int getVALOR_C(Jogo j){
         return (j.getNrPassos() + VALOR_C);
    }
}
public class Pontuacao {

    private final int PASSOS_MIN = 47;
    private final int PASSOS_MAX = 999;
    private int pontuacao;
    //Jogo malditoJogo = new Jogo(); novamente desnecessario
	
	
	//altera o metodo para receber um objeto Jogo
    public void calculaPontuacao(Jogo malditoJogo) {
        if (malditoJogo.getNrPassos() > 999) {
            pontuacao = 0;
        } else {
            pontuacao = 46593 / malditoJogo.getNrPassos();
        }
    }
    
    public int getPontuacao(){
        return pontuacao;
    }
}
import java.util.Scanner;


public class Labirinto {

    public static int posX = 1, posY = 1; //variavel passo nao eh necessario, ja temos uma variavel que conta os passos no objeto jogo

    public static void main(String[] args) {
        Scanner scn = new Scanner(System.in);
        MenuJogo menu = new MenuJogo();
        Movimento move = new Movimento();
        Jogo jogo = new Jogo();
        Pontuacao ponto = new Pontuacao();
        Bonus bonus = new Bonus();

        String[] login = new String[2];
        char[][] labirinto = new char[21][21];
        
        boolean m = false;
        labirinto = menu.imprimeLabirinto();
        char anda;
        do {
            System.out.println(menu.imprimeMenuInicial());
            switch (scn.nextInt()) {
                case 1:
                    //System.out.print("Login: ");
                    //menu.testaLogin(scn.nextLine());
                    
                   
                    System.out.println("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
                    menu.imprimeMapa(labirinto);
                    do {
                
                        switch (scn.next().toUpperCase().charAt(0)) {
                            case 'W':
								//nao sei que metodo eh esse chamado "setPasso", ele não existe na classe Bonus
								//nesse caso a linha é inutil, ja temos um metodo que conta o numero de passos
								
                                //bonus.setPasso(jogo.getNrPassos());
								
								//agora passa objeto jogo para os metodos
                                move.cima(labirinto, posX, posY, jogo);
                                break;
                            case 'A':
                                //bonus.setPasso(jogo.getNrPassos());
                                move.esq(labirinto, posX, posY, jogo);
                                break;
                            case 'S':
                                //bonus.setPasso(jogo.getNrPassos());
                                move.baixo(labirinto, posX, posY, jogo);
                                break;
                            case 'D':
                                //bonus.setPasso(jogo.getNrPassos());
                                move.direita(labirinto, posX, posY, jogo);
                                break;
                        }
                        jogo.contadorDePassos();
                        //metodo inutil. ja temos o metodo que conta o numero de passos
                        //jogo.setNrPassos(passos);
                        System.out.println("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nPassos: " + jogo.getNrPassos());
                        menu.imprimeMapa(labirinto);

                    } while (jogo.fimMapa() == false);

                    System.out.println("Total de passos: " + jogo.getNrPassos());
                     //passa o objeto jogo para o metodo
                    ponto.calculaPontuacao(jogo);
                    System.out.println("Total de pontos: " + ponto.getPontuacao());
                    break;

                case 2:
                    scn.nextLine();
                    System.out.println("Login:");
                    login[0] = scn.nextLine();
                    System.out.println("Senha:");
                    login[1] = scn.nextLine();
                    menu.incluirLogin(login);
                    break;
                case 0:
                    System.exit(1);
                default:
                    m = false;
            }
        } while (m == false);
    }

   
}

class MenuJogo {

    Jogo jogo = new Jogo();
    
    
    public String imprimeMenuInicial() {
        return "1-Novo jogo \n2-Criar login \n3-Score\n4 - Instrucoes\n0 - Sair";
    }

    public String imprimeMenuScore() {
        return "Score: \n\nNome          Pontuacao: \n";
    }

    public char[][] imprimeLabirinto() {
        String[] lab_temp = new String[21];
        char[][] lab = new char[21][21];


        lab_temp[0] = "+++++++++++++++++++++";
        lab_temp[1] = "+O    +             +";
        lab_temp[2] = "+ +++++ + +++++++ + +";
        lab_temp[3] = "+ +     +     +   + +";
        lab_temp[4] = "+ + +++ +++ +++++++ +";
        lab_temp[5] = "+   +     +   +   + +";
        lab_temp[6] = "+ +++++ + +++ + + + +";
        lab_temp[7] = "+ +     +       +   +";
        lab_temp[8] = "+++++ +++ + +++ +++++";
        lab_temp[9] = "+   +     +   +   + +";
        lab_temp[10] = "+ + + +++++++ + + + +";
        lab_temp[11] = "+ + +   + +     +   +";
        lab_temp[12] = "+ + +++ + + +++++ + +";
        lab_temp[13] = "+ +         +     + +";
        lab_temp[14] = "+ +++ +++ + + + +++ +";
        lab_temp[15] = "+   + +   + + + +   +";
        lab_temp[16] = "+++ + + + + + +++ +++";
        lab_temp[17] = "+       + +   + + + +";
        lab_temp[18] = "+   +++++ +++ + + + +";
        lab_temp[19] = "+   +           +    ";
        lab_temp[20] = "+++++++++++++++++++++";
        Bonus jogo2 = new Bonus();
        
        for (int i = 0; i < 21; ++i) {
            for (int j = 0; j < 21; ++j) {
                lab[i][j] = lab_temp[i].charAt(j);
            }
        }
        lab = jogo2.testaPosVazia(lab);
        return lab;
    }

    public void imprimeMapa(char[][] labirinto) {
        for (int i = 0; i < 21; ++i) {
            for (int j = 0; j < 21; ++j) {
                System.out.print(labirinto[i][j]);
            }
            System.out.println();
        }

    }
    
  
    public void incluirLogin(String[] login) {
        
    }

    void testaLogin(String login) {
        
    }
}
public class Movimento {
    private char tipoBonus;
    Bonus b1 = new Bonus();
	//altera os metodos de movimento para receber o objeto Jogo
    public char[][] cima(char[][] lab, int posX, int posY, Jogo j){
              
        if(lab[posX - 1][posY]!= '+'){
           if(lab[posX-1][posY] != ' '){
               tipoBonus = lab[posX - 1][posY];
			   //chama o metodo testaBonus passando o objeto jogo
			   b1.testaBonus(lab[posX - 1][posY],j);
			   //o metodo testaBonus não retorna nada, linha inutil
               //Labirinto.passos = b1.testaBonus(lab[posX - 1][posY],j);
           }
           lab[posX - 1][posY] = 'O';
           lab[posX][posY] = ' ';
           Labirinto.posX = posX -1;
           
       }  
       return lab;
    }
    
    public char[][] baixo(char[][] lab, int posX, int posY, Jogo j){
        if(lab[posX + 1][posY]!= '+'){
           if(lab[posX+1][posY] != ' '){
               tipoBonus = lab[posX + 1][posY];
               b1.testaBonus(lab[posX + 1][posY], j);
           }
           lab[posX + 1][posY] = 'O';
           lab[posX][posY] = ' ';
           Labirinto.posX = posX +1;
           
       }  
       return lab;
    }
    
    public char[][] esq(char[][] lab, int posX, int posY, Jogo j){
        if(lab[posX][posY -1]!= '+'){
           if(lab[posX][posY-1] != ' '){
               tipoBonus = lab[posX][posY-1];
               b1.testaBonus(lab[posX][posY-1], j);
           }
           lab[posX][posY -1] = 'O';
           lab[posX][posY] = ' ';
           Labirinto.posY = posY -1;
           
       }  
       return lab;
    }
    
    public char[][] direita(char[][] lab, int posX, int posY, Jogo j){
        if(lab[posX][posY +1]!= '+'){
           if(lab[posX][posY+1] != ' '){
               tipoBonus = lab[posX][posY + 1];
               b1.testaBonus(lab[posX][posY + 1], j);
           }
            lab[posX][posY +1] = 'O';
           lab[posX][posY] = ' ';
           Labirinto.posY = posY +1;
           
       }  
       return lab;
    
    }
    
}
Criado 30 de novembro de 2012
Ultima resposta 1 de dez. de 2012
Respostas 4
Participantes 3