Package modelo

Source Code of modelo.Peon

package modelo;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import modelo.excepciones.ExcepcionCasillaDestinoOcupada;
import modelo.excepciones.ExcepcionCoordenadaErronea;
import modelo.excepciones.ExcepcionMovimientoIlegal;


/**
* Clase Peon.
*
* @author JESUS MANRESA PARRES
* @version 3
* @date 29.10.2012
*/
public class Peon extends Pieza
 
  /** Variable privada que indica el tipo, Peon= 'P'. */
  private static final char tipo= 'P';
 
  /**
   * Constructor de clase.
   *
   * @param c Color de la pieza
   */
  public Peon(Color c)
  {
    super(c);
    valor=1;
  }

  /**
   * Metodo que indica si el peon esta en su fila de inicio, es dcir, aun no ah exo ningun movimiento.
   *
   * @return boolean
   */
  public boolean isEnPosicionOriginal()
  {
    if(getCasilla()!=null)
    {
      if(getColor()==Color.BLANCO && getCasilla().getCoordenada().getY()==2)
        return true;
      else if(getColor()==Color.NEGRO && getCasilla().getCoordenada().getY()==7)
        return true;
    }
    return false;
  }
 
  /**
   * Metodo que indica si una pieza puede mover (casilla dentro de tablero y no ocupada, si esta
   * ocupada que nosea del mismo color.
   * @param c Casilla a la que se va a mover
   * @return boolean
   */
  @Override
  public boolean puedeMover(Casilla c)
  {
    try
    {
      Set<Casilla> aux= getCasillasAmenazadas();
      Pieza piezac= PartidaAjedrez.getInstancia().getPiezaAt(c.getCoordenada());
      Casilla cas= PartidaAjedrez.getInstancia().getTablero().getCasillaAt(c.getCoordenada());
   
      if(isValida() && getCasilla()!=null)
      {
        int[] dif= getDiferencia(cas);
     
        if(dif!=null)
        {  
          if(dif[0]<0 && getColor()==Color.BLANCO)
            return false;
          else if(dif[0]>0 && getColor()==Color.NEGRO)
            return false;

          if(Math.abs(dif[0])==1 && dif[1]==0 && piezac==null)
            return true;
          else if(aux.contains(cas))
          {
            if(piezac!=null && isMismoColor(piezac) || piezac==null)
              return false;
            else
              return true;
          }
          else if(Math.abs(dif[0])==2 && dif[1]==0 && isEnPosicionOriginal() && piezac==null)
          {
            Coordenada inter= new Coordenada(cas.getCoordenada().getLetra(), cas.getCoordenada().getY() - Integer.signum(dif[0]));
           
            if(PartidaAjedrez.getInstancia().getPiezaAt(inter)==null)
              return true;
         
        }
      }
    }
    catch(ExcepcionCoordenadaErronea e)
    {
      System.err.println("Error: " + e.getMessage());
    }
   
    return false;
  }
 
  /**
   * Metodo que mueve la casilla si el movimiento es valido y no esta ocupada por una pieza
   * del mismo color. SI es de disinto color la quitara del tablero y luego asignara nuestra
   * pieza a esa casilla.
   * @param c una casilla
   * @throws ExcepcionMovimientoIlegal the excepcion movimiento ilegal
   * @throws ExcepcionCasillaDestinoOcupada the excepcion casilla destino ocupada
   */
  @Override
  public void mueve(Casilla c) throws ExcepcionCasillaDestinoOcupada, ExcepcionMovimientoIlegal
  {
    try
    {
      Movimiento m= new MovimientoOrdinario(getCasilla().getCoordenada(), c.getCoordenada());
      Pieza piezac= PartidaAjedrez.getInstancia().getPiezaAt(c.getCoordenada());
     
      if(puedeMover(c))
      {
        if(c.getPieza()!=null)
          c.quitaPieza();
     
        quitaDeCasilla();
        setCasilla(c);
        haMovido=true;
      }
      else
      {
        if(piezac!=null)
          throw new ExcepcionCasillaDestinoOcupada(m);
        else
          throw new ExcepcionMovimientoIlegal(this,m);
     
    }
    catch (ExcepcionCoordenadaErronea e)
    {
      e.printStackTrace();
    }
  }

  /**
   * Metodo que indica si dos piezas son del mismo tipo.
   * @param p the p
   * @return boolean
   */
  @Override
  public boolean isMismoTipo(Pieza p)
  {
    return p.getTipo()==tipo;
  }

  /**
   * Getter.
   * @return char
   */
  @Override
  public char getTipo()
  {
    return tipo;
  }
 
  /**
   * Devuelve true si el peon se encuentra en la ultima fila
   * @return boolean
   */
  public boolean isEnUltimaFila()
  {
    if(getCasilla()!=null)
    {
      if(getColor().equals(Color.BLANCO) && getCasilla().getCoordenada().getY()==8)
        return true;
      else if(getColor().equals(Color.NEGRO) && getCasilla().getCoordenada().getY()==1)
        return true;
    }
    return false;
  }
 
  /**
   * Getter
   * @return Set<Pieza>
   */
  @Override
  public Set<Casilla> getCasillasAmenazadas()
  {
    Set<Casilla> lista= new HashSet<Casilla>();
    List<Casilla> aux= new ArrayList<Casilla>();
    Tablero t= PartidaAjedrez.getInstancia().getTablero();
    Casilla cas= getCasilla();
   
    if(cas!=null && isValida())
    {
      if(getColor().equals(Color.BLANCO))
      {
        aux= t.getDiagonalNO(cas);
        if(aux.size()>0)
          lista.add(aux.get(0));
         
        aux= t.getDiagonalNE(cas);
        if(aux.size()>0)
          lista.add(aux.get(0));
      }
      else
      {
        aux= t.getDiagonalSO(cas);
        if(aux.size()>0)
          lista.add(aux.get(0));
         
        aux= t.getDiagonalSE(cas);
        if(aux.size()>0)
          lista.add(aux.get(0));
      }
    }
    return lista;
  }
 
  /**
   * Comrpueba el peon esta en la siguiente fila a la mitad del tablero
   * @return boolean
   */
  public boolean mitadTablero()
  {
    if(getCasilla()!=null)
    {
      if(getColor().equals(Color.NEGRO) && getCasilla().getCoordenada().getY()==4)
        return true;
      if(getColor().equals(Color.BLANCO) && getCasilla().getCoordenada().getY()==5)
        return true;
    }
    return false;
  }
 
  /**
   * Comprueba si el peon esta en la fila siguiente a la siguiente de
   * la mitad del tablero (Blancas: 6,7,8) (Negras: 3,2,1)
   * @return boolean
   */
  public boolean mitadSuperiorTablero()
  {
    if(getCasilla()!=null)
    {
      if(getColor().equals(Color.NEGRO) && getCasilla().getCoordenada().getY()<4)
        return true;
      if(getColor().equals(Color.BLANCO) && getCasilla().getCoordenada().getY()>5)
        return true;
    }
    return false;
  }
 
  /**
   * Metodo que indica si un peon esta desdoblado
   * @return boolean
   */
  public boolean isDoblado()
  {
    if(getCasilla()!=null)
    {
      Tablero t= PartidaAjedrez.getInstancia().getTablero();
      List<Casilla> lista= t.getColumnaArriba(getCasilla());
     
      if(lista!=null)
      {
        Pieza p;
        int i=0;
        while(i<lista.size())
        {
          p= lista.get(i).getPieza();
         
          if(p!=null && (p instanceof Peon) && isMismoColor(p))
            return true;
          i++;
        }
      }
     
      lista= t.getColumnaAbajo(getCasilla());
      if(lista!=null)
      {
        Pieza p;
        int i=0;
        while(i<lista.size())
        {
          p= lista.get(i).getPieza();
         
          if(p!=null && (p instanceof Peon) && isMismoColor(p))
            return true;
          i++;
        }
      }
    }
   
    return false;
  }
}
TOP

Related Classes of modelo.Peon

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.