Problema com jogo feito em java

Boa noite a todos! Faz 2-3 dias que estou tentando terminar esse programa…é pra faculdade.

Como eu sou “ótimo” em programação, pode ser algo bem bobo, mas mesmo assim não consegui encontrar :?

Se tiverem um tempo, por favor me deêm umas dicas!

O jogo é um JoKenPO (Papel, pedra e tesoura)

Segue o programa que fiz:

MAIN

 public static void main(String[] args) {
        int resp=0;
        PC pc;
        User user;
        Vencedor ven;
        ven = new Vencedor();
        user =new User();
        pc= new PC();
        Scanner scan = new Scanner(System.in);
        System.out.println("------------JokenPo!-----------\n\n");
        System.out.println("Quantas partidas terá o jogo?");
        int n = scan.nextInt(); //váriavel que possui a qtde de partidas
        System.out.println("Teremos: "+n+" partida(s)!");
      

        System.out.println("Escolha a sua arma!\n");
        System.out.println("0- Pedra");
        System.out.println("1-Tesoura");
        System.out.println("2-Papel");
        int n2= scan.nextInt(); //váriavel que possui a opção do user
        user.User(n2);
        pc.PC();
        user.Printando();
        System.err.println("Quem venceu: "+ven.Vencer() );
        pc.Printando();
        resp = (ven.Vencer());
     
        switch(resp){
            case 0: System.out.println("O computador ganhou!");
            break;
            case 1: System.out.println("Parabéns! Você ganhou!");
            break;
            case 2: System.out.println("Deu empate!");
            break;
            case 3: System.out.println("Erro!!!");
            break;
        }
      

 }
}

CLASSE USER

public class User  {
    int pedra, papel, tesoura,n;

    public int User(int n){ //onde vou por o n2 no main
        this.n=n;
        switch(n){
            case 0: Pedra();
            break;
            case 1: Tesoura();
            break;
            case 2: Papel();
            break;
        }
        return n;
       }
    public void Pedra(){
        }
    public void Tesoura(){
    }
    public void Papel(){
    }

   

    public void Printando(){
        switch(n){
            case 0: System.out.println("Usuário escolheu Pedra!");
            break;
            case 1: System.out.println("Usuário escolheu Tesoura!");
            break;
            case 2: System.out.println("Usuário escolheu Papel!");
            break;
        }
    }

}

CLASSE PC

package jokenpoii;
import java.util.Random;
/**
 *
 * @author profissional
 */
public class PC {
  Random randomValue = new Random();
       int valorAleatorio;
    Random op = new Random();
   
     int PC(){
   
         int valorAleatorio = randomValue.nextInt(3);

    
this.valorAleatorio=valorAleatorio;
   switch(valorAleatorio){
       case 0: Pedra();
       break;
       case 1: Tesoura();
       break;
       case 2: Papel();
       break;
}
   return valorAleatorio;
 }
    public void Pedra(){}
    public void Tesoura(){}
    public void Papel(){}


public void Printando(){
    switch(valorAleatorio){
        case 0: System.out.println("O computador escolheu Pedra!");
        break;
        case 1: System.out.println("O computador escolheu Tesoura");
        break;
        case 2: System.out.println("O computador escolheu Papel!");
        break;
    }
}
}

CLASSE VENCEDOR —> Acredito que aqui esteja o meu erro…

public class Vencedor { 
 

 public Vencedor(){
     
 }

