Buenas tardes, aquí un FPero.
He resuelto por mi cuenta un examen tipo que nos han dejado como ejemplo, pero mi código me parece complicado para lo que es el enunciado.
El enunciado es este
Se desea realizar una aplicación para valorar la actuación de los jugadores de un equipo en un partido de fútbol.
Cada jugador se identifica por su nombre, su número de dorsal y el contabilizar el número de goles marcados (incluidos los porteros). Los jugadores se han dividido en tres categorías: atacantes, defensores y porteros. Además,
• en el caso de los jugadores de campo (atacantes y defensores) se contabilizaran también los pases realizados con éxito y el número de balones recuperados al contrario.
• en el caso de los porteros, se contabilizará también el número de paradas realizadas.
La valoración de cada jugador se obtendrá según las siguientes fórmulas:
• Atacantes: goles * 30 + pases * 1 + recuperaciones * 3
• Defensores: goles * 20 + pases * 1 + recuperaciones * 4
• Porteros: goles * 10 + paradas * 5
La aplicación contará con un programa principal basado en menú que permitirá interactuar con la aplicación para:
Añadir jugador atacante: El usuario debe introducir el nombre y el número del jugador. La aplicación añade el jugador a la lista de jugadores en el equipo (no deberá permitir añadir dos jugadores con el mismo número). La lista de jugadores del equipo deberá estar ordenada por dorsal.
Añadir jugador defensor (igual que añadir jugador atacante)
Añadir portero (igual que añadir jugador atacante)
Contabilizar gol: El usuario introduce el número del jugador. La aplicación añade el gol al jugador (deberá detectarse el error de que el número no corresponda a ningún jugador)
Contabilizar pase con éxito: El usuario introduce el número del jugador. La aplicación añade el pase al jugador (deberán detectarse los errores de que el número no corresponda a ningún jugador o que el jugador con ese número sea un portero)
Contabilizar número de balones recuperados (igual que el anterior)
Contabilizar parada: El usuario introduce el número del jugador. La aplicación añade la parada al jugador (deberán detectarse los errores de que el número no corresponda a ningún jugador o que el jugador con ese número sea un jugador de campo)
Muestra datos jugador: El usuario introduce el número del jugador. La aplicación muestra por consola los datos y la valoración del jugador (deberá detectarse el error de que el número no corresponda a ningún jugador). Dependiendo del tipo de jugador, en pantalla deberá aparecer un texto similar a los mostrados continuación:
• Atacante: 8 Paco (Atacante) goles:1 pases:9 recuperados:3 Valoración:48
• Defensor: 5 Pedro (Defensor) goles:0 pases:7 recuperaciones:9 Valoración:43
• Portero: 1 Pepe (Portero) goles:0 paradas:12 Valoración:60Salir
Se deberán utilizar todas las ventajas de la herencia de clases.
Y mi código es el siguiente
package examenTipoII;
import java.util.*;
public class listaJugadores {
public static void main(String[] args) {
ArrayList<Jugadores> Equipo= new ArrayList<Jugadores>();
Scanner sc = new Scanner(System.in);
System.out.println("\n===================================\n");
System.out.println("Bienvenido a la aplicación");
System.out.println("\n===================================\n");
System.out.println("Indique quiere hacer:\n ");
int opcion=-1;
String nombre; int dorsal;
while(opcion!=0) {
System.out.println("\n1- Añadir jugador atacante.");
System.out.println("2- Añadir jugador defensor.");
System.out.println("3- Añadir portero.");
System.out.println("4- Contabilizar gol.");
System.out.println("5- Contabilizar pase con éxito.");
System.out.println("6- Contabilizar recuperaciones.");
System.out.println("7- Contabilizar parada.");
System.out.println("8- Mostrar datos.");
System.out.println("0- Salir.");
opcion=sc.nextInt();
switch (opcion) {
case 1:
System.out.println("Introduce el nombre y el dorsal");
sc.nextLine();
nombre=sc.nextLine();
dorsal=sc.nextInt();
Jugadores.anadirJugador(new Atacantes(nombre,dorsal), Equipo);
break;
case 2:
System.out.println("Introduce el nombre y el dorsal");
sc.nextLine();
nombre=sc.nextLine();
dorsal=sc.nextInt();
Jugadores.anadirJugador(new Defensores(nombre,dorsal), Equipo);
break;
case 3:
System.out.println("Introduce el nombre y el dorsal");
sc.nextLine();
nombre=sc.nextLine();
dorsal=sc.nextInt();
Jugadores.anadirJugador(new Porteros(nombre,dorsal), Equipo);
break;
case 4:
System.out.println("¿A quién quiere añadirle el gol?");
dorsal=sc.nextInt();
Jugadores.contabilizarGol(dorsal, Equipo);
break;
case 5:
System.out.println("¿A quién quiere añadirle el pase?");
dorsal=sc.nextInt();
Jugadores.contabilizarPases(dorsal, Equipo);
break;
case 6:
System.out.println("¿A quién quiere añadirle la recuperación?");
dorsal=sc.nextInt();
Jugadores.contabilizarRecuperaciones(dorsal,Equipo);
break;
case 7:
System.out.println("¿A quién quiere añadirle la parada?");
dorsal=sc.nextInt();
Jugadores.contabilizarParadas(dorsal, Equipo);
break;
case 8:
System.out.println("¿De qué jugador quiere obtener la información?");
dorsal=sc.nextInt();
Jugadores.getDescripcion(dorsal, Equipo);
break;
case 0:
break;
}
}
sc.close();
System.out.println("Ha salido de la aplicacion");
}
}
package examenTipoII;
import java.util.*;
public abstract class Jugadores {
protected String nombre;
protected int dorsal, nGoles, valoracion;
public Jugadores(String nombre, int dorsal) {
this.nombre=nombre;
this.dorsal=dorsal;
nGoles=0;
}
static void anadirJugador (Jugadores j, ArrayList <Jugadores> l) {
boolean esUnico=true;
for(Jugadores x: l) {
if(x.getDorsal()==j.dorsal) {
esUnico=false;
}
}
if(esUnico) {
l.add(j);
System.out.println("Se añadió al jugador correctamente en "+j.getClass().getSimpleName());
}else {
System.out.println("No se pudo añadir el jugador");
}
}
static void contabilizarGol(int d, ArrayList <Jugadores> l) {
for(Jugadores x: l) {
if(x.getDorsal()==d) {
int goles=x.getnGoles()+1;
x.setnGoles(goles);
}else {
System.out.println("El jugador no existe");
}
}
}
static void contabilizarRecuperaciones(int d, ArrayList <Jugadores> l) {
for(Jugadores x: l) {
if(x instanceof Atacantes && x.getDorsal()==d) {
int recuperaciones=((Atacantes) x).getRecuperaciones()+1;
((Atacantes)x).setnRecuperaciones(recuperaciones);
}else if(x instanceof Defensores && x.getDorsal()==d) {
int recuperaciones=((Defensores) x).getRecuperaciones()+1;
((Defensores)x).setnRecuperaciones(recuperaciones);
}else if(x instanceof Porteros && x.getDorsal()==d) {
System.out.println("No se puede añadir recuperaciones a Porteros");
}else {
System.out.println("No existe el jugador");
}
}
}
static void contabilizarPases(int d, ArrayList <Jugadores> l) {
for(Jugadores x: l) {
if(x instanceof Atacantes && x.getDorsal()==d) {
int pases=((Atacantes) x).getnPases()+1;
((Atacantes)x).setnPases(pases);
}else if(x instanceof Defensores && x.getDorsal()==d) {
int pases=((Defensores) x).getnPases()+1;
((Defensores)x).setnPases(pases);
}else if(x instanceof Porteros && x.getDorsal()==d) {
System.out.println("No se puede añadir pases a Porteros");
}else {
System.out.println("No existe el jugador");
}
}
}
static void contabilizarParadas(int d, ArrayList <Jugadores> l) {
for(Jugadores x:l) {
if(x instanceof Porteros && x.getDorsal()==d) {
int paradas=((Porteros)x).getnParadas()+1;
((Porteros)x).setnParadas(paradas);
}else if(x instanceof Porteros && x.getDorsal()!=d) {
System.out.println("No existe el jugador");
}else {
System.out.println("El jugador no es un portero");
}
}
}
static void getDescripcion(int d, ArrayList <Jugadores> l) {
if(l.size()==0) {
System.out.println("No se ha añadido ningún jugador todavía");
}else {
for(Jugadores x: l) {
if(x instanceof Atacantes && x.getDorsal()==d) {
System.out.println(((Atacantes)x).getDescripcion());
}else if(x instanceof Defensores && x.getDorsal()==d) {
System.out.println(((Defensores)x).getDescripcion());
}else if(x instanceof Porteros && x.getDorsal()==d) {
System.out.println(((Porteros)x).getDescripcion());
}else if(d!=x.getDorsal() || l==null) {
System.out.println("No existe el jugador");
}
}
}
}
abstract int getValoracion();
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public int getDorsal() {
return this.dorsal;
}
public void setDorsal(int dorsal) {
this.dorsal = dorsal;
}
public int getnGoles() {
return nGoles;
}
public void setnGoles(int nGoles) {
this.nGoles = nGoles;
}
}
package examenTipoII;
public class Atacantes extends Jugadores {
public Atacantes(String nombre, int dorsal) {
super(nombre, dorsal);
nGoles=0;
nPases=0;
nRecuperaciones=0;
valoracion=0;
}
public void setValoracion(Jugadores x) {
if(x instanceof Atacantes) {
this.valoracion= x.getnGoles()*30+nPases+nRecuperaciones*3;
}
}
public String getDescripcion() {
String resultado=""+getClass().getSimpleName()+": "+getDorsal()+" "+getNombre()+
". Goles: "+getnGoles()+". Pases: "+getnPases()+". Recuperaciones:"+getRecuperaciones()+
". Valoración:"+getValoracion();
return resultado;
}
public int getValoracion() {
valoracion= getnGoles()*30+getnPases()+getRecuperaciones()*3;
return valoracion;
}
public void setnPases(int p) {
this.nPases=p;
}
public int getnPases() {
return nPases;
}
public void setnRecuperaciones(int r) {
this.nRecuperaciones=r;
}
public int getRecuperaciones() {
return nRecuperaciones;
}
private int nPases, nRecuperaciones;
}
package examenTipoII;
public class Defensores extends Jugadores {
public Defensores(String nombre, int dorsal) {
super(nombre, dorsal);
this.nGoles=0;
}
public String getDescripcion() {
String resultado=""+getClass().getSimpleName()+": "+getDorsal()+" "+getNombre()+
". Goles: "+getnGoles()+". Pases: "+getnPases()+". Recuperaciones: "+getRecuperaciones()+
". Valoración: "+getValoracion();
return resultado;
}
public int getValoracion() {
valoracion= getnGoles()*20+getnPases()+getRecuperaciones()*4;
return valoracion;
}
private int nPases, nRecuperaciones;
public void setnPases(int p) {
this.nPases=p;
}
public int getnPases() {
return nPases;
}
public void setnRecuperaciones(int r) {
this.nRecuperaciones=r;
}
public int getRecuperaciones() {
return nRecuperaciones;
}
}
package examenTipoII;
public class Porteros extends Jugadores {
public Porteros(String nombre, int dorsal) {
super(nombre, dorsal);
this.nGoles=0;
}
public String getDescripcion() {
String resultado=""+getClass().getSimpleName()+": "+getDorsal()+" "+getNombre()+
". Goles: "+getnGoles()+". Paradas: "+getnParadas()+". Valoración: "+getValoracion();
return resultado;
}
public int getValoracion() {
valoracion= getnGoles()*10+getnParadas()*5;
return valoracion;
}
public int getnParadas() {
return nParadas;
}
public void setnParadas(int p) {
nParadas=p;
}
private int nParadas;
}
La principal duda que tengo es cómo podría simplificar de alguna manera el enfoque, para que el código sea algo más sencillo teniendo en cuenta que es un examen, si es que es posible.