Package prop.hex.presentacio

Source Code of prop.hex.presentacio.PartidaVista

package prop.hex.presentacio;

import prop.cluster.domini.models.estats.EstatPartida;
import prop.hex.domini.models.enums.ModesInici;
import prop.hex.domini.models.enums.TipusJugadors;
import prop.hex.presentacio.auxiliars.JPanelImatge;
import prop.hex.presentacio.auxiliars.JPanelTauler;
import prop.hex.presentacio.auxiliars.VistaDialeg;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;

/**
* Vista d'una partida del joc Hex.
*
* @author Guillermo Girona San Miguel (Grup 7.3, Hex)
*/
public final class PartidaVista extends BaseVista
{

  // Panell del tauler

  /**
   * Panell central de la vista que conté el tauler.
   */
  private JPanelTauler panell_central;

  // Panells

  /**
   * Panell que conté els botons de la vista.
   */
  private JPanel panell_botons;

  // Botons

  /**
   * Botó d'intercanvia fitxa.
   */
  private JButton intercanvia;

  /**
   * Botó de mou IA.
   */
  private JButton mou_ia;

  /**
   * Botó de demana pista.
   */
  private JButton demana_pista;

  /**
   * Botó d'abandona partida.
   */
  private JButton abandona;

  /**
   * Constructor que crea una vista passant-li quin és el frame sobre el qual s'haurà de treballar.
   *
   * @param frame_principal Frame principal sobre el que s'hauran d'afegir els diferents components.
   */
  public PartidaVista( JFrame frame_principal )
  {
    super( frame_principal );

    titol = new JLabel( "jHex" );
    panell_principal = new JPanelImatge( getClass().getResource( "/prop/img/fons_partida.png" ) );
    panell_central = new JPanelTauler( true );
    panell_botons = new JPanel();
    intercanvia = new JButton( "Intercanvia fitxa" );
    mou_ia = new JButton( "Mou IA" );
    demana_pista = new JButton( "Demana pista" );
    abandona = new JButton( "Abandona la partida" );

    inicialitzaVista();
  }

  @Override
  protected void inicialitzaPanellPrincipal()
  {
    panell_principal.add( panell_central );
    panell_principal.add( panell_botons );
  }

  @Override
  protected void inicialitzaPanellCentral()
  {
    panell_central.setOpaque( false );
  }

  @Override
  protected void inicialitzaPanellPeu()
  {
    Object[][] elements_de_control_jugadors = PresentacioCtrl.getInstancia().getElementsDeControlJugadors();
    boolean es_partida_ia = ( ( TipusJugadors ) elements_de_control_jugadors[0][0] ) != TipusJugadors.JUGADOR &&
                            ( ( TipusJugadors ) elements_de_control_jugadors[0][0] ) != TipusJugadors.CONVIDAT &&
                            ( ( TipusJugadors ) elements_de_control_jugadors[0][1] ) != TipusJugadors.JUGADOR &&
                            ( ( TipusJugadors ) elements_de_control_jugadors[0][1] ) != TipusJugadors.CONVIDAT;
    JPanel botons = new JPanel();
    if ( PresentacioCtrl.getInstancia().getElementsDeControlPartida()[4] == ModesInici.PASTIS &&
         ( elements_de_control_jugadors[0][1] == TipusJugadors.CONVIDAT ||
           elements_de_control_jugadors[0][1] == TipusJugadors.JUGADOR ) )
    {
      botons.add( intercanvia );
      intercanvia.setEnabled( false );
    }
    int num_jugador = ( Integer ) PresentacioCtrl.getInstancia().getElementsDeControlPartida()[2] % 2;
    if ( elements_de_control_jugadors[0][num_jugador] != TipusJugadors.CONVIDAT &&
         elements_de_control_jugadors[0][num_jugador] != TipusJugadors.JUGADOR )
    {
      botons.add( mou_ia );
    }
    if ( !es_partida_ia )
    {
      botons.add( demana_pista );
      demana_pista.setEnabled( false );
    }
    botons.add( abandona );
    botons.setOpaque( false );
    panell_botons.setLayout( new FlowLayout( FlowLayout.CENTER, 50, 0 ) );
    panell_botons.add( botons );
    panell_botons.add( panell_sortida );
    panell_botons.setOpaque( false );
  }

  @Override
  protected void inicialitzaPanellSortida()
  {
    panell_sortida.setLayout( new FlowLayout( FlowLayout.CENTER, 10, 0 ) );
    panell_sortida.add( ajuda );
    panell_sortida.add( surt );
    panell_sortida.setOpaque( false );
  }

