[Resuelto] Ayuda proyecto java

Iniciado por hossman92, 30 Enero 2015, 16:57 PM

0 Miembros y 1 Visitante están viendo este tema.

hossman92

hola buenas me han mandando en mi ciclo de DAM el ejercicio de piedra papel o tijera en java y no consigo que me cuente el valor de la opcion elejida por el jugador a la ora de comparar que ha ganado si el jugador o la makina. Os dejo el codigo y en la linea que veo que falla con el modo debug he puesto el comentario. Gracias por adelantado!!

El error esta en el metodo void calculoGanador()

PD: Se que falta todavia el bucle while del juego para poder jugar varias veces y el menu lo tengo quitado para hacer pruebas, se va directamente a la opcion jugar.

Clase donde creo que esta el error

package paquete;

import java.io.BufferedReader;
import java.io.InputStreamReader;
//import java.util.Scanner;

public class playerIA {

private String nombre;
private int puntosPlayer,puntosIA;
private String opcPlayer,opcIA;
private String opcion;
private int opc;

public playerIA(String nombrePlayer){

nombre = nombrePlayer;
puntosPlayer=0;
puntosIA=0;
}
public void eleccionPlayer(){
System.out.println("Introduce tu eleccion ('Piedra''Papel''Tijera')");
InputStreamReader isr = new InputStreamReader (System.in);
BufferedReader br = new BufferedReader (isr);
try{
this.opcPlayer = br.readLine();
}
catch(Exception e){
e.printStackTrace();
}

}
public void eleccionIA(){
int num = (int)(Math.random()*100);
if (num>=0&&num<=33){
opcIA = "piedra";

}
else if (num>33&&num<66){
opcIA = "papel";

}
else if(num>=66&&num<=100){
opcIA = "tijera";

}
}
public void calculoGanador(){
/*ERROR AQUI *****************************************/
//ERROR AQUI NO LEE PARA COMPARAR la opcPlayer!!!!!!!!!!
//anoser que se les de un valor directo aki (si leo de teclado aki falla igual)
//opcPlayer = "papel";



System.out.println("IA: "+opcIA+" Tu: "+opcPlayer);
if (opcIA=="piedra"){

if (opcPlayer =="papel"){
puntosPlayer++;
System.out.println("Gana "+ nombre);
}
else if (opcPlayer == "tijera"){
puntosIA++;
System.out.println("Gana la IA!!");
}
}
else if (opcIA=="papel"){
if (opcPlayer == "piedra"){
puntosIA++;
System.out.println("Gana la IA!!");
}
else if (opcPlayer =="tijera"){
puntosPlayer++;
System.out.println("Gana "+ nombre);
}
}
else if (opcIA=="tijera"){
if (opcPlayer == "papel"){
puntosIA++;
System.out.println("Gana la IA!!");
}
else if (opcPlayer =="piedra"){
puntosPlayer++;
System.out.println("Gana "+ nombre);
}
}
if (opcIA==opcPlayer){
System.out.println("EMPATE!!");
}
}
public int getPuntosPlayer(){
return puntosPlayer;
}
public int getPuntosIA(){
return puntosIA;
}
public String getName(){
return nombre;
}
public String getopcIA(){
return opcIA;
}
public String getopcPlayer(){
return opcPlayer;
}
public int menu(){
System.out.println("Bienvenido a Piedra Papel o Tijera!!!");
System.out.println("Seleccione una opcion: 1.Jugar 2.Instrucciones 3.Salir");
InputStreamReader isr = new InputStreamReader (System.in);
BufferedReader br = new BufferedReader (isr);
try{
opcion = br.readLine();
}
catch(Exception e){
e.printStackTrace();
}

try {
opc = Integer.parseInt(opcion);
}catch(Exception e){
System.err.println("Error de conversion de datos. "+e.toString());
}
return opc;
}
public void instrucciones(){
System.out.println("Bienvenido a las instrucciones del juego. "
+ "Para jugar pulsa en jugar e introduce la palabra 'piedra' , 'papel' , 'tijera' ");
System.out.println("Piedra gana a Tijera");
System.out.println("Tijera gana a Papel");
System.out.println("Papel gana a Piedra");
}
public void pantallaJuego(int player,int IA,String nombre){
System.out.println("Marcador: "+nombre+": "+player+" IA: "+IA);
}
}


Clase el main

package paquete;

public class Ejecutable {

public static void main(String[] args) {


String nombre = "Jugador";
playerIA juego = new playerIA(nombre);
int opcion = 1;
if (opcion == 1){
juego.eleccionIA();
juego.eleccionPlayer();
juego.calculoGanador();
int pPlayer =juego.getPuntosPlayer();
int pIA = juego.getPuntosIA();
String name = juego.getName();
juego.pantallaJuego(pPlayer,pIA,name);
}
else if (opcion == 2){
juego.instrucciones();
}
else if (opcion == 3){

}
else {

}

}

}


3n31ch

#1
Te recomiendo leer este post:

http://foro.elhacker.net/java/aporte_buenas_practicas_y_convenciones_en_java_parte_uno_convenciones-t428844.0.html

Me gustaría que intentaras utilizando equals para comparar String, debo recordar que nunca utilices la comparación == con un String.

Código (java) [Seleccionar]
if (opcIA.equals("papel")) {}

Estoy viendo tu código, aun no hago pruebas.




Edito. Lo probé y con equals parece funcionar. Confirmalo y si funciona da el tema por solucionado  ;D

Si quieres saber porque utilizar equals y no ==, lee el siguiente articulo:

