Juego de guerra en consola
Nelson_EU
Mensajes publicados
3
Estado
Miembro
-
KX Mensajes publicados 19031 Estado Moderador -
KX Mensajes publicados 19031 Estado Moderador -
Hola,
Tuve que crear un juego para la escuela que consiste en una guerra entre dos equipos de tres guerreros. Cada equipo selecciona un guerrero de entre sus tres, y luego se golpean hasta que uno ya no tenga más PV. El juego termina cuando uno de los dos equipos no tiene ningún guerrero en pie.
Mi juego está prácticamente terminado, he añadido algunas cosas como que cada guerrero tiene un privilegio (bonificación de ataque, de curación, ...). Todos los guerreros comienzan con un privilegio que pueden usar durante la partida. Si se usa, el guerrero no lo tiene más. Si el guerrero muere sin haber usado su privilegio, el guerrero adversario recibe ese privilegio (si no lo tiene ya).
Hasta ahora, todo funciona. He jugado una partida y va bien.
El problema viene de que cuando reinicio una partida, por ejemplo, el guerrero que terminó con 2 privilegios en la partida anterior vuelve con esos dos privilegios, cuando debería tener solo uno (ya que es el inicio de una nueva partida).
Los privilegios de un guerrero se representan en forma de un arreglo booleano.
¿Alguna ayuda? (publicaré el código si es necesario) ¡Gracias!
Tuve que crear un juego para la escuela que consiste en una guerra entre dos equipos de tres guerreros. Cada equipo selecciona un guerrero de entre sus tres, y luego se golpean hasta que uno ya no tenga más PV. El juego termina cuando uno de los dos equipos no tiene ningún guerrero en pie.
Mi juego está prácticamente terminado, he añadido algunas cosas como que cada guerrero tiene un privilegio (bonificación de ataque, de curación, ...). Todos los guerreros comienzan con un privilegio que pueden usar durante la partida. Si se usa, el guerrero no lo tiene más. Si el guerrero muere sin haber usado su privilegio, el guerrero adversario recibe ese privilegio (si no lo tiene ya).
Hasta ahora, todo funciona. He jugado una partida y va bien.
El problema viene de que cuando reinicio una partida, por ejemplo, el guerrero que terminó con 2 privilegios en la partida anterior vuelve con esos dos privilegios, cuando debería tener solo uno (ya que es el inicio de una nueva partida).
Los privilegios de un guerrero se representan en forma de un arreglo booleano.
¿Alguna ayuda? (publicaré el código si es necesario) ¡Gracias!
2 respuestas
Hola,
No sé cómo has implementado el sistema de nueva partida, pero si tienes este tipo de efectos secundarios es probable que hayas intentado borrar los datos de la partida anterior y te falte un trozo; lo más simple y seguro habría sido no reutilizar los datos de la primera partida, sino recrearlos completamente como lo hiciste la primera vez.
Por ejemplo, tienes una clase Game con un atributo boolean[] privileges; tienes un objeto Game g; y un método reset() que recorre privileges para poner todo a false. Este tipo de código no es muy bueno. Es mejor olvidar el objeto Game g y reconstruirlo completamente con un new Game() para cada partida, la primera, como las siguientes.
--
La confianza no excluye el control.
No sé cómo has implementado el sistema de nueva partida, pero si tienes este tipo de efectos secundarios es probable que hayas intentado borrar los datos de la partida anterior y te falte un trozo; lo más simple y seguro habría sido no reutilizar los datos de la primera partida, sino recrearlos completamente como lo hiciste la primera vez.
Por ejemplo, tienes una clase Game con un atributo boolean[] privileges; tienes un objeto Game g; y un método reset() que recorre privileges para poner todo a false. Este tipo de código no es muy bueno. Es mejor olvidar el objeto Game g y reconstruirlo completamente con un new Game() para cada partida, la primera, como las siguientes.
--
La confianza no excluye el control.
Mi explicación quizás no fue clara ayer:
Cuando miro tu método EquipeGuerriers.reset(); veo que es estático, es decir, que no construyes un objeto para tener un equipo, sino que la clase es tu equipo y eso no está bien. Eso significa que bárbaro, arquero, mago, etc. son estáticos también, de ahí los efectos secundarios.
Es mejor tener un objeto EquipeGuerrier, que instancias con un new EquipeGuerriers(), que inicializa los privilegios del bárbaro, arquero, mago, etc. localmente a esta instancia de EquipeGuerriers, de modo que cuando reinicias tu juego, recreas un nuevo EquipeGuerriers construido desde cero, sin depender de las modificaciones anteriores.
De manera general, los atributos estáticos en una clase deben ser relativamente poco frecuentes, sirven en ciertos casos, pero no deben reemplazar los atributos no estáticos relacionados con los objetos de la clase.
Por ejemplo, tienes [...] un método reset() que recorre privilegios para poner todo en false. Este tipo de código no es muy bueno. Es mejor olvidar el objeto Game g y reconstruirlo completamente con un new Game() [...]
Cuando miro tu método EquipeGuerriers.reset(); veo que es estático, es decir, que no construyes un objeto para tener un equipo, sino que la clase es tu equipo y eso no está bien. Eso significa que bárbaro, arquero, mago, etc. son estáticos también, de ahí los efectos secundarios.
Es mejor tener un objeto EquipeGuerrier, que instancias con un new EquipeGuerriers(), que inicializa los privilegios del bárbaro, arquero, mago, etc. localmente a esta instancia de EquipeGuerriers, de modo que cuando reinicias tu juego, recreas un nuevo EquipeGuerriers construido desde cero, sin depender de las modificaciones anteriores.
De manera general, los atributos estáticos en una clase deben ser relativamente poco frecuentes, sirven en ciertos casos, pero no deben reemplazar los atributos no estáticos relacionados con los objetos de la clase.
En resumen, tengo una clase Guerrero (de la cual instancio a mis diferentes guerreros: bárbaro, arquero, ...), una clase EquipoGuerreros (de la cual instancio mis dos equipos), una clase Combate que contiene el main, que es la clase que realmente "gestiona" el juego. Mis nuevas partidas no se instancian, es necesario ejecutar el programa para lanzar una partida...
Edit: Mi tabla de privilegios se encuentra en la clase guerrero, es propia de cada guerrero y forma parte del constructor (cuando creo, por ejemplo, mi bárbaro, le doy un nombre, un número de PV y el número de su privilegio).