Perdonad por la tardanza, pero es que no me había enterado muy bien sobre cuándo teníamos que subir esto…Lo siento. Tampoco sé si hay que colgarlo así o cómo exactamente pero bueno…allá va:
Documento1 (El enunciado)
Consiste en un juego de rol, el cual dispondrá de 4 clases y una interfaz.
Primera clase:
Personaje: Recoge las características generales comunes a cualquier tipo de personaje. Se tendrá que programar de forma que no se puedan crear instancias (objetos) de esta clase, es decir, será una clase padre abstracta cuya principal utilidad es ser heredada por clases hijas.
Información: Vida del personaje.
(Atributos) Fuerza.
Inteligencia.
Astucia.
Vigor inicial: Esta característica tendrá en todo momento el mismo valor para todos los personajes, esto es, si alguno cambia su vigor, el nuevo valor cambiará para todos, luego lo pondremos static y lo inicializaré a cero.
Métodos: Constructores varios: Además de inicializar la información del personaje, deberán tomar nota del objeto que los llamó, para poder llamarlo más tarde. Aquí aparecerá la sobrecarga de métodos.
Un método imprimir sin implementar, es decir, será abstracto.
Métodos de acceso a la información (atributos), los cuales tendrán que hacer saber al método personajeCambiado(Personaje) todo cambio que se produzca en la información de cada personaje. En esta clase no pongo el método personajeCambiado(Personaje).
Segunda clase:
Guerrero: Guardará la misma información y tendrá los mismos métodos que Personaje, es decir, hereda de Personaje, y además añadirá atributos y métodos de la propia clase:
Atributos: Habilidad.
Puntería.
Una variable que lleve la cuenta de cuantos guerreros hay en cada momento
Métodos: Un método imprimir() que imprima por pantalla toda la información del guerrero. Aquí lo que hace es implementar el método imprimir() de la clase Personaje ya que es abstracto y Guerrero hereda de Personaje.
Tercera clase:
Maga: Guardará la misma información y tendrá los mismos métodos que Personaje, es decir, hereda de Personaje, y además añadirá atributos y métodos de la propia clase:
Atributos: Magia
Poder de la luz
Una variable que lleve la cuenta de cuantas magas hay en cada momento.
Métodos: Un método imprimir() que imprima por pantalla toda la información de la maga. Aquí lo que hace es implementar el método imprimir() de la clase Personaje ya que es abstracto y Maga hereda de Personaje.
Además, la clase Maga implementa la interfaz Hechicero, es decir, implementa todos sus métodos.
Cuarta clase:
Clase Prueba: El método “main” de esta clase de prueba dará un valor inicial al vigor de los personajes, tanto el método main como el vigor son static, después procederá a crear una maga (¡CUIDADO!,no podemos crear instancias de Personaje, lo haremos así: Personaje maga1= new Maga (…parámetros en Constructor…) ; ). Debe incluir también un método personajeCambiado(Personaje), que simplemente imprima por pantalla las características del personaje cambiado, aquí imprimiremos los nuevos valores de los atributos.
Interfaz
Hechicero: Tiene dos métodos:
Doblar magia y Doblar poder de la luz.
(Después había hecho una especie de esquemilla relacionando más o menos las clases, pero no me deja pegarlo…)
Documento 2 (Solución, con varios fallos creo)
public abstract class Personaje{
//Atributos
int vidaPersonaje;
int fuerza;
int inteligencia;
int astucia;
static int vigorInicial;
//Constructores
public Personaje(){
}
public Personaje( int vidaPersonaje, int fuerza, int inteligencia, int astucia, int vigorInicial){
vidaPersonaja= nuevaVidaPersonaje;
fuerza=nuevaFuerza;
inteligencia=nuevaInteligencia;
astucia=nuevaAstucia;
vigorInicial=0; // inicializamos a 0
}
//Métodos de acceso
public int dameVidaPersonaje(){
return vidaPersonaje;
}
public int dameFuerza(){
return fuerza;
}
public int dameInteligencia(){
return inteligencia ;
}
public int dameAstucia(){
return astucia;
}
public int dameVigorIncial(){
return vigorIncial;
}
public void nuevaVidaPersonaje(int vidaPersonaje){
vidaPersonaje = nuevaVidaPersonaje;
}
public void nuevaFuerza(int fuerza){
fuerza=nuevaFuerza;
}
public void nuevaInteligencia(int inteligencia){
inteligencia=nuevaInteligencia;
}
public void nuevaAstucia(int astucia){
astucia=nuevaAstucia;
}
public void nuevaVigorInicial(int vigorInicial){
vigorInicial=nuevaVigorInicial;
}
//Método que imprime por pantalla la información, sin implementar
public abstract void imprimir();
}//fin de la clase Personaje.
public class Guerrero extends Personaje{
int habilidad;
int puntería;
int numGuerreros=0; // inicializamos a 0
int numTotalGuerreros;
public Guerrero(){
super();
habilidad=0;
puntería=0;
numGuerreros=0;
}
public Guerrero(int vidaPersonaje, int fuerza, int inteligencia, int astucia, int vigorInicial, int habilidad, int puntería){
super(vidaPersonaje, fuerza, inteligencia, astucia, vigorInicial);
habilidad=nuevaHabilidad;
puntería=nuevaPuntería;
numGuerreros++; //incrementamos el número de guerreros
numTotalGuerreros= numGuerreros;
}
public int dameHabilidad(){
return habilidad ;
}
public int damePunteria(){
return punteria;
}
public int dameNumGuerreros(){
return numTotalGuerreros ;
}
public void nuevaHabilidad(int habilidad){
habilidad=nuevaHabilidad;
}
public void nuevaPunteria(int punteria){
punteria=nuevaPunteria;
}
public void imprimir(){
System.out.println(“Vida del Guerrero”+ dameVidaPersonaje());
System.out.println(“Fuerza del Guerrero”+ dameFuerza());
System.out.println(“Inteligencia del Guerrero”+ dameInteligencia());
System.out.println(“Astucia del Guerrero”+ dameAstucia());
System.out.println(“Vigor Inicial del Guerrero”+ dameVigorInicial());
System.out.println(“Habilidad del Guerrero”+ dameHabilidad());
System.out.println(“Puntería del Guerrero”+ damePunteria());
System.out.println(“Nº total de guerreros”+ dameNumGuerreros());
}
}//fin clase Guerrero
public interface Hechicero{
int magia;
int poderLuz;
public void doblarMagia(int magia);
public void doblarPoderLuz(int poderLuz);
}// fin de la interfaz
public class Maga extends Personaje implements Hechicero{
int magia;
int poderLuz;
int numMagas=0;
int numTotalMagas;
public Maga(){
super();
magia=0;
poderLuz=0;
numMagas=0;
}
public Maga(int vidaPersonaje, int fuerza, int inteligencia, int astucia, int vigorInicial, int magia, int poderLuz){
super(vidaPersonaje, fuerza, inteligencia, astucia, vigorInicial);
magia=nuevaMagia;
poderLuz=nuevaPoderLuz;
numMagas++; //incrementamos el número de magas
numTotalMagas= numMagas;
}
public int dameMagia(){
return magia;
}
public int damePoderLuz(){
return poderLuz;
}
public int dameNumMagas(){
retunr numTotalMagas ;
}
public void nuevaMagia(int magia){
magia=nuevaMagia;
}
public void nuevaPoderLuz(int poderLuz){
poderLuz=nuevaPoderLuz;
}
public void doblarMagia(int magia){
magia= 2*magia;
}
public void doblarPoderLuz(int poderLuz){
poderLuz=2*poderLuz;
}
public void imprimir(){
System.out.println(“Vida de la Maga”+ dameVidaPersonaje());
System.out.println(“Fuerza de la Maga”+ dameFuerza());
System.out.println(“Inteligencia de la Maga”+ dameInteligencia());
System.out.println(“Astucia de la Maga”+ dameAstucia());
System.out.println(“Vigor Inicial de la Maga”+ dameVigorInicial());
System.out.println(“Magia de la Maga”+ dameMagia());
System.out.println(“Poder de la luz de la Maga”+ damePoderLuz());
System.out.println(“Nº total de magas”+ dameNumMagas());
}
public class ClasePrueba{
public static void main (String args [ ] ){
int valorIncial; // el main le da un valor por defecto
Personaje maga1 = new Maga( 500,60,1000,800,2,2000,1500);
}
public void personajeCambiado(Personaje p){
p.nuevaVidaPersonaje(400);
p.nuevaFuerza(70);
p.nuevaInteligencia(950);
p.nuevaAstucia(900);
p.nuevaVigorInicial(10);
p.nuevaMagia(4000);
p.nuevaPoderLuz(2000);
}
maga1.nuevaVidaPersonaje(500);
maga1.nuevaFuerza(60);
maga1.nuevaInteligencia(1000);
maga1.nuevaAstucia(800);
maga1.nuevaVigorInicial(2);
maga1.nuevaMagia(2000);
maga1.nuevaPoderLuz(1500);
personajeCambia(maga1);
System.out.println(“Nueva Vida de la Maga”+ maga1.dameVidaPersonaje());
System.out.println(“ Nueva Fuerza de la Maga”+ maga1.dameFuerza());
System.out.println(“Nueva Inteligencia de la Maga”+ maga1.dameInteligencia());
System.out.println(“Nueva Astucia de la Maga”+ maga1.dameAstucia());
System.out.println(“Nuevo Vigor Inicial de la Maga”+ maga1.dameVigorInicial());
System.out.println(“Nueva Magia de la Maga”+ maga1.dameMagia());
System.out.println(“Nuevo Poder de la luz de la Maga”+ maga1.damePoderLuz());
System.out.println(“Nuevo Nº total de magas”+ maga1.dameNumMagas());
}//fin de la clase prueba
Documento 3 (Conceptos fundamentales.)
1.- La herencia (extends): Tenemos una clase padre llamada Personaje y dos clases hijas, Guerrero y Maga.
2.- La implementación (implements): Existe una interfaz llamada Hechicero, donde ninguno de sus métodos está implementado, luego la clase Maga que es la que implementa dicha interfaz (implements) es la encargada de implementar cada uno de sus métodos. Además, al ser la clase padre abstracta, tiene métodos abstractos, es decir, métodos que no están implementados, y son las clases hijas las que deben implementar estos métodos.
3.-Sobrecarga de métodos: Aparece tanto en la clase padre como en las clases hijas, en los métodos constructores. La sobrecarga se da cuando existen más de un método con el mismo nombre pero con diferente número de parámetros.
4.-Clase y métodos abstractos: Una clase abstracta no puede crear instancias, es decir, no se pueden crear objetos de esta clase, la única utilidad que tiene estas clases es que hereden de ella (como es el caso de nuestra clase Personaje). Las clases abstractas pueden tener métodos abstractos y métodos no abstractos. Las clases que hereden de una clase abstracta deberá implementar todos sus métodos abstractos.
Cuando queramos crear un objeto, teniendo como clase padre una clase abstracta, lo podremos hacer de la siguiente manera:
Personaje maga1= new Maga();
Con esto nos estamos refiriendo a que hemos creado un objeto Maga, que a su vez es un Personaje. Si pusiéramos: Personaje maga1 = new Personaje(); nos daría error, pues como ya se ha dicho antes, una clase abstracta no puede crear objetos.
5.-Elementos de clase (static): Así son llamados a los atributos y métodos precedidos por la palabra static. Sólo existe uno de dichos elementos para todos los objetos, por tanto, los elementos de clase son compartidos por todas las instancias de la clase. Si se modifica dicho atributo estático, todas las instancias de la clase ven dicha modificación.