Problema com instancia

7 respostas
C

olá pessoal, estou com um problema aqui com instancia, não estou conseguindo resolver.
eu instancio um objeto do tipo jogador no main e na classe inimigo, com isso ele fica sendo dois jogadores diferentes.porem, esse foi o uico jeito que eu conseguir acessar o métodp inimogo(ver abaixo).como que eu posso fazer com que instanciando um objeto do tipo inimigo ele reconheça que eh apenas um jogador?
segue abaixo as duas classes.

public class ProgramaPrincipal {
	
public static void main(String[] args) {
	Scanner sc = new Scanner(System.in);
	Jogador j = new Jogador();
	GerenciadorDePerguntas gp = new GerenciadorDePerguntas();
	Erro e = new Erro();
	Inimigo i;
	int opc;
	
	
	
	String nome = JOptionPane.showInputDialog("digite o nome do jogador");
	j.setNome(nome);
	JOptionPane.showMessageDialog(null, "Seja bem vindo " +nome+"\nPontos: " +j.getPontos()+ "\nLife: "+ j.getLife());
	do{
		//Pergunta p = new Pergunta();
		opc = Integer.parseInt(JOptionPane.showInputDialog("1 - Desafiar algum inimigo?\n 2 - Ver Pontuação?\n 3 - Cadastrar Pergunta\n 4 - Listar Perguntas\n5 - Sair do Jogo"));
		
		switch(opc){
		case 1:
				opc = Integer.parseInt(JOptionPane.showInputDialog("Com quem você quer lutar?\n 1-Professor de Matematica\n 2-Professor de Portugues"));
					if(opc==1){
					}
					if(opc==2){
						i = new Inimigo();
						i.enfrentarInimigo("portugues");
						break;
					}
				break;
				
				
		case 2:
				JOptionPane.showMessageDialog(null, "Pontos; " +j.getPontos() + "Life: " + j.getLife());
				break;
		
		case 3:
				/*String nivel = JOptionPane.showInputDialog("Digite o nivel");
				String disciplina= JOptionPane.showInputDialog("Digite a disciplina");
				String pergunta = JOptionPane.showInputDialog("Digite a pergunta");
				resposta = JOptionPane.showInputDialog("Digite a resposta");
				p.setDisciplina(disciplina);
				p.setNivel(nivel);
				p.setPergunta(pergunta);
				//p.setResposta(resposta);
				gp.cadastrarPergunta(p);*/
				break;
				
		case 4:
								
		}
	
		}while(opc!=5);
	
	
}
}
public class Inimigo {
	private int life = 10;
	Jogador j = new Jogador();
	GerenciadorDePerguntas gp = new GerenciadorDePerguntas();
	Erro e = new Erro();
	ArrayList <Pergunta> listaPerguntas = new ArrayList <Pergunta>();
	int opc;
	String nome,resposta;
	
	public int getLife(){
		return life;
	}
	

	public void diminuirLife(){
			this.life -=1;
		}
		

	
	public void enfrentarInimigo(String disciplina){
		if(getLife()==0){
			JOptionPane.showMessageDialog(null,"professor derrotado" );
		}
		else{
			JOptionPane.showMessageDialog(null,"Batalha: \n " +j.getNome() + " X Professor de " +disciplina );
			listaPerguntas = gp.lerPerguntas(disciplina);
			do{
				for(Pergunta p1: listaPerguntas){
					resposta = JOptionPane.showInputDialog(p1.getPergunta());
					if(e.verificaErro(resposta)==true){
						JOptionPane.showMessageDialog(null, "resposta certa");
						j.setPontos(10);
						diminuirLife();
					}
					else{
					JOptionPane.showMessageDialog(null, "resposta errada");
						j.errarReposta();
						if(j.getLife()==0){
							JOptionPane.showMessageDialog(null, "voce perdeu");
							System.exit(1);
						}
					}
				
				}
			}while(getLife()>0);
				JOptionPane.showMessageDialog(null, "voce venceu");
		}
	}
	
}

7 Respostas

F

