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;
}
}