Foro sobre Java SE > Problema: Sistema de elecciones en juego de rol.
Hola, y bienvenido, pues asi a voz de pronto:
Java SE = Standard Edition. Es el núcleo del lenguaje de programacion. Contiene todas las librerias y Api que todo programador java debe aprender (java.lang, java.io, java.math, java.net, java.util, etc...).
java EE = Enterprise Edition. Añade librerias a java SE que proveen funcionalidad para desplegar aplicaciones java multi-nivel, tolerante a fallos y distribuido, basado principalmente en componentes modulares que se ejecutan en un servidor de aplicaciones como Tomcat, Glassfish, Jboss, ...(Traducción guarrilla de wikipedia)
----------------------------------------------------------------------------------------------------
Ahora, sobre tu problema, viene principalmente propiciado por estas lineas:
System.out.println("¿Que haces?:\n");
System.out.println("a-Atacar\n");
System.out.println("b-Curar\n");
char letra = (char)System.in.read();
while (J1.hp >0 && J2.hp >0)
{
Si te fijas, lees la letra fuera del bucle, y después entras en un bucle, en el que te mantienes mientras la salud del J1 o J2 sea mayor que 0, es decir, hasta que alguno muera. Resumiendo, solo lees la letra 1 sola vez y ya con esa letra realizas la batalla, por tanto la acción de J1 y J2 siempre será la misma.
Solución:
Debes leer la letra dentro del bucle, Pero cuidado, porque no solo tienes que leerla 1 vez, sino 2 veces(una para J1 y otra para J2) en cada turno.
Te dejo que lo intentes y si no te sale, pues ya nos cuentas. Un saludo
Saludos denuevo!.. Muchisimas gracias por dejarme en claro lo de SE y EE.
Respecto a lo del problema, genial ! quedo bien, ahora se turnan pero me pasa algo inesperado. Me queme la cabeza modificando (lo cual me gusto) pero me sigue dando este problema.
--------------------------------------
Atacas ? a o b
a
Atacas a Orco
El jugador Orco pierde 17 de vida
Le quedan 183
1 monedas en tu poder
Atacas ? a o b
Atacas ? a o b
a
Atacas a Humano
El jugador Humano pierde 20 de vida
Le quedan 130
1 monedas en tu poder
----------------------------------------------
Digamos que me toma el turno 1, realiza la accion que le pido, pasa al turno 0, pero me sale 2 veces mas el Atacas? a o b.. y ahi me deja atacar al otro jugador.
Introduje los Lectores de Datos en los If de cada Jugador.
Por otro lado, meti los cambio de turno dentro de los "Case" para que apenas efectuada la opcion cambie (sino quedaba siempre 1 solo jugador atacando).
Tambien modifique el sistema de monedas que me las generaba aunque se pulse una letra aleatoria, ahora solo me las da si apreto 'a' o 'b'.
Les paso el Codigo.
-------------------------------------------------------------
while (J1.hp >0 && J2.hp >0)
{
if (turno == 1)
{
System.out.println("\n");
System.out.println("Atacas ? a o b");
System.out.println("\n");
char L1 = (char)System.in.read();
switch (L1)
{
case 'a': System.out.println("Atacas a "+J2.nm);
J2.hp=J2.hp-J1.atk+J2.def;
System.out.println("El jugador "+J2.nm+" pierde "+(J1.atk-J2.def)+" de vida");
System.out.println("Le quedan "+J2.hp);
J1.coin ++;
System.out.println(J1.coin+" monedas en tu poder");
turno = 0;
break;
case 'b': System.out.println("Te curas!");
if (J1.coin >=3)
{
System.out.println("Usas una pocion que cuesta 3 monedas y te curas 30 de vida.");
J1.hp= J1.hp+30;
System.out.println("Ahora tienes "+J1.hp+" de vida.");
J1.coin= J1.coin-3;
}
else
{
System.out.println("No te alcanzan las monedas. Lo siento.");
}
J1.coin ++;
System.out.println(J1.coin+" monedas en tu poder");
turno = 0;
break;
}
}
else
{
System.out.println("\n");
System.out.println("Atacas ? a o b");
System.out.println("\n");
char L2 = (char)System.in.read();
switch (L2)
{
case 'a': System.out.println("Atacas a "+J1.nm);
J1.hp=J1.hp-J2.atk+J1.def;
System.out.println("El jugador "+J1.nm+" pierde "+(J2.atk-J1.def)+" de vida");
System.out.println("Le quedan "+J1.hp);
J2.coin ++;
System.out.println(J2.coin+" monedas en tu poder");
turno = 1;
break;
case 'b': System.out.println("Te curas!");
if (J2.coin >=3)
{
System.out.println("Usas una pocion que cuesta 3 monedas y te curas 30 de vida.");
J2.hp= J2.hp+30;
System.out.println("Ahora tienes "+J2.hp+" de vida.");
}
else
{
System.out.println("No te alcanzan las monedas. Lo siento.");
}
J2.coin ++;
System.out.println(J2.coin+" monedas en tu poder");
turno = 1;
break;
}
}
Muchisimas gracias por la mano.
Hola, la verdad que mirando el código, no detecto a que puede ser debido, pero te recomiento que cambies los mensajes "Atacas ? a o b", poniendo "turno j1: Atacas ? a o b" cuando sea turno de j1 y "turno j2: Atacas ? a o b" cuando sea el turno de j2, de esa manera, podemos detectar si ese mensaje repetido es cuando turno ==1 o turno ==0.
De todas formas lo suyo es hacer un debug, y ir ejecutando el programa linea por linea, ahi manuales por ahi de como hacer debug segun el IDE(netbeas,eclise, intellij,...) que estes usando.
Si no consigues arreglarlo, pon todo el codigo completo de la clase principal y tb pon las clases Humano y Orco, y asi lo ejecuto a ver si veo que esta pasando.
Enga, un saludo.
No me di cuenta de cambiar el mensaje de cada jugador, me esta repitiendo 2 veces el mensaje del "orco".
Te paso el codigo completo.
-------------------------------------------------------
package guerralpha;
import java.io.IOException;
public class Guerralpha
{
public static void main(String[] args) throws IOException
{
int turno = 1;
Orco J2 = new Orco ();
Humano J1 = new Humano ();
System.out.println("Empieza la partida,A para atacar y B para defender.");
while (J1.hp >0 && J2.hp >0)
{
if (turno == 1)
{
System.out.println("\n");
System.out.println("Turno Humano");
System.out.println("\n");
char L1 = (char)System.in.read();
switch (L1)
{
case 'a': System.out.println("Atacas a "+J2.nm);
J2.hp=J2.hp-J1.atk+J2.def;
System.out.println("El jugador "+J2.nm+" pierde "+(J1.atk-J2.def)+" de vida");
System.out.println("Le quedan "+J2.hp);
J1.coin ++;
System.out.println(J1.coin+" monedas en tu poder");
turno = 0;
break;
case 'b': System.out.println("Te curas!");
if (J1.coin >=3)
{
System.out.println("Usas una pocion que cuesta 3 monedas y te curas 30 de vida.");
J1.hp= J1.hp+30;
System.out.println("Ahora tienes "+J1.hp+" de vida.");
J1.coin= J1.coin-3;
}
else
{
System.out.println("No te alcanzan las monedas. Lo siento.");
}
J1.coin ++;
System.out.println(J1.coin+" monedas en tu poder");
turno = 0;
break;
}
}
else
{
System.out.println("\n");
System.out.println("Turno Orco");
System.out.println("\n");
char L2 = (char)System.in.read();
switch (L2)
{
case 'a': System.out.println("Atacas a "+J1.nm);
J1.hp=J1.hp-J2.atk+J1.def;
System.out.println("El jugador "+J1.nm+" pierde "+(J2.atk-J1.def)+" de vida");
System.out.println("Le quedan "+J1.hp);
J2.coin ++;
System.out.println(J2.coin+" monedas en tu poder");
turno = 1;
break;
case 'b': System.out.println("Te curas!");
if (J2.coin >=3)
{
System.out.println("Usas una pocion que cuesta 3 monedas y te curas 30 de vida.");
J2.hp= J2.hp+30;
System.out.println("Ahora tienes "+J2.hp+" de vida.");
}
else
{
System.out.println("No te alcanzan las monedas. Lo siento.");
}
J2.coin ++;
System.out.println(J2.coin+" monedas en tu poder");
turno = 1;
break;
}
}
}
if(J1.hp <=0)
{
System.out.println("Jugador "+J2.nm+" a ganado.");
}else{
System.out.println("Jugador "+J1.nm+" a ganado.");
}
}
}
-------------------------------------------------------
package guerralpha;
public class Humano
{
String nm ="Humano";
int atk = 30;
int def = 15;
int hp = 150;
int coin = 0;
@Override
public String toString()
{
String O = "";
O += "Humano (NIVEL 1) "+"\n";
O += "Fuerza de Ataque: "+atk+"\n";
O += "Defensa: "+def+"\n";
O += "Salud: "+hp+"\n";
return O;
}
}
-----------------------------------------------------------
package guerralpha;
public class Orco
{
String nm ="Orco";
int atk = 35;
int def = 13;
int hp = 200;
int coin = 0;
@Override
public String toString()
{
String O = "";
O += "Orco (NIVEL 1) "+"\n";
O += "Fuerza de Ataque: "+atk+"\n";
O += "Defensa: "+def+"\n";
O += "Salud: "+hp+"\n";
return O;
}
}
-------------------------------------------------------------
Muy buena voluntad :) ! gracias denuevo..
Hola, el problema te viene por la forma en la que estas leyendo la letra, ya que cuando pulsas la "a" o "b" y después "Enter", en realidad estas pulsando dos teclas y hace que el bucle salte dos veces, cosas de java y lecturas de teclado con System.in.
Para solucionarlo, he modificado tu clase para leer con el objeto Scanner(Muy usando para leer distintos tipos de datos del teclado), y bueno esto queda así(Negrita las lineas modificadas):
import java.io.IOException;
import java.util.Scanner;
/**
*
* @author loderain
*/
public class Guerralpha {
public static void main(String[] args) throws IOException {
int turno = 1;
Orco J2 = new Orco();
Humano J1 = new Humano();
Scanner scanerTeclado=new Scanner(System.in);
System.out.println("Empieza la partida,A para atacar y B para defender.");
while (J1.hp > 0 && J2.hp > 0) {
if (turno == 1) {
System.out.println("\n");
System.out.println("Turno Humano");
System.out.println("\n");
char L1 = scanerTeclado.nextLine().charAt(0);
switch (L1) {
case 'a':
System.out.println("Atacas a " + J2.nm);
J2.hp = J2.hp - J1.atk + J2.def;
System.out.println("El jugador " + J2.nm + " pierde " + (J1.atk - J2.def) + " de vida");
System.out.println("Le quedan " + J2.hp);
J1.coin++;
System.out.println(J1.coin + " monedas en tu poder");
turno = 0;
break;
case 'b':
System.out.println("Te curas!");
if (J1.coin >= 3) {
System.out.println("Usas una pocion que cuesta 3 monedas y te curas 30 de vida.");
J1.hp = J1.hp + 30;
System.out.println("Ahora tienes " + J1.hp + " de vida.");
J1.coin = J1.coin - 3;
} else {
System.out.println("No te alcanzan las monedas. Lo siento.");
}
J1.coin++;
System.out.println(J1.coin + " monedas en tu poder");
turno = 0;
break;
}
} else {
System.out.println("\n");
System.out.println("Turno Orco");
System.out.println("\n");
char L2 = scanerTeclado.nextLine().charAt(0);
switch (L2) {
case 'a':
System.out.println("Atacas a " + J1.nm);
J1.hp = J1.hp - J2.atk + J1.def;
System.out.println("El jugador " + J1.nm + " pierde " + (J2.atk - J1.def) + " de vida");
System.out.println("Le quedan " + J1.hp);
J2.coin++;
System.out.println(J2.coin + " monedas en tu poder");
turno = 1;
break;
case 'b':
System.out.println("Te curas!");
if (J2.coin >= 3) {
System.out.println("Usas una pocion que cuesta 3 monedas y te curas 30 de vida.");
J2.hp = J2.hp + 30;
System.out.println("Ahora tienes " + J2.hp + " de vida.");
} else {
System.out.println("No te alcanzan las monedas. Lo siento.");
}
J2.coin++;
System.out.println(J2.coin + " monedas en tu poder");
turno = 1;
break;
}
}
}
if (J1.hp <= 0) {
System.out.println("Jugador " + J2.nm + " a ganado.");
} else {
System.out.println("Jugador " + J1.nm + " a ganado.");
}
}
}
y bueno con la linea scanerTeclado.nextLine().charAt(0) lo que le decimos al escaner es que me de la primera letra de lo que se escriba por teclado.
Si por ejemplo escribes "asdasdadada" y le das a "Enter" java te va a guardar solo la primera a.
Bueno, échale un ojo y investiga esa clase scanner, la vas a usar bastante. Un saludo
Sin mas palabras de agradecimiento. Jaja, me diste una gran ayuda... Modifique por el Scanner, voy a ponerme a investigar sobre eso.
Por otro lado empeze a mejorar los dialogos. Mañana empiezo a mejorar y agregar otras cosas.
Saludos!
Saludos comunidad de JavaHispano.
Antes de comentarles el problema que estoy teniendo, ya que es mi primer post disculpen si no esta bien colocado en el foro, desconozco el significado de Java SE y EE. (Si me lo explicaran estaría demás agradecido)
Por otro lado soy principiante en programación, un virgensito en este mundo jaja, estudio java de manera independiente en cursos de Internet y lo pongo en practica en el NetBeans o mi libreta de codigo.
-----------------------------------------------------------------------------------------------------------
Voy a tratar de ser lo mas claro de mi problema antes de pasar el codigo.
Estoy armando un juego estilo ROL por IDE ya que aun no se como pasarlo a una app.
Este juego se basa en 2 personajes los cuales se atacan en un sistema de turnos, cada uno tiene 2 opciones (Atacar, Defender), es ahi cuando entra el problema.
Cuando el J1 elije la opción atacar, el código omite la opción del J2 y ataca también, así hasta que uno de los dos muere.
En cambio si alguno de los dos se cura, estos curan hasta el infinito, repitiendo la opción infinitas veces.
Si me darían una mano se los agradecería mucho. Mi intención es avanzar en proyectos mas grandes, pero me di cuenta que si no me comunico no avanzo.
public class Guerralpha
{
public static void main(String[] args) throws IOException
{
int turno = 1;
Orco J2 = new Orco (); // J1 y J2 son mis dos clases con sus atributos.
Humano J1 = new Humano ();
System.out.println("¿Que haces?:\n");
System.out.println("a-Atacar\n");
System.out.println("b-Curar\n");
char letra = (char)System.in.read();
while (J1.hp >0 && J2.hp >0)
{
if (turno == 1)
{
switch (letra)
{
case 'a': System.out.println("Atacas a "+J2.nm);
J2.hp=J2.hp-J1.atk+J2.def;
System.out.println("El jugador "+J2.nm+" pierde "+(J1.atk-J2.def)+" de vida");
System.out.println("Le quedan "+J2.hp);
break;
case 'b': System.out.println("Te curas!");
if (J1.coin >=3) // Sistema de monedas xTurno.
{
System.out.println("Usas una pocion que cuesta 3 monedas y te curas 30 de vida.");
J1.hp= J1.hp+30;
System.out.println("Ahora tienes "+J1.hp+" de vida.");
J1.coin= J1.coin-3; //Uso las monedas para comerciar.
}
else
{
System.out.println("No te alcanzan las monedas. Lo siento.");
}
break;
}
J1.coin ++;
System.out.println(J1.coin+" monedas en tu poder");
turno = 0;
}
else
{
switch (letra)
{
case 'a': System.out.println("Atacas a "+J1.nm);
J1.hp=J1.hp-J2.atk+J1.def;
System.out.println("El jugador "+J1.nm+" pierde "+(J2.atk-J1.def)+" de vida");
System.out.println("Le quedan "+J1.hp);
break;
case 'b': System.out.println("Te curas!");
if (J2.coin >=3)
{
System.out.println("Usas una pocion que cuesta 3 monedas y te curas 30 de vida.");
J2.hp= J2.hp+30;
System.out.println("Ahora tienes "+J2.hp+" de vida.");
}
else
{
System.out.println("No te alcanzan las monedas. Lo siento.");
}
break;
}
J2.coin ++;
System.out.println(J2.coin+" monedas en tu poder");
turno = 1;
}
}
if(J1.hp <=0)
{
System.out.println("Jugador "+J2.nm+" a ganado.");
}else{
System.out.println("Jugador "+J1.nm+" a ganado.");
}
Espero puedan dar con mi problema de porque no me deja elegir la opcion del J2 ya que si no hay oportunidad de eleccion no tiene gracia el "MiniJuego".
Muchas gracias y a medida que avanze voy a ir mostrando o consultando. Ahora ando investigando de probabilidades para usar un sistema de dados.