Ok. Lo primero.
Una
REGLA DE ORO en programación es no usar nunca la
ñ, ni ningún otro carácter que sea ajeno al alfabeto inglés.
¿Por qué?
Porque esos caracteres NO son comunes a todos los "juegos de caracteres"(charsets) que existen(los ISO, los UNICODE, los UTF....). Algunos charsets no los tienen.., otros si los tienen pero están identificados con distinta numeración...no hay un consenso para esos caracteres.
Los charsets que interpretan nuestros textos, varían según la región, varían según el sistema operativo, varían según cada programa, varían según cada ordenador.....
¿Y que implica?
Pues que al compartir nuestros programas con otros programadores, o bien intentar editarlos en ordenadores que no son el nuestro, pasa esto:
Las
ñ no están siendo reconocidas en mi sistema, ni tampoco las palabras con tilde (aunque como están en los comentarios, no importa)
Ya no es solo un inconveniente de edición, si no que directamente nuestros programas pueden funcionar mal al intentar ejecutarlos en otros sistemas.
Por eso es importante evitar codificar usando estos caractes.
En lugar de
getDaño(), puedes poner
getDanio(), getDanyo(), getDanho(), ... o incluso si no quedase otra, pues en inglés
getDamage()
Lo que sea con tal de evitar esos caracteres.
Dicho esto, y ya volviendo a tu problema con los nombres.
Esto se debe a que estás declarando los atributos y métodos de las clases como
static.
Deberías buscar información para comprender mejor la diferencia entre declarar los elementos de una clase como static y como "no static".
No voy a explayarme aquí ahora con explicaciones más extensas, pero resumiendo..., cuando un atributo, o un método, se declara como
static, este atributo va a pertenecer a la clase, y no a los objetos que vayamos a crear a partir de esta clase.
Es decir, veamos unos ejemplos en pseudocódigo:
Tenemos una clase Orco, con un atributo nombre declarado como
static
Si yo ahora creo objetos Orco y les doy nombres:
Yo puedo pensar que a cada Orco le he dado un nombre distinto, pero no es así.
Porque el atributo "nombre", al ser static, no pertenece a los objetos orco1, orco2 u orco3. Estos objetos, únicos e individuales, en realidad no tienen un atributo "nombre" único e individual.
Ese atributo "nombre" pertenece a la clase, no a los objetos. Así que todos los objetos van a compartir el mismo "nombre". Por eso, todos esos Orcos se van a llamar "Harg", porque es el último nombre que seteado.
Esto mismo te ocurre a ti, pero peor... Todos tus personajes, tanto Heroes como Bestias, comparten el mismo nombre.
Y esto es porque la clase madre
Personaje tiene sus atributos como static
Así que en realidad, no solo comparten "nombre". Todos tus Personajes van a compartir nombre, puntos de vida, armadura y raza.
Cuando un Personaje reciba daño, lo van a recibir todos. Porque los "puntos de vida" son compartidos por todos los personajes, nadie tiene su propia y única "barra de vida"
Para que todos estos atributos sean únicos e individuales para cada objeto perteneciente a esta clase, hay que quitar el modificador
static.
Tanto de los atributos, como de los métodos.
Y hay que hacerlo en TODAS las clases que has escrito.
Fíjate que en algunos métodos, por el lío que se ha montado con lo de usar static, has tenido que anteponer el nombre de la clase para acceder a los atributos:
Esto es un ejemplo muy gráfico del problema. El atributo "armadura", si lo declaras static, entones no pertenece a
ESTE(this) personaje en concreto, si no que pertenece a la clase
Personaje en general.
Y además esto te obliga a declarar también el método como static.
Pero, si le quitas al atributo armadura el modificador static, ahora este atributo sí pertenece a ESTE(this) personaje en concreto. Ya es suyo y propio, no es un valor compartido con el resto de personajes del juego.
Y además, el método ya no necesita ser static.
Cuando corrijas esto en la clase
Personaje, te van a surgir otros problemas derivados de haber usado static desde el principio (es como un efecto dominó) y también de no haber usado una lógica correcta.
El método ataque() tiene un error de lógica.
No está recibiendo ningún argumento entre paréntesis. Es decir, un personaje ataca, vale, pero ¿a quién está atacando?
El método no sabe a quién tiene que atacar, no sabe quién va a recibir daño, no sabe de quién ha de tener en cuenta su nivel de armadura...
Esta carencia, la has "solucionado" llamando a los atributos de la clase que hasta ahora eran static.
Quizás haya sido este error de lógica, lo que te llevó a declarar los atributos y métodos como static, para poder acceder a los métodos de getArmadura() y getDanyo() que no podías acceder.
Y no podías acceder, porque no estás usando la lógica correcta.
Ese método, ha de recibir como argumento un objeto Personaje, que representará el personaje que está siendo atacado, o sea, su rival.
Así que de nuevo en la clase
Personaje, conviene modificar la declaración del método abstracto ataque() para que reciba un rival
Y ahora, en las clases que heredan directamente este método, es decir,
Bestia y
Humano cambiamos el código para que el ataque y los daños sea entre esos objetos en concreto.
Por ejemplo, en
Bestia este método quedaría así (recuerda quitar todos los static)
Aquí en
Bestia, simplemente calculamos el daño según armadura del rival y lo retornamos.
Para aplicar ese daño al rival, es decir, para restarle puntos de vida, lo hacemos en las clases hijas que heredan de
Bestia.
Por ejemplo, la clase
Orco:
Esto mismo habrá que hacerlo en la clase
Trasgo.
Y repetimos también este mismo proceso para
Heroe y sus hijas:
Hobbit,
Elfo y
Humano
Es decir,
Heroe calcula el daño y las clases hijas lo aplican a sus rivales.
No tengo tiempo para revisar nada más....
Aplica estos cambios, a ver si vas viendo más claro la lógica a seguir.
Comenta aquí tus progresos y seguimos ayudando con los siguientes pasos.
Un saludo.