Se quiere construir una aplicación para manejar los resultados de los partidos en un campeonato de fútbol.
Cada equipo puede jugar contra cada uno de los otros equipos una sola vez.
La aplicación debe mostrar la tabla de goles, en la que se muestra cuantos goles le hizo cada equipo a cada uno de los otros.
La aplicación también debe mostrar la tabla de posiciones, indicando para cada equipo el número de puntos, los partidos jugados, ganados, empatados y perdidos y los goles a favor y en contra.
La información sobre los equipos que harán parte del campeonato será cargada desde un archivo de propiedades, pero la aplicación permitirá registrar los resultados de cada uno de los partidos.
/**~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Universidad de los Andes (Bogotá - Colombia)
* Departamento de Ingeniería de Sistemas y Computación
* Licenciado bajo el esquema Academic Free License version 2.1
*
* Proyecto Cupi2 (http://cupi2.uniandes.edu.co)
* Ejercicio: n6_campeonato
* Autor: Equipo Cupi2 2017
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/ package uniandes.cupi2.campeonato.interfaz;
/**
* Es el diálogo donde se registra el resultado de un partido.
*/
@SuppressWarnings("serial") public class DialogoResultado extends JDialog implements ActionListener
{
// -----------------------------------------------------------------
// Constantes
// -----------------------------------------------------------------
/**
* Constante para el comando del botón ok.
*/ private static final String OK = "ok";
/**
* Constante para el comando del botón cancelar.
*/ private static final String CANCELAR = "Cancelar";
/**
* Es una referencia a la clase principal de la interfaz.
*/ private InterfazCampeonato principal;
// -----------------------------------------------------------------
// Atributos de la Interfaz
// -----------------------------------------------------------------
/**
* El combo donde se selecciona el equipo 1.
*/ private JComboBox comboEquipo1;
/**
* El combo donde se selecciona el equipo 2.
*/ private JComboBox comboEquipo2;
/**
* Construye el diálogo que permite ingresar un nuevo resultado al campeonato.
* @param pPrincipal Es una referencia a la clase principal de la interfaz. pPrincipal != null.
* @param pNombreEquipos Es un arreglo con los nombres de los equipos que hay en el campeonato. nombreEquipos != null.
*/ public DialogoResultado( InterfazCampeonato pPrincipal, String[] pNombreEquipos )
{ super( pPrincipal, true );
principal = pPrincipal;
/**
* Inicializa todos los paneles de la ventana de diálogo.
*/ public void limpiar( )
{
comboEquipo1.setSelectedIndex( 0 );
comboEquipo2.setSelectedIndex( 0 );
txtGoles1.setText( "" );
txtGoles2.setText( "" );
}
/**
* Este método se ejecuta cuando se hace click sobre un botón.
* @param pEvento El evento del click sobre un botón. pEvento != null.
*/ public void actionPerformed( ActionEvent pEvento )
{
String comando = pEvento.getActionCommand( ); if( OK.equals( comando ) )
{ try
{ int goles1 = Integer.parseInt( txtGoles1.getText( ) ); int goles2 = Integer.parseInt( txtGoles2.getText( ) ); int equipo1 = comboEquipo1.getSelectedIndex( ); int equipo2 = comboEquipo2.getSelectedIndex( );
principal.registrarResultado( equipo1, equipo2, goles1, goles2 );
setVisible( false );
} catch( NumberFormatException nfe )
{
JOptionPane.showMessageDialog( principal, "Debe indicar un número correcto de goles" );
}
} else if( CANCELAR.equals( comando ) )
{ this.setVisible( false );
}
}
}
/**~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Universidad de los Andes (Bogotá - Colombia)
* Departamento de Ingeniería de Sistemas y Computación
* Licenciado bajo el esquema Academic Free License version 2.1
*
* Proyecto Cupi2 (http://cupi2.uniandes.edu.co)
* Ejercicio: n6_campeonato
* Autor: Equipo Cupi2 2017
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/ package uniandes.cupi2.campeonato.interfaz;
import java.awt.*; import java.io.*;
import javax.swing.*;
import uniandes.cupi2.campeonato.mundo.*;
/**
* Es la clase principal de la interfaz.
*/
@SuppressWarnings("serial") public class InterfazCampeonato extends JFrame
{
// -----------------------------------------------------------------
// Atributos
// -----------------------------------------------------------------
/**
* Es una referencia al campeonato.
*/ private Campeonato campeonato;
// -----------------------------------------------------------------
// Atributos de la Interfaz
// -----------------------------------------------------------------
/**
* Es el panel donde se muestra el banner de la aplicación.
*/ private PanelImagen panelImagen;
/**
* Es el panel donde se muestra el estado actual de la tabla de goles.
*/ private PanelTablaGoles panelTablaGoles;
/**
* Es el panel donde se muestra el estado actual de la tabla de posiciones.
*/ private PanelTablaPosiciones panelTablaPosiciones;
/**
* Es el panel donde se muestran los botones para controlar la aplicación.
*/ private PanelBotones panelBotones;
/**
* Es la ventana de diálogo para obtener los datos de un partido.
*/ private DialogoResultado dialogo;
/**
* Construye la interfaz e inicializa el campeonato indicando que no se ha cargado la información de ningún archivo.
*/ public InterfazCampeonato( )
{
campeonato = null;
panelImagen = new PanelImagen( );
panelTablaGoles = new PanelTablaGoles( );
panelBotones = new PanelBotones( this );
panelTablaPosiciones = new PanelTablaPosiciones( );
JPanel centro = new JPanel( );
centro.setLayout( new GridLayout( 2, 1 ) );
/**
* Muestra el diálogo usado para registrar el resultado de un partido. Este diálogo solo se despliega si el campeonato ya ha sido inicializado.
*/ public void mostarDialogoResultado( )
{ if( campeonato == null )
{
JOptionPane.showMessageDialog( this, "Debe cargar un campeonato primero", "Registrar resultado", JOptionPane.ERROR_MESSAGE );
} else
{
dialogo.limpiar( );
dialogo.setVisible( true );
}
}
/**
* Registra un nuevo resultado en el campeonato.
* @param pEquipo1 Es el número del equipo 1.
* @param pEquipo2 Es el número del equipo 2.
* @param pGoles1 Es el número de goles marcados por el equipo 1.
* @param pGoles2 Es el número de goles marcados por el equipo 2.
*/ public void registrarResultado( int pEquipo1, int pEquipo2, int pGoles1, int pGoles2 )
{ if( campeonato != null )
{ try
{
campeonato.registrarResultado( pEquipo1, pEquipo2, pGoles1, pGoles2 );
refrescar( );
} catch( Exception e )
{
JOptionPane.showMessageDialog( this, e.getMessage( ) );
}
}
}
/**
* Carga los equipos a partir de un archivo seleccionado por el usuario.
*/ public void cargarEquipos( )
{
JFileChooser fc = new JFileChooser( "./data" );
fc.setDialogTitle( "Abrir archivo de campeonato" ); int resultado = fc.showOpenDialog( this ); if( resultado == JFileChooser.APPROVE_OPTION )
{
File archivoCampeonato = fc.getSelectedFile( ); try
{
// Crea el modelo del mundo, pasándole como parámetro el archivo del cual se debe cargar
campeonato = new Campeonato( archivoCampeonato );
// Crea el diálogo de captura de resultados, pasando como parámetro el nombre de los equipos del campeonato
String[] nombreEquipos = new String[campeonato.darNumeroEquipos( )]; for( int i = 0; i < campeonato.darNumeroEquipos( ); i++ )
{
nombreEquipos[ i ] = campeonato.darEquipo( i ).toString( );
}
dialogo = new DialogoResultado( this, nombreEquipos );
// Refresca la visualización de los paneles con los resultados
panelTablaGoles.iniciarTablaGoles( campeonato );
panelTablaPosiciones.crearTabla( campeonato );
// Desactiva el botón con el que se cargó el campeonato
panelBotones.desactivarBotonCargar( );
} catch( Exception e )
{
campeonato = null;
JOptionPane.showMessageDialog( this, "Hubo problemas cargando el campeonato: \n" + e.getMessage( ), "Cargar", JOptionPane.ERROR_MESSAGE );
e.printStackTrace( );
}
}
}
/**
* Actualiza los paneles con la tabla de goles y la tabla de posiciones.
*/ private void refrescar( )
{
panelTablaGoles.refrescar( );
panelTablaPosiciones.refrescar( );
}
// -----------------------------------------------------------------
// Puntos de Extensión
// -----------------------------------------------------------------
/**
* Ejecuta el punto de extensión 1.
*/ public void reqFuncOpcion1( )
{ if( campeonato == null )
{
JOptionPane.showMessageDialog( this, "Debe cargar un campeonato primero", "Respuesta", JOptionPane.ERROR_MESSAGE );
} else
{
String resultado = campeonato.metodo1( );
refrescar( );
JOptionPane.showMessageDialog( this, resultado, "Respuesta", JOptionPane.INFORMATION_MESSAGE );
}
}
/**
* Ejecuta el punto de extensión 2.
*/ public void reqFuncOpcion2( )
{ if( campeonato == null )
{
JOptionPane.showMessageDialog( this, "Debe cargar un campeonato primero", "Respuesta", JOptionPane.ERROR_MESSAGE );
} else
{
String resultado = campeonato.metodo2( );
refrescar( );
JOptionPane.showMessageDialog( this, resultado, "Respuesta", JOptionPane.INFORMATION_MESSAGE );
}
}
// -----------------------------------------------------------------
// Main
// -----------------------------------------------------------------
/**
* Ejecuta la aplicación.
* @param pArgs Parámetros de la ejecución. No son necesarios.
*/ public static void main( String[] pArgs )
{ try
{
// Unifica la interfaz para Mac y para Windows.
UIManager.setLookAndFeel( UIManager.getCrossPlatformLookAndFeelClassName( ) );
/**~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Universidad de los Andes (Bogotá - Colombia)
* Departamento de Ingeniería de Sistemas y Computación
* Licenciado bajo el esquema Academic Free License version 2.1
*
* Proyecto Cupi2 (http://cupi2.uniandes.edu.co)
* Ejercicio: n6_campeonato
* Autor: Equipo Cupi2 2017
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/ package uniandes.cupi2.campeonato.interfaz;
import java.awt.event.*;
import javax.swing.*;
/**
* Este es el panel donde están los botones que controlan la aplicación.
*/
@SuppressWarnings("serial") public class PanelBotones extends JPanel implements ActionListener
{
// -----------------------------------------------------------------
// Constantes
// -----------------------------------------------------------------
/**
* Constante para el comando del botón cargar equipos.
*/ private static final String CARGAR_EQUIPOS = "Cargar equipos";
/**
* Constante para el comando del botón registrar resultado.
*/ private static final String REGISTRAR_RESULTADO = "Registrar resultado";
/**
* Constante para el comando del botón opción 1.
*/ private static final String OPCION_1 = "Opción 1";
/**
* Constante para el comando del botón opción 2.
*/ private static final String OPCION_2 = "Opción 2";
/**
* Es una referencia a la clase principal de la interfaz.
*/ private InterfazCampeonato principal;
// -----------------------------------------------------------------
// Atributos de la Interfaz
// -----------------------------------------------------------------
/**
* Es el botón para cargar los equipos.
*/ private JButton botonCargarEquipos;
/**
* Es el botón para registrar un nuevo resultado.
*/ private JButton botonRegistrarResultado;
/**
* Es el botón para ejecutar el punto de extensión 1.
*/ private JButton botonOpcion1;
/**
* Es el botón para ejecutar el punto de extensión 2.
*/ private JButton botonOpcion2;
/**
* Inicializa el panel de botones y sus elementos.
* @param pPrincipal Referencia a la clase principal de la interfaz.
*/ public PanelBotones( InterfazCampeonato pPrincipal )
{
principal = pPrincipal;
// Inicializa el botón de cargar equipos
botonCargarEquipos = new JButton( CARGAR_EQUIPOS );
botonCargarEquipos.setActionCommand( CARGAR_EQUIPOS );
botonCargarEquipos.addActionListener( this );
add( botonCargarEquipos );
// Inicializa el botón de registrar un partido
botonRegistrarResultado = new JButton( REGISTRAR_RESULTADO );
botonRegistrarResultado.setActionCommand( REGISTRAR_RESULTADO );
botonRegistrarResultado.addActionListener( this );
add( botonRegistrarResultado );
// Inicializa los botones de extensión
botonOpcion1 = new JButton( OPCION_1 );
botonOpcion1.setActionCommand( OPCION_1 );
botonOpcion1.addActionListener( this );
add( botonOpcion1 );
botonOpcion2 = new JButton( OPCION_2 );
botonOpcion2.setActionCommand( OPCION_2 );
botonOpcion2.addActionListener( this );
add( botonOpcion2 );
}
/**
* Este método se ejecuta cuando se hace click sobre un botón.
* @param pEvento El evento del click sobre un botón. pEvento != null.
*/ public void actionPerformed( ActionEvent pEvento )
{
String comando = pEvento.getActionCommand( ); if( REGISTRAR_RESULTADO.equals( comando ) )
{
principal.mostarDialogoResultado( );
} else if( CARGAR_EQUIPOS.equals( comando ) )
{
principal.cargarEquipos( );
} else if( OPCION_1.equals( comando ) )
{
principal.reqFuncOpcion1( );
} else if( OPCION_2.equals( comando ) )
{
principal.reqFuncOpcion2( );
}
}
/**
* Desactiva el botón de cargar, después de que el campeonato ya ha sido inicializado.
*/ public void desactivarBotonCargar( )
{
botonCargarEquipos.setEnabled( false );
}
}
/**~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Universidad de los Andes (Bogotá - Colombia)
* Departamento de Ingeniería de Sistemas y Computación
* Licenciado bajo el esquema Academic Free License version 2.1
*
* Proyecto Cupi2 (http://cupi2.uniandes.edu.co)
* Ejercicio: n6_campeonato
* Autor: Equipo Cupi2 2017
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/ package uniandes.cupi2.campeonato.interfaz;
/**
* Ruta de la imagen del banner.
*/ public final static String RUTA_IMAGEN = "./data/imagenes/banner.jpg";
// -----------------------------------------------------------------
// Atributos de la interfaz
// -----------------------------------------------------------------
/**
* Etiqueta de la imagen.
*/ private JLabel labImagen;
/**
* Construye el panel con el banner.
*/ public PanelImagen( )
{
labImagen = new JLabel( );
labImagen.setIcon( new ImageIcon( RUTA_IMAGEN ) );
add( labImagen );
}
}
/**~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Universidad de los Andes (Bogotá - Colombia)
* Departamento de Ingeniería de Sistemas y Computación
* Licenciado bajo el esquema Academic Free License version 2.1
*
* Proyecto Cupi2 (http://cupi2.uniandes.edu.co)
* Ejercicio: n6_campeonato
* Autor: Equipo Cupi2 2017
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/ package uniandes.cupi2.campeonato.interfaz;
/**
* Este es el panel donde se muestra la tabla de goles del campeonato.
*/
@SuppressWarnings("serial") public class PanelTablaGoles extends JPanel
{
// -----------------------------------------------------------------
// Atributos
// -----------------------------------------------------------------
/**
* Una referencia al objeto del modelo del mundo que representa el campeonato.
*/ private Campeonato campeonato;
/**
* Número de equipos que juega en el campeonato.
*/ private int numeroEquipos;
// -----------------------------------------------------------------
// Atributos de la Interfaz
// -----------------------------------------------------------------
/**
* Las etiquetas donde se escriben los resultados.
*/ private JLabel[][] tablaEtiquetasGoles;
/**
* Construye el panel sin ningún campeonato.
*/ public PanelTablaGoles( )
{
campeonato = null;
numeroEquipos = 0;
setBorder( new TitledBorder( "Tabla de goles" ) );
}
/**
* Inicializa la visualización de la tabla de goles del campeonato.
* @param pCampeonato Objeto del modelo del mundo que representa el campeonato. pCampeonato != null.
*/ public void iniciarTablaGoles( Campeonato pCampeonato )
{
campeonato = pCampeonato;
numeroEquipos = campeonato.darNumeroEquipos( );
setLayout( new GridLayout( numeroEquipos + 1, numeroEquipos + 1 ) );
tablaEtiquetasGoles = new JLabel[numeroEquipos + 1][numeroEquipos + 1];
// Crear las etiquetas de los marcadores for( int i = 0; i < numeroEquipos + 1; i++ )
{ for( int j = 0; j < numeroEquipos + 1; j++ )
{ if( i == 0 && j == 0 )
{
tablaEtiquetasGoles[ 0 ][ 0 ] = new JLabel( "" );
} else if( i == 0 )
{
tablaEtiquetasGoles[ 0 ][ j ] = new JLabel( campeonato.darEquipo( j - 1 ).darNombre( ) + " " );
tablaEtiquetasGoles[ 0 ][ j ].setForeground( Color.BLUE );
} else if( j == 0 )
{
tablaEtiquetasGoles[ i ][ 0 ] = new JLabel( campeonato.darEquipo( i - 1 ).darNombre( ) + " " );
tablaEtiquetasGoles[ i ][ 0 ].setForeground( Color.BLUE );
} else if( i == j )
{
tablaEtiquetasGoles[ i ][ i ] = new JLabel( "X" );
} else
{
tablaEtiquetasGoles[ i ][ j ] = new JLabel( "-" );
}
tablaEtiquetasGoles[ i ][ j ].setHorizontalAlignment( JLabel.CENTER );
add( tablaEtiquetasGoles[ i ][ j ] );
}
}
validate( );
}
/**
* Actualiza la información mostrada en la tabla de goles.
*/ public void refrescar( )
{ if( campeonato != null )
{
// Desplegar los resultados de los partidos for( int i = 0; i < numeroEquipos; i++ )
{ for( int j = 0; j < numeroEquipos; j++ )
{ int resultado = campeonato.darGolesMarcados( i, j ); if( i != j && resultado != Campeonato.SIN_JUGAR )
{
tablaEtiquetasGoles[ i + 1 ][ j + 1 ].setText( "" + resultado );
}
}
}
}
}
}
/**~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Universidad de los Andes (Bogotá - Colombia)
* Departamento de Ingeniería de Sistemas y Computación
* Licenciado bajo el esquema Academic Free License version 2.1
*
* Proyecto Cupi2 (http://cupi2.uniandes.edu.co)
* Ejercicio: n6_campeonato
* Autor: Equipo Cupi2 2017
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/ package uniandes.cupi2.campeonato.interfaz;
/**
* Es el panel donde se muestra la tabla de posiciones.
*/
@SuppressWarnings("serial") public class PanelTablaPosiciones extends JPanel
{
// -----------------------------------------------------------------
// Atributos de la Interfaz
// -----------------------------------------------------------------
/**
* Es el área donde se escribe la tabla de posiciones.
*/ private JLabel[][] lblsTabla;
/**
* Constructor del panel.
*/ public PanelTablaPosiciones( )
{
setBorder( new TitledBorder( "Tabla de posiciones" ) );
setLayout( new GridLayout( 6, 9 ) );
setPreferredSize( new Dimension( 900, 450 ) );
campeonato = null;
lblsTabla = new JLabel[6][9]; for( int i = 0; i < lblsTabla.length; i++ )
{ for( int j = 0; j < lblsTabla[ i ].length; j++ )
{
lblsTabla[ i ][ j ] = new JLabel( );
}
}
/**
* Crea la tabla de posiciones mostrada.
* @param pCampeonato El Campeonato que fue cargado con el archivo de properties.
*/ public void crearTabla( Campeonato pCampeonato )
{
for( int i = 0; i < campeonato.darNumeroEquipos( ); i++ )
{
Equipo actual = campeonato.darEquipo( i );
lblsTabla[ i ][ 0 ] = new JLabel( new ImageIcon( new ImageIcon( "./data/imagenes/" + actual.darRuta( ) ).getImage( ).getScaledInstance( 40, 40, Image.SCALE_DEFAULT ) ) );
lblsTabla[ i ][ 0 ].setHorizontalAlignment( JLabel.CENTER );
add( lblsTabla[ i ][ 0 ] );
lblsTabla[ i ][ 1 ] = new JLabel( actual.darNombre( ) );
lblsTabla[ i ][ 1 ].setHorizontalAlignment( JLabel.CENTER );
add( lblsTabla[ i ][ 1 ] );
lblsTabla[ i ][ 2 ] = new JLabel( campeonato.darTotalPuntos( i ) + "" );
lblsTabla[ i ][ 2 ].setHorizontalAlignment( JLabel.CENTER );
add( lblsTabla[ i ][ 2 ] );
lblsTabla[ i ][ 3 ] = new JLabel( campeonato.darPartidosJugados( i ) + "" );
lblsTabla[ i ][ 3 ].setHorizontalAlignment( JLabel.CENTER );
add( lblsTabla[ i ][ 3 ] );
lblsTabla[ i ][ 4 ] = new JLabel( campeonato.darPartidosGanados( i ) + "" );
lblsTabla[ i ][ 4 ].setHorizontalAlignment( JLabel.CENTER );
add( lblsTabla[ i ][ 4 ] );
lblsTabla[ i ][ 5 ] = new JLabel( campeonato.darPartidosEmpatados( i ) + "" );
lblsTabla[ i ][ 5 ].setHorizontalAlignment( JLabel.CENTER );
add( lblsTabla[ i ][ 5 ] );
lblsTabla[ i ][ 6 ] = new JLabel( campeonato.darPartidosPerdidos( i ) + "" );
lblsTabla[ i ][ 6 ].setHorizontalAlignment( JLabel.CENTER );
add( lblsTabla[ i ][ 6 ] );
lblsTabla[ i ][ 7 ] = new JLabel( campeonato.darGolesAFavor( i ) + "" );
lblsTabla[ i ][ 7 ].setHorizontalAlignment( JLabel.CENTER );
add( lblsTabla[ i ][ 7 ] );
lblsTabla[ i ][ 8 ] = new JLabel( campeonato.darGolesEnContra( i ) + "" );
lblsTabla[ i ][ 8 ].setHorizontalAlignment( JLabel.CENTER );
add( lblsTabla[ i ][ 8 ] );
}
validate( );
}
/**
* Actualiza la tabla de posiciones mostrada.
*/ public void refrescar( )
{ for( int i = 0; i < campeonato.darNumeroEquipos( ); i++ )
{
lblsTabla[ i ][ 2 ].setText( "" + campeonato.darTotalPuntos( i ) );
lblsTabla[ i ][ 3 ].setText( campeonato.darPartidosJugados( i ) + "" );
lblsTabla[ i ][ 4 ].setText( campeonato.darPartidosGanados( i ) + "" );
lblsTabla[ i ][ 5 ].setText( campeonato.darPartidosEmpatados( i ) + "" );
lblsTabla[ i ][ 6 ].setText( campeonato.darPartidosPerdidos( i ) + "" );
lblsTabla[ i ][ 7 ].setText( campeonato.darGolesAFavor( i ) + "" );
lblsTabla[ i ][ 8 ].setText( campeonato.darGolesEnContra( i ) + "" );
}
}
}
/**~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Universidad de los Andes (Bogotá - Colombia)
* Departamento de Ingeniería de Sistemas y Computación
* Licenciado bajo el esquema Academic Free License version 2.1
*
* Proyecto Cupi2 (http://cupi2.uniandes.edu.co)
* Ejercicio: n6_campeonato
* Autor: Equipo Cupi2 2017
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/ package uniandes.cupi2.campeonato.mundo;
/**
* Construye un nuevo campeonato de fútbol.
* @param pArchivo Es el archivo que contiene la descripción de los equipos del campeonato. pArchivo != null.
* @throws Exception Se lanza esta excepción si hay problemas cargando el archivo.
*/ public Campeonato( File pArchivo ) throws Exception
{
Properties datos = cargarInfoCampeonato( pArchivo );
inicializarEquipos( datos );
inicializarTablaGoles( );
}
/**
* Carga la información de los equipos del campeonato en un objeto de tipo Properties.
* @param pArchivo Es el archivo que contiene la descripción de los equipos del campeonato.
* @return Un objeto de la clase Properties con la información del archivo.
* @throws Exception Se lanza esta excepción si el archivo no existe o si el formato del archivo no es válido y no puede ser leído.
*/ private Properties cargarInfoCampeonato( File pArchivo ) throws Exception
{
Properties datos = new Properties( );
FileInputStream in = new FileInputStream( pArchivo ); try
{
datos.load( in );
in.close( );
} catch( Exception e )
{ throw new Exception( "Formato inválido" );
} return datos;
}
/**
* Inicializa el arreglo de equipos con la información que recibe en el parámetro de entrada. <br>
* <b>post: </b> El arreglo de equipos fue inicializado con los nombres de los equipos que venían en el parámetro de entrada.
* @param pDatos Contiene la información cargada del archivo para inicializar el campeonato. Esta información es completa y válida.
*/ private void inicializarEquipos( Properties pDatos )
{
String strNumeroEquipos = pDatos.getProperty( "campeonato.equipos" );
maxEquipos = Integer.parseInt( strNumeroEquipos );
// Crea el arreglo de equipos, reservando el espacio definido en la propiedad "campeonato.equipos"
equipos = new Equipo[maxEquipos];
// Lee el nombre de cada equipo de la respectiva propiedad y crea el objeto que lo representa for( int i = 0; i < maxEquipos; i++ )
{
String nombreEquipo = pDatos.getProperty( "campeonato.nombre" + i );
String ruta = pDatos.getProperty( "campeonato.ruta" + i );
equipos[ i ] = new Equipo( nombreEquipo, ruta );
}
}
/**
* Crea la matriz que contiene la tabla de goles. Es una matriz cuadrada de maxEquipos filas y maxEquipos columnas.
*/ private void inicializarTablaGoles( )
{
// Crea la matriz que contiene la tabla de goles
tablaGoles = new int[maxEquipos][maxEquipos];
// Inicializa todos los marcadores, dejando en la diagonal una marca especial for( int i = 0; i < maxEquipos; i++ )
{ for( int j = 0; j < maxEquipos; j++ )
{ if( i != j )
{
tablaGoles[ i ][ j ] = SIN_JUGAR;
} else
{
tablaGoles[ i ][ j ] = INVALIDO;
}
}
}
}
/**
* Retorna el número de goles marcados por el equipo eq1 al equipo eq2.
* @param pEquipo1 Es el número del equipo 1. eq1 es un número de equipo válido.
* @param pEquipo2 Es el número del equipo 2. eq2 es un número de equipo válido.
* @return Número de goles marcados.
*/ public int darGolesMarcados( int pEquipo1, int pEquipo2 )
{ return tablaGoles[ pEquipo1 ][ pEquipo2 ];
}
/**
* Retorna el número de equipos del campeonato.
* @return Número de equipos del campeonato.
*/ public int darNumeroEquipos( )
{ return maxEquipos;
}
/**
* Retorna el equipo cuyo número se pasa como parámetro.
* @param pEquipo Número del equipo. pEquipo es un número de equipo válido.
* @return El equipo cuyo número se pasa como parámetro.
*/ public Equipo darEquipo( int pEquipo )
{ return equipos[ pEquipo ];
}
/**
* Registra el resultado de un partido. <br>
* <b>pre: </b> Los equipos que participan en el campeonato ya fueron inicializados. <br>
* <b>post: </b> Se actualizó la tabla de goles con el resultado indicado.
* @param pEquipo1 Es el número del equipo 1.
* @param pEquipo2 Es el número del equipo 2.
* @param pGol1 Es el número de goles marcados por el equipo eq1.
* @param pGol2 Es el número de goles marcados por el equipo eq2.
* @throws Exception Se lanza esta excepción si los equipos no son válidos, si el número de goles es inválido o si el partido ya se ha jugado.
*/ public void registrarResultado( int pEquipo1, int pEquipo2, int pGol1, int pGol2 ) throws Exception
{ if( pEquipo1 < 0 || pEquipo1 >= maxEquipos || pEquipo2 < 0 || pEquipo2 >= maxEquipos )
{ throw new Exception( "Equipos incorrectos" );
} if( pEquipo1 == pEquipo2 )
{ throw new Exception( "Son el mismo equipo" );
} if( pGol1 < 0 || pGol2 < 0 )
{ throw new Exception( "Número de goles inválido" );
} if( tablaGoles[ pEquipo1 ][ pEquipo2 ] != SIN_JUGAR || tablaGoles[ pEquipo2 ][ pEquipo1 ] != SIN_JUGAR )
{ throw new Exception( "Partido ya jugado" );
}
tablaGoles[ pEquipo1 ][ pEquipo2 ] = pGol1;
tablaGoles[ pEquipo2 ][ pEquipo1 ] = pGol2;
}
/**
* Retorna el número total de partidos ganados por un equipo.
* @param pEquipo Número del equipo. Equipo es un número válido.
* @return Número de partidos ganados.
*/ public int darPartidosGanados( int pEquipo )
{ int ganados = 0; for( int i = 0; i < maxEquipos; i++ )
{ if( tablaGoles[ pEquipo ][ i ] != SIN_JUGAR && tablaGoles[ pEquipo ][ i ] != INVALIDO && tablaGoles[ pEquipo ][ i ] > tablaGoles[ i ][ pEquipo ] )
{
ganados++;
}
} return ganados;
}
/**
* Retorna el número total de partidos perdidos por un equipo.
* @param pEquipo Número del equipo. Equipo es un número válido.
* @return Número de partidos perdidos.
*/ public int darPartidosPerdidos( int pEquipo )
{ int perdidos = 0; for( int i = 0; i < maxEquipos; i++ )
{ if( tablaGoles[ pEquipo ][ i ] != SIN_JUGAR && tablaGoles[ pEquipo ][ i ] != INVALIDO && tablaGoles[ pEquipo ][ i ] < tablaGoles[ i ][ pEquipo ] )
{
perdidos++;
}
} return perdidos;
}
/**
* Retorna el número total de partidos empatados por un equipo.
* @param pEquipo Número del equipo. Equipo es un número válido.
* @return Número de partidos empatados.
*/ public int darPartidosEmpatados( int pEquipo )
{ int empatados = 0; for( int i = 0; i < maxEquipos; i++ )
{ if( tablaGoles[ pEquipo ][ i ] != SIN_JUGAR && tablaGoles[ pEquipo ][ i ] != INVALIDO && tablaGoles[ pEquipo ][ i ] == tablaGoles[ i ][ pEquipo ] )
{
empatados++;
}
} return empatados;
}
/**
* Retorna el número total de partidos jugados por un equipo.
* @param pEquipo Número del equipo. Equipo es un número válido.
* @return Número de partidos jugados.
*/ public int darPartidosJugados( int pEquipo )
{ int jugados = 0; for( int i = 0; i < maxEquipos; i++ )
{ if( tablaGoles[ pEquipo ][ i ] != SIN_JUGAR && tablaGoles[ pEquipo ][ i ] != INVALIDO )
{
jugados++;
}
} return jugados;
}
/**
* Retorna el número de goles en contra del equipo.
* @param pEquipo Número del equipo. Equipo es un número válido.
* @return Número de goles en contra.
*/ public int darGolesEnContra( int pEquipo )
{ int golesEnContra = 0; for( int i = 0; i < maxEquipos; i++ )
{ if( tablaGoles[ pEquipo ][ i ] != SIN_JUGAR && tablaGoles[ pEquipo ][ i ] != INVALIDO )
{
golesEnContra += tablaGoles[ i ][ pEquipo ];
}
} return golesEnContra;
}
/**
* Retorna el número de goles a favor del equipo.
* @param pEquipo Número del equipo. Equipo es un número válido.
* @return Número de goles a favor.
*/ public int darGolesAFavor( int pEquipo )
{ int golesAFavor = 0; for( int i = 0; i < maxEquipos; i++ )
{ if( tablaGoles[ pEquipo ][ i ] != SIN_JUGAR && tablaGoles[ pEquipo ][ i ] != INVALIDO )
{
golesAFavor += tablaGoles[ pEquipo ][ i ];
}
} return golesAFavor;
}
/**
* Retorna el número total de puntos que tiene un equipo.
* @param pEquipo Número del equipo. Equipo es un número válido.
* @return Número total de puntos en el campeonato que tiene el equipo.
*/ public int darTotalPuntos( int pEquipo )
{ return 3 * darPartidosGanados( pEquipo ) + darPartidosEmpatados( pEquipo );
}
// -----------------------------------------------------------------
// Puntos de Extensión
// -----------------------------------------------------------------
/**
* Es el punto de extensión 1.
* @return Respuesta 1.
*/ public String metodo1( )
{ return "Respuesta 1";
}
/**
* Es el punto de extensión 2.
* @return Respuesta 2.
*/ public String metodo2( )
{ return "Respuesta 2";
}
}
/**~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Universidad de los Andes (Bogotá - Colombia)
* Departamento de Ingeniería de Sistemas y Computación
* Licenciado bajo el esquema Academic Free License version 2.1
*
* Proyecto Cupi2 (http://cupi2.uniandes.edu.co)
* Ejercicio: n6_campeonato
* Autor: Equipo Cupi2 2017
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/ package uniandes.cupi2.campeonato.mundo;
/**
* Es la clase que representa a un equipo.
*/ public class Equipo
{
// -----------------------------------------------------------------
// Atributos
// -----------------------------------------------------------------
/**
* El nombre del equipo.
*/ private String nombre;
/**
* La ruta del logo del equipo.
*/ private String ruta;
/**
* Construye una nueva instancia de un equipo.
* @param pNombreEquipo El nombre del equipo. pNombreEquipo != null && pNombreEquipo != "".
* @param pRuta La ruta del logo del equipo. pEquipo != null && pEquipo != "".
*/ public Equipo( String pNombreEquipo, String pRuta )
{
nombre = pNombreEquipo;
ruta = pRuta;
}
/**
* Retorna el nombre del equipo.
* @return El nombre del equipo.
*/ public String darNombre( )
{ return nombre;
}
/**
* Retorna el ruta del equipo.
* @return La ruta del equipo.
*/ public String darRuta( )
{ return ruta;
}
/**
* Retorna una representación como cadena de caracteres del equipo.
* @return El nombre del equipo.
*/ public String toString( )
{ return nombre;
}
}