Apague a linha 3 Jogador j = new Jogador(); da classe Inimigo.
Alrere a linha 21 public void enfrentarInimigo(String disciplina){ para

public void enfrentarInimigo(String disciplina, Jogador j){ da classe Inimigo.
Altere a linha 27 i.enfrentarInimigo("portugues"); dad classe ProgramaPrincipal para i.enfrentarInimigo("portugues",j);

Veja se entendi bem o que você queria.

C

exatamente isso!deu certo
agora soh tem um problema…ele não esta nunca entrando no primeiro if do metodo enfrentarInimigo, uma vez que no main eu estou criando sempre um novo inimigo para as batalhas porque são necessarias, pelo menos no meu modo de ver!
como é que eu posso resolver isso?

fesaab

ao invés de vc criar um inimigo toda hora que ele escolher a disciplina, crie ele antes do loop principal:

public class ProgramaPrincipal {
public static void main(String[] args) {
	Scanner sc = new Scanner(System.in);
	Jogador j = new Jogador();
	GerenciadorDePerguntas gp = new GerenciadorDePerguntas();
	Erro e = new Erro();
	Inimigo i = new Inimigo(); //aqui vc cria o teu inimigo

        ....
        ....
        ....

	switch(opc){
		case 1:
				opc = Integer.parseInt(JOptionPane.showInputDialog("Com quem você quer lutar?\n 1-Professor de Matematica\n 2-Professor de Portugues"));
					if(opc==1){
					}
					if(opc==2){
						//i = new Inimigo();  <-- essa linha some!
						i.enfrentarInimigo("portugues");
						break;
					}
				break;
	...
        ...
        ...
}
C

é, eu ja tinha testado isso, da certo. o problema eh que para todas as instancias como por exemplo, matematica e portugues ele fica valendo para todos entendeu?eu keria que valessa para apenas 1.

public static void main(String[] args) {
	Scanner sc = new Scanner(System.in);
	Jogador j = new Jogador();
	GerenciadorDePerguntas gp = new GerenciadorDePerguntas();
	Inimigo i = new Inimigo();
	int opc;
	
	
	
	String nome = JOptionPane.showInputDialog("digite o nome do jogador");
	j.setNome(nome);
	JOptionPane.showMessageDialog(null, "Seja bem vindo " +nome+"\nPontos: " +j.getPontos()+ "\nLife: "+ j.getLife());
	do{
		Pergunta p = new Pergunta();
		opc = Integer.parseInt(JOptionPane.showInputDialog("1 - Desafiar algum inimigo?\n 2 - Ver Pontuação?\n 3 - Cadastrar Pergunta\n 4 - Listar Perguntas\n5 - Sair do Jogo"));
		
		switch(opc){
		case 1:
				opc = Integer.parseInt(JOptionPane.showInputDialog("Com quem você quer lutar?\n 1-Professor de Matematica\n 2-Professor de Portugues"));
					if(opc==1){
						i.enfrentarInimigo("matematica", j);
					}
					if(opc==2){
						i.enfrentarInimigo("portugues", j);
						break;
					}
				break;
fesaab

basta criar um inimigo para cada disciplina:

public static void main(String[] args) {
	Scanner sc = new Scanner(System.in);
	Jogador j = new Jogador();
	GerenciadorDePerguntas gp = new GerenciadorDePerguntas();
	Erro e = new Erro();
	Inimigo iniPort = new Inimigo(); 
	Inimigo iniMat = new Inimigo(); 

        ....
        ....
        ....

	switch(opc){
		case 1:
				opc = Integer.parseInt(JOptionPane.showInputDialog("Com quem você quer lutar?\n 1-Professor de Matematica\n 2-Professor de Portugues"));
					if(opc==1){
						iniMat.enfrentarInimigo("matematica",j);
						break;
					}
					if(opc==2){
						iniPort.enfrentarInimigo("portugues",j);
						break;
					}
				break;
	...
        ...
        ...
}
C

certo…ja tinha feito isso.
eh pq eu keria de outra maneira, por polimorfismo, herança.
é possivel?

fesaab

se vc quiser chamar apenas o método

i.enfrentarInimigo("matematica",j);

o que vc pode fazer é o seguinte:
vc pode criar uma nova classe para gerenciar os inimigos, ex: GerenciadorInimigos.java
e ao invés de vc criar os objetos Inimigo no programa principal, vc cria um GerenciadorInimigos.
Dentro dessa nova classe vc vai ter os seus Inimigos. ex:

class GerenciadorInimigos{
	private Inimigo port;
	private Inimigo mat;
	
	//...
	
	public void batalha(String disciplica, Jogador j){
		if (disciplina.equals("portugues"))
			port.enfrenta(j);
		else if (disciplina.equals("matematica"))
			mat.enfrenta(j);
	}
}

Ai na classe inimigo vc não precisa mais passar a disciplina, uma vez que cada instância representará um professor de uma matéria.

Criado 10 de abril de 2010
Ultima resposta 10 de abr. de 2010
Respostas 7
Participantes 3