  @Override
  protected void assignaListeners()
  {
    super.assignaListeners();

    intercanvia.addActionListener( new ActionListener()
    {

      @Override
      public void actionPerformed( ActionEvent event )
      {
        accioBotoIntercanviaFitxa();
      }
    } );

    mou_ia.addActionListener( new ActionListener()
    {

      @Override
      public void actionPerformed( ActionEvent event )
      {
        accioBotoMouIA();
      }
    } );

    demana_pista.addActionListener( new ActionListener()
    {

      @Override
      public void actionPerformed( ActionEvent event )
      {
        accioBotoDemanaPista();
      }
    } );

    abandona.addActionListener( new ActionListener()
    {

      @Override
      public void actionPerformed( ActionEvent event )
      {
        accioBotoAbandona( false );
      }
    } );
  }

  /**
   * Modifica l'estat del botó d'intercanvia fitxa.
   *
   * @param estat Cert, si es vol activar el botó. Fals, altrament.
   */
  public void estatBotoIntercanviaFitxa( boolean estat )
  {
    intercanvia.setEnabled( estat );
  }

  /**
   * Modifica l'estat del botó de demana pista.
   *
   * @param estat Cert, si es vol activar el botó. Fals, altrament.
   */
  public void estatBotoDemanaPista( boolean estat )
  {
    demana_pista.setEnabled( estat );
  }

  /**
   * Defineix el comportament del botó d'intercanvia fitxa quan sigui pitjat.
   */
  public void accioBotoIntercanviaFitxa()
  {
    intercanvia.setEnabled( false );
    panell_central.intercanviaFitxa();
  }

  /**
   * Defineix el comportament del botó de mou IA quan sigui pitjat.
   */
  public void accioBotoMouIA()
  {
    mou_ia.setEnabled( false );
    panell_central.mouIAOMostraPista();
    if ( PresentacioCtrl.getInstancia().consultaEstatPartida() == EstatPartida.NO_FINALITZADA )
    {
      int num_jugador = ( Integer ) PresentacioCtrl.getInstancia().getElementsDeControlPartida()[2] % 2;
      if ( PresentacioCtrl.getInstancia().getElementsDeControlJugadors()[0][num_jugador] !=
           TipusJugadors.CONVIDAT &&
           PresentacioCtrl.getInstancia().getElementsDeControlJugadors()[0][num_jugador] !=
           TipusJugadors.JUGADOR )
      {
        mou_ia.setEnabled( true );
      }
    }
  }

  /**
   * Defineix el comportament del botó de demanar pista quan sigui pitjat.
   */
  public void accioBotoDemanaPista()
  {
    demana_pista.setEnabled( false );
    panell_central.mouIAOMostraPista();
  }

