Java - Problema piedra papel tijeras

 
Vista:
sin imagen de perfil
Val: 11
Ha aumentado su posición en 4 puestos en Java (en relación al último mes)
Gráfica de Java

Problema piedra papel tijeras

Publicado por Sergio (5 intervenciones) el 05/12/2018 19:24:15
/*Hola buenas, este es un ejercicio *de un juego de *piedra papel y tijera. El problema que *tengo es con *los breaks de los switch de los *metodos que me da *error, si alguien fuera tan amable de revisarmelo le */estaria muy agradecido. El contador y la funcion if que trabaja con esa variable estan por que me jan pedido que la maquina este trucada y gane cada x numeros de veces. He decidido que gane cada jugada par.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
package Ejercicios;
import java.util.Scanner;
import java.util.Random;
 
public class Piedra {
 
 
	static final int piedra = 1;
	static final int papel = 2;
	static final int tijeras = 3;
 
	public static void main(String[] args) {
		int ordenador;
		int usuario;
		int ganador;
		char continuar;
		int contador;
 
		contador = 1;
 
		do {
            Scanner s= new Scanner(System.in);
 
            System.out.println("Introduzca una opcion numerica: Piedra = 1, Papel = 2 o Tijera = 3");
            usuario = s.nextInt();
            Decision(usuario);
            contador ++;
            ordenador =  generarValor(contador,usuario);
            ganador = calcularGanador(usuario,ordenador);
            if ( calcularGanador(usuario,ordenador) == 1) {
                System.out.println("Has ganado, enhorabuena");
            }else if (calcularGanador(usuario,ordenador) == 2) {
                System.out.println("Has perdido pringado");
            } else if (calcularGanador(usuario,ordenador) == 0) {
                System.out.println("Empate, que compenetracion");
            }
            s.nextLine();
            System.out.println("Desea continuar? S / N");
            continuar = s.next().charAt(0);
		}while (continuar !='N' || continuar !='n');
 
 
	}
 
	static int calcularGanador(int jugador1, int jugador2) {
		if (jugador1 == jugador2) {
			return 0;
		}else {
			switch (jugador1) {
			case 1: switch (jugador2) {
                    case 2: return 2;
                        break,
                    case 3: return 1;
                        break;
                }
                break;
			case 2: switch (jugador2) {
                    case 1: return 1;
                        break;
                    case 3: return 2;
                        break;
                }
                break;
			case 3: switch (jugador2) {
                    case 1: return 2;
                        break;
                    case 2: return 1;
                        break;
                }
                break;
 
			}
		}
	}
 
	static void Decision (int usuario) {
		switch (usuario) {
		 case 1: System.out.println("has elegido piedra");
                break;
		 case 2: System.out.println("has elegido papel");
                break;
		 case 3: System.out.println("has elegido tijeras");
                break;
		 default: System.out.println("No es una opcion valida");
                break;
		}
 
	}
 
 
 