http://www.aprenderaprogramar.com/index.php?option=com_content&view=article&id=628:el-metodo-equals-en-java-diferencia-entre-igualdad-e-identidad-comparar-objetos-ejemplos-cu00662b&catid=68:curso-aprender-programacion-java-desde-cero&Itemid=188




Sigue practicando, tienes muchos errores de lógica, ese programa que estas haciendo tiene muchas formas de solucionarlo sin necesidad de tanto código.

IlconZy

La parte de las condiciones te debería funcionar, aún así usa equals para comparar strings.
El error debe ocurrir cuando intentas leer de teclado, yo nunca he usado InputStreamReader ni BufferedReader asi que no se exactamente como funcionan, pero con un Scanner te debería funcionar facilmente.

Código (java) [Seleccionar]

Scanner sc = new Scanner(System.in);
this.opcPlayer = sc.nextLine();


Ten cuidado con las mayúsculas y las minúsculas

Y aparte, lo que haces con el método pantallaJuego() no tiene ningun sentido, porque los atributos los tienes en la propia clase, sacandolos al main y pasándolos como parámetros lo único que consigues es gastar más cpu.

Espero que te sirva de ayuda, un saludo!

3n31ch

Amigo mio, la verdad es que el error si era por culpa de la comparación de Strings. (Al menos eso logre confirmar)

Si no sabes como funciona BufferedReader entonces como puede saber que es un error?  :xD (Solo me llamo la atención la seguridad con la cual dijiste eso.)

Te explico, entre Scanner y BufferedReader existen algunas diferencias.

  • BufferedReader tiene una memoria mucho mas grande que Scanner.
  • Scanner puede hacer uso de distintos tipos de datos mientras que BufferReader solo puede almacenar String.
  • BufferedReader es sincrona y Scanner no lo es. Por esta razon se debe utilizar BufferedReader si se esta trabajando con Threads.
  • BufferedReader es mas rapido que Scanner

Como esta hay muchas mas características que los podrían diferenciar pero para mi una de las principales es el hecho de que BufferedReader a manejar los errores utilizando las sentencias try catch o similares.

Recomiendo el uso de BufferedReader aun cuando Scanner es mucho mas sencillo de usar.

Usuario Invitado

Como ya te lo han dicho, en Java las cadenas no se comparan igual como con javascript o PHP. En Java el operador "==" lo que hace es comparar referencias, y con ésto me refiero a memoria.

Aportando algo pequeño para que puedas entenderlo, en el siguiente ejemplo, la variable name es guardado en memoria con el valor "Bugs Bunny". Al comparar lo con el texto "Bugs Bunny", dará true pero no porque las cadenas sean iguales, si no porque apuntan a la misma dirección de memoria.

Código (java) [Seleccionar]
String name = "Bugs Bunny";
System.out.println(name == "Bugs Bunny")


El operador == evalúa ambos lados. name que es el texto "Bugs Bunny" (izquierda) hace referencia a la dirección 0X0FAB23D4, y "Bugs Bunny" (derecha) hace referencia a la dirección de memoria 0X0FAB23D4. Es decir, la misma dirección de memoria.

Pero si haces:

Código (java) [Seleccionar]
String name = new String("Bugs Bunny");
System.out.println(name == "Bugs Bunny");


El compilador determinará que es falso. Porque name es un objeto que engloba un texto, pero que tiene muchas otras propiedades, mientras que "Bugs Bunny" es un texto simple. Por lo tanto, no son iguales. En Java, al hacer uso de new creas una nueva instancia de dicha clase con lo que se le asigna una dirección independiente de memoria.

El método equals lo que hace es comparar el texto de dos objetos String. Por lo que, es lo más adecuado para comparar cadenas.

Salu2.

"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein

IlconZy

Si las condiciones es lo que primero parece que debe fallar, pero como decía que si daba valores a las variables directamente le funcionaba y el error venía de cuando lo pedía por teclado... pensé que podía ser cosa de la forma de recoger la información por teclado.

Luego me miraré lo de BufferedReader más a fondo gracías por tu aportación:)

hossman92

sii por fin muchas gracias era lo del .equals que peso me he quitado de encima muchisimas gracias a todos! ya he podido entregar el proyecto completo y funcionando a la perfeccion os debo una cerveza a todos jajaja

Usuario Invitado

Una heiniken para mí  ;D

Salu2 y cualquier duda te pasas por acá.
"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein

hossman92

Cita de: IlconZy en  2 Febrero 2015, 10:40 AM
Si las condiciones es lo que primero parece que debe fallar, pero como decía que si daba valores a las variables directamente le funcionaba y el error venía de cuando lo pedía por teclado... pensé que podía ser cosa de la forma de recoger la información por teclado.

Luego me miraré lo de BufferedReader más a fondo gracías por tu aportación:)
yo tambien pense que fuera de eso si no era en las condiciones pero probe tambien con scanner y me pasaba lo mismo asi que ya lo descarte jajaj

y gracias Gus porque aparte de que funcione entiendo el porque sobre la referencia a memoria y todo eso me habeis ahorrado muchos problemas en el futuro  :D

3n31ch

Cita de: hossman92 en  5 Febrero 2015, 15:12 PM
sii por fin muchas gracias era lo del .equals que peso me he quitado de encima muchisimas gracias a todos! ya he podido entregar el proyecto completo y funcionando a la perfeccion os debo una cerveza a todos jajaja

Yo te cobrare esa cerveza  :rolleyes:

Suerte con tus futuros proyectos. ^^ (No todos agradecen, muchas gracias por hacerlo)