  /**
   * Defineix el comportament del botó d'abandonar partida quan sigui pitjat.
   * Pot ser invocat també desde el botó de sortida del joc.
   *
   * @param sortir_del_programa Si es true sortirem del joc completament tancant el programa, si no,
   *                            anirém a la pantalla principal
   */
  public void accioBotoAbandona( boolean sortir_del_programa )
  {
    // Primer preguntem si vol guardar la partida a disc abans de sortir
    Object[][] elements_de_control_jugadors = PresentacioCtrl.getInstancia().getElementsDeControlJugadors();

    boolean es_partida_ia = ( ( TipusJugadors ) elements_de_control_jugadors[0][0] ) != TipusJugadors.JUGADOR &&
                            ( ( TipusJugadors ) elements_de_control_jugadors[0][0] ) != TipusJugadors.CONVIDAT &&
                            ( ( TipusJugadors ) elements_de_control_jugadors[0][1] ) != TipusJugadors.JUGADOR &&
                            ( ( TipusJugadors ) elements_de_control_jugadors[0][1] ) != TipusJugadors.CONVIDAT;

    boolean es_partida_convidat =
        ( ( TipusJugadors ) elements_de_control_jugadors[0][0] ) == TipusJugadors.CONVIDAT ||
        ( ( TipusJugadors ) elements_de_control_jugadors[0][1] ) == TipusJugadors.CONVIDAT;

    if ( es_partida_convidat || es_partida_ia )
    {
      VistaDialeg dialeg = new VistaDialeg();
      String[] botons = {
          "Sí",
          "No"
      };

      String valor_seleccionat = dialeg.setDialeg( "Confirmació de sortida de la partida",
          "Estàs segur que vols sortir de la partida?", botons, JOptionPane.QUESTION_MESSAGE );

      if ( "Sí" == valor_seleccionat )
      {
        if ( sortir_del_programa )
        {
          System.exit( 0 );
        }
        else
        {
          PresentacioCtrl.getInstancia().vistaPartidaAMenuPrincipal();
        }
      }
    }
    else
    {
      VistaDialeg dialeg_guardar_partida = new VistaDialeg();
      String[] botons_guardar_partida = {
          "Sí",
          "No",
          "Cancel·la"
      };

      String valor_seleccionat = dialeg_guardar_partida.setDialeg( "Guardar abans de sortir?",
          "Vols guardar la partida abans de sortir per poder-la carregar després?", botons_guardar_partida,
          JOptionPane.QUESTION_MESSAGE );

      // Si vol guardar la partida, la guardem a disc i sortim al menú principal
      if ( "Sí" == valor_seleccionat )
      {
        try
        {
          PresentacioCtrl.getInstancia().guardaPartida();

          PresentacioCtrl.getInstancia().netejaParametresPartidaActual();

          if ( sortir_del_programa )
          {
            System.exit( 0 );
          }
          else
          {
            PresentacioCtrl.getInstancia().vistaPartidaAMenuPrincipal();
          }
        }
        catch ( IOException excepcio )
        {
          VistaDialeg dialeg_error_guardant = new VistaDialeg();
          String[] botons_error_guardant = { "Accepta" };
          dialeg_error_guardant.setDialeg( "Error", excepcio.getMessage(), botons_error_guardant,
              JOptionPane.WARNING_MESSAGE );
        }
        catch ( UnsupportedOperationException excepcio )
        {
          VistaDialeg dialeg_error_guardant = new VistaDialeg();
          String[] botons_error_guardant = { "Accepta" };
          dialeg_error_guardant.setDialeg( "Error", excepcio.getMessage(), botons_error_guardant,
              JOptionPane.WARNING_MESSAGE );
        }
      }
      else if ( "No" == valor_seleccionat )
      {
        // Si no vol guardar la partida, retornem a menu principal reinicialitzant els paràmetres de la
        // partida en joc a valors buits
        PresentacioCtrl.getInstancia().netejaParametresPartidaActual();

        if ( sortir_del_programa )
        {
          System.exit( 0 );
        }
        else
        {
          PresentacioCtrl.getInstancia().vistaPartidaAMenuPrincipal();
        }
      }
      // Si selecciona l'opció de cancel·lar la sortida, simplement no fem res :)
    }
  }

  /**
   * Mostra un diàleg al finalitzar la partida amb les dades de la mateixa. Realitza la finalització de la partida.
   *
   * @param missatge Missatge que es mostra en el diàleg.
   */
  public void mostraDialegVictoria( String missatge )
  {
    boolean te_situacio_inicial = PresentacioCtrl.getInstancia().esPartidaAmbSituacioInicial();
    try
    {
      PresentacioCtrl.getInstancia().finalitzaPartida();
    }
    catch ( Exception excepcio )
    {
      VistaDialeg dialeg_error = new VistaDialeg();
      String[] botons_error = { "Accepta" };
      dialeg_error.setDialeg( "Error", excepcio.getMessage(), botons_error, JOptionPane.WARNING_MESSAGE );
    }

    VistaDialeg dialeg = new VistaDialeg();
    String[] botons;
    if ( te_situacio_inicial )
    {
      botons = new String[] {
          "Torna al menú principal",
      };
    }
    else
    {
      botons = new String[] {
          "Torna al menú principal",
          "Partida de revenja"
      };
    }
    String opcio = dialeg.setDialeg( "Partida finalitzada", missatge, botons, JOptionPane.INFORMATION_MESSAGE );

    try
    {
      PresentacioCtrl.getInstancia().tancaPartida( opcio.equals( "Partida de revenja" ) );
    }
    catch ( Exception excepcio )
    {
      VistaDialeg dialeg_error = new VistaDialeg();
      String[] botons_error = { "Accepta" };
      dialeg_error.setDialeg( "Error", excepcio.getMessage(), botons_error, JOptionPane.ERROR_MESSAGE );
    }

    if ( opcio.equals( "Partida de revenja" ) )
    {
      PresentacioCtrl.getInstancia().regeneraPartidaVista();
    }
    else
    {
      PresentacioCtrl.getInstancia().vistaPartidaAMenuPrincipal();
    }
  }

  /**
   * Defineix el comportament del botó de sortida quan sigui pitjat.
   */
  @Override
  public void accioBotoSurt()
  {
    accioBotoAbandona( true );
  }
}
TOP

Related Classes of prop.hex.presentacio.PartidaVista

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.