	static int generarValor(int contador, int usuario) {
	    if (contador %2 == 0 ) {
	       switch (usuario) {
	           case 1: return 2;
	                          break;
	           case 2: return 3;
	                          break;
	           case 3: return 1;
	                          break;
	       }
	    } else {
            Random r = new Random();
 
            return r.nextInt(3)+1;
	    }
 
    }
 
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 755
Bronce
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Problema piedra papel tijeras

Publicado por Yamil Bracho (2315 intervenciones) el 05/12/2018 19:31:54
De un vistazo rapiso, hay un break que en vez de terminar con ; tiene ,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 11
Ha aumentado su posición en 4 puestos en Java (en relación al último mes)
Gráfica de Java

Problema piedra papel tijeras

Publicado por Sergio (5 intervenciones) el 05/12/2018 19:49:16
Si perdoname por el error de sintaxys, el codigo esta reescrito desde mi movil ( bueno mas concretamente los breaks) por eso se me ha colado una coma. Llevo poco tiempo y el caso es que he probado a ver que error me daba quitando los breaks (ya se que es una tonteria) y al enviarmelo al movil lo he enviado sin ellos por lo que he tenido que volver a escribirlos...pero el error no era ese. De todas formas agradezco una respuesta tan rapida.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 11
Ha aumentado su posición en 4 puestos en Java (en relación al último mes)
Gráfica de Java

Problema piedra papel tijeras

Publicado por Sergio (5 intervenciones) el 05/12/2018 19:51:29
Si perdoname por el error de sintaxys, el codigo esta reescrito desde mi movil ( bueno mas concretamente los breaks) por eso se me ha colado una coma. Llevo poco tiempo y el caso es que he probado a ver que error me daba quitando los breaks (ya se que es una tonteria) y al enviarmelo al movil lo he enviado sin ellos por lo que he tenido que volver a escribirlos...pero el error no era ese. De todas formas agradezco una respuesta tan rapida.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 755
Bronce
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Problema piedra papel tijeras

Publicado por Yamil Bracho (2315 intervenciones) el 05/12/2018 20:12:16
Te marca algun error el compiler o cuando estas ejecutando ?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 11
Ha aumentado su posición en 4 puestos en Java (en relación al último mes)
Gráfica de Java

Problema piedra papel tijeras

Publicado por Sergio (5 intervenciones) el 05/12/2018 20:18:30
Unreachable code en los breaks y lo de que debo devolver un dato de tipo int en los metodos... el caso esq el primer metodo lo he hecho a medias con mi profesor por eso me extrañaba ese error.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Problema piedra papel tijeras

Publicado por Kabuto (1381 intervenciones) el 06/12/2018 00:11:29
Hola.

Los breaks puedes quitarlos, puesto que lo que haces es un return en cada case del switch, dicho return finaliza el método y por eso te dice que los break son "inalcanzables", porque en ningún momento se va a llegar a ellos.

Luego, el otro problema viene porque tus métodos han de GARANTIZAR que se va a devolver un entero.

Por, ejemplo, en este método (ya sin breaks):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
static int generarValor(int contador, int usuario) {
    if (contador %2 == 0 ) {
        switch (usuario) {
        case 1: return 2;
        case 2: return 3;
        case 3: return 1;
        }
    } else {
        Random r = new Random();
 
        return r.nextInt(3)+1;
    }
 
}

El switch contempla retornos de enteros en caso de que la variable usuario valga 1, 2 ó 3...
Pero, ¿ y si vale 4? ¿si vale 0? ¿si vale -15000?

Claro, tú que eres el programador sabes que a ese switch solo es posible que lleguen los valores 1, 2 y 3.
Pero el compilador no lo sabe. Solo sabe que tu solo has contemplado retornos para 3 posibles ints, cuando un int tiene 2* 10^9 posibles valores.

En fín, que lo que tienes que hacer para que el compilador se quede más tranquilo, es incluir una sentencia default: para garantizar que habrá un retorno, para cualquier posible valor recibido por el switch.

Tienes dos posibilidades:
Puedes poner un default extra, aunque tu sepas que jamás se va a producir, y que devuelva un valor int cualquiera:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
static int generarValor(int contador, int usuario) {
    if (contador %2 == 0 ) {
        switch (usuario) {
        case 1: return 2;
        case 2: return 3;
        case 3: return 1;
        default: return 0;
        }
    } else {
        Random r = new Random();
 
        return r.nextInt(3)+1;
    }
 
}


O bien puedes sustituir el case 3 por un default y que retorne el valor correspondiente al case 3 que sustituye.
Técnicamente no te supone ningún problema porque si no es ni 1 ni 2, tu ya sabes que va a ser el 3:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
static int generarValor(int contador, int usuario) {
    if (contador %2 == 0 ) {
        switch (usuario) {
        case 1: return 2;
        case 2: return 3;
        default: return 1;
        }
    } else {
        Random r = new Random();
 
        return r.nextInt(3)+1;
    }
 
}

Cualquiera de las dos opciones es válida.

Quizás, siendo quisquillosos, podríamos decir que es más correcta la primera opción.
Porque a la hora de "leer" el código, queda claro que si el metodo retorna un 1, es porque el switch ha recibido un 3.

La segunda opción se puede interpretar que si se retorna un 1, es porque ha recibido cualquier valor distinto de 1 y 2. Y en realidad esta no sería la lectura correcta de lo que se supone ha de hacer el código.

Así que mejor la primera opción, a la que incluso se puede poner un comentario indicando el motivo de añadir un default que nunca va a suceder:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
static int generarValor(int contador, int usuario) {
    if (contador %2 == 0 ) {
        switch (usuario) {
        case 1: return 2;
        case 2: return 3;
        case 3: return 1;
        //Añadimos un default para que el compilador no toque las narices :P
        default: return 0;
        }
    } else {
        Random r = new Random();
 
        return r.nextInt(3)+1;
    }
 
}


Esto mismo tendrás que hacerlo para los otros métodos. Siempre has de GARANTIZARLE al compilador que va a poder retornar un valor en cualquier caso, ya sea posible o imposible.
Así que las sentencias condicionales, tanto switchs como if else... han de ser escritas dando esta garantía.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Problema piedra papel tijeras

Publicado por Kabuto (1381 intervenciones) el 06/12/2018 00:34:32
Por cierto, corregidos los switch, detecto dos problemitas.

1- Aunque metas una opcion no válida, el programa te informa de que no es válida, pero aún así el programa "juega" con dicha opción no valida.

Tal vez el método Decision() debiera ser de tipo boolean y SOLO jugar si devuelve TRUE, es decir, se ha tecleado 1, 2 ó 3. Para cualquier otro valor, devolverá FALSE y el programa no intentará jugar. Pasará directamente a preguntar si quieres seguir jugando o no.

2- La condición de salida del WHILE no es correcta, aunque teclees N o n para salir, sigue jugando. Prestale atención y enseguida verás el por qué la condición no es correcta.

Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
sin imagen de perfil
Val: 11
Ha aumentado su posición en 4 puestos en Java (en relación al último mes)
Gráfica de Java

Problema piedra papel tijeras

Publicado por Sergio (5 intervenciones) el 06/12/2018 09:25:19
Muchas gracias kabuto , bueno y a todos los que habeis contestado, ahora mismo me pongo a trabajar en ello. Me queda mucho por aprender pero poco a poco con la ayuda de gente como vosotros espero convertirme en un buen programador. Jeje
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problema piedra papel tijeras

Publicado por samantha (1 intervención) el 02/05/2019 17:36:39
Disculpa, ya tienes el codigo corregido? lo hice pero no me quedo. Te agradeceria mucho
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Problema piedra papel tijeras

Publicado por Kabuto (1381 intervenciones) el 02/05/2019 23:25:45
Hola.

Yo lo tengo, con las correcciones que le comenté al compañero:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
public class Piedra {
 