    public int Vencer(){ //a = user; b = pc
       PC b;
       b = new PC();
       User a;
       a = new User();
   
     
     if(a.n==1 && b.valorAleatorio==1){
         return 2;//2 é empate
     }
     if(a.n==0 && b.valorAleatorio==0){
     return 2;
     }
     if(a.n==2 && b.valorAleatorio==2){
         return 2;
     }
         // agora os casos onde somente o usuário pode ganhar
     if(a.n==2 && b.valorAleatorio==0){ //usuário:papel  PC: pedra
         return 1; // 1 o usuário ganha
     }
     if(a.n==1 && b.valorAleatorio==2){ //usuário:tesoura  PC:papel
         return 1; //1 usuário ganha
     }
     if(a.n==0 &&b.valorAleatorio==1){ //Pc: Tesoura  Usuário: pedra
         return 1;//1 o usuário ganha
     }

     //agora os casos onde o PC ganha

     if(a.n==0 && b.valorAleatorio==2){// PC: papel User: pedra
         return 0; //0 pc ganha
     }
     if(a.n==2 && b.valorAleatorio==1){// PC:Tesoura    User:papel
         return 0;//0 PC ganha
     }
     if(a.n==1 && b.valorAleatorio==0){ //PC: Pedra   User: tesoura
         return 0; //0 o PC ganha
     }
     return 3; // deu pau!
    }
}

EDIT: O erro é que sempre dá empate! Antes disso, o computador ganhava (quando o Usuário devia ganhar) e vice-versa… reescrevi tantas vezes que já perdi a conta! heuiaheiua

Vlw!

Caro, Colega,
O problema do empate, esta que você inicia um novo user e PC no metodo vencendor, onde voce compara os atributos deste, sempre serão zero pois não foi seta nenhum valor para estes, outra coisa não faça acesso direto as variaveis, utilize metodos get e set

[quote=willCesar]Caro, Colega,
O problema do empate, esta que você inicia um novo user e PC no metodo vencendor, onde voce compara os atributos deste, sempre serão zero pois não foi seta nenhum valor para estes, outra coisa não faça acesso direto as variaveis, utilize metodos get e set[/quote]

Wow! Realmente! Funcionou! Fiz dessa maneira :


 public int Vencer(int a, int b){ //a = user; b = pc


   
     
     if(a==1 && b==1){
         return 2;//2 é empate
     }
     if(a==0 && b==0){
     return 2;
     }
     if(a==2 && b==2){
         return 2;
     }
         // agora os casos onde somente o usuário pode ganhar
     if(a==2 && b==0){ //usuário:papel  PC: pedra
         return 1; // 1 o usuário ganha
     }
     if(a==1 && b==2){ //usuário:tesoura  PC:papel
         return 1; //1 usuário ganha
     }
     if(a==0 &&b==1){ //Pc: Tesoura  Usuário: pedra
         return 1;//1 o usuário ganha
     }

     //agora os casos onde o PC ganha

     if(a==0 && b==2){// PC: papel User: pedra
         return 0; //0 pc ganha
     }
     if(a==2 && b==1){// PC:Tesoura    User:papel
         return 0;//0 PC ganha
     }
     if(a==1 && b==0){ //PC: Pedra   User: tesoura
         return 0; //0 o PC ganha
     }
     return 3; // deu pau!
    }

Só por curiosidade:
Quando vc diz sobre usar get e set vc diz que eu deveria usar assim:


Classe User

public int getUser(){
 return n;
}

Classe PC

public int getPC(){
 return valorAleatorio;
}

Agora na classe [b]Vencedor[/b] eu deveria usá-las assim:

public void Vencedor(){

 User user;
user = new User();

PC pc;
pc= new PC();

Ae eu iria comparar dessa maneira:

if(user.getUser()==1 && pc.getPC()==0){
.....
.....

Assim estaria mais correto?

[quote=Fiuza] if(a==1 && b==1){ return 2;//2 é empate } if(a==0 && b==0){ return 2; } if(a==2 && b==2){ return 2; }
[/quote]

Porque não assim:

if (a == b) { return 2; }

[quote=pmlm][quote=Fiuza] if(a==1 && b==1){ return 2;//2 é empate } if(a==0 && b==0){ return 2; } if(a==2 && b==2){ return 2; }
[/quote]

Porque não assim:

if (a == b) { return 2; }[/quote]

Então, fiz isso uma vez e deu erro…então decidi mudar pra ver se sumia…como eu disse, reescrevi o código várias vezes heuiaheuia

Abraço