	static final int piedra = 1;
	static final int papel = 2;
	static final int tijeras = 3;
 
	public static void main(String[] args) {
		int ordenador;
		int usuario;
		int ganador;
		char continuar;
		int contador = 1;
		Scanner s= new Scanner(System.in);
 
		do {
 
			System.out.println("Introduzca una opcion numerica: Piedra = 1, Papel = 2 o Tijera = 3");
			usuario = s.nextInt();
			if (Decision(usuario)) { //Solo se jugará si Decision retorna true
				contador ++;
				ordenador = generarValor(contador,usuario);
				ganador = calcularGanador(usuario,ordenador);
				if ( ganador == 1) {
					System.out.println("Has ganado, enhorabuena");
				}else if (ganador == 2) {
					System.out.println("Has perdido pringado");
				} else if (ganador == 0) {
					System.out.println("Empate, que compenetracion");
				}
			}
			s.nextLine();
			System.out.println("Desea continuar? S / N");
			continuar = s.nextLine().charAt(0);
		}while (continuar !='N' && continuar !='n');
		s.close();
 
	}
 
	static int calcularGanador(int jugador1, int jugador2) {
		if (jugador1 == jugador2) {
			return 0;
		}else {
			switch (jugador1)
			{
			case 1:
				switch (jugador2)
				{
					case 2: return 2;
					case 3: return 1;
					default: return 0;
				}
			case 2:
				switch (jugador2)
				{
					case 1: return 1;
					case 3: return 2;
					default: return 0;
				}
			case 3:
				switch (jugador2)
				{
				case 1: return 2;
				case 2: return 1;
				default: return 0;
				}
			default: return 0;
 
			}
		}
	}
 
	static boolean Decision (int usuario) {
		switch (usuario) {
		case 1: System.out.println("has elegido piedra");
		return true;
		case 2: System.out.println("has elegido papel");
		return true;
		case 3: System.out.println("has elegido tijeras");
		return true;
		default: System.out.println("No es una opcion valida");
		return false;
		}
 
	}
 
 
 
	static int generarValor(int contador, int usuario) {
		if (contador %2 == 0 ) {
			switch (usuario) {
			case 1: return 2;
			case 2: return 3;
			case 3: return 1;
			//Añadimos un default para que el compilador no toque las narices :P
			default: return 0;
			}
		} else {
			Random r = new Random();
 
			return r.nextInt(3)+1;
		}
 
	}
 
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar