Package prop.hex.domini.controladors.IA.auxiliars

Source Code of prop.hex.domini.controladors.IA.auxiliars.ConnexionsVirtuals

package prop.hex.domini.controladors.IA.auxiliars;

import prop.cluster.domini.models.estats.EstatCasella;
import prop.hex.domini.models.Casella;
import prop.hex.domini.models.TaulerHex;

import java.util.ArrayList;

/**
* Obté les connexions virtuals i semivirtuals de primer ordre. És a dir, els conjunts de caselles d'un usuari
* que es poden connectar col·locant una fitxa indepentdentment del que faci l'usuari contrari (connexió virtual)
* o que l'usuari contrari ens pot bloquejar si mou abans que nosaltres (connexió semivirtual).
*
* @author Marc Junyent Martín (Grup 7.3, Hex)
*/
public final class ConnexionsVirtuals
{

  /**
   * Tauler sobre el que es busquen les connexions.
   */
  private TaulerHex tauler;

  /**
   * Llistat de grups de caselles contigues.
   */
  private ArrayList<GrupCaselles> grups;

  /**
   * Jugador per al que es busquen les connexions.
   */
  private EstatCasella jo;

  /**
   * Nombre de connexions virtuals.
   */
  private int connexions_virtuals;

  /**
   * Nombre de connexions semivirtuals.
   */
  private int connexions_semivirtuals;

  /**
   * Instancia la classe amb el tauler i l'usuari especificats, també busca els grups i les connexions
   * que hi ha entre ells.
   *
   * @param tauler
   * @param jo
   */
  public ConnexionsVirtuals( TaulerHex tauler, EstatCasella jo )
  {
    this.tauler = tauler;
    this.jo = jo;
    connexions_virtuals = 0;
    connexions_semivirtuals = 0;
    grups = new ArrayList<GrupCaselles>();
    //Omplim grups amb tots els grups de caselles.
    buscaGrups();
    //Un cop tenim els grups, busquem les connexions virtuals de primer ordre.
    buscaConnexions();
  }

  /**
   * Busca connexions i semiconnexions de primer ordre, es a dir, grups que tenen caselles veines en comú.
   */
  private void buscaConnexions()
  {
    // Comparem tots els grups amb tots (sense repetir).
    for ( int i = 0; i < grups.size(); i++ )
    {
      for ( int j = i + 1; j < grups.size(); j++ )
      {
        //interseccio és el nombre de caselles veines que comparteixen dos grups.
        int interseccio = grups.get( i ).getVeins().interseca( grups.get( j ).getVeins() );
        if ( interseccio >= 2 ) //si és més que 2 la connexió és virtual per la regla OR.
        {
          connexions_virtuals++;
        }
        else if ( interseccio == 1 ) //si és 1 la connexió és semivirtual per la regla AND.
        {
          connexions_semivirtuals++;
        }
      }
    }
  }

  /**
   * Obté els grups de caselles.
   *
   * @return ArrayList amb els grups de caselles.
   */
  public ArrayList<GrupCaselles> getGrups()
  {
    return grups;
  }

  /**
   * Obté el nombre de connexions virtuals.
   *
   * @return nombre de connexions virtuals.
   */
  public int getConnexions_virtuals()
  {
    return connexions_virtuals;
  }

  /**
   * Obté el nombre de connexions semivirtuals.
   *
   * @return nombre de connexions semivirtuals.
   */
  public int getConnexions_semivirtuals()
  {
    return connexions_semivirtuals;
  }

  /**
   * Obté el llistat de tots els grups de caselles de l'usuari especificat.
   */
  private void buscaGrups()
  {
    //Iterem per totes les caselles.
    for ( int i = 0; i < tauler.getMida(); i++ )
    {
      for ( int j = 0; j < tauler.getMida(); j++ )
      {
        if ( tauler.getEstatCasella( i, j ) == jo ) //si la casella és meva.
        {
          Casella casella = new Casella( i, j );
          if ( !estaEnUnGrup( casella ) )  //i si la casella no esta en cap grup.
          {
            GrupCaselles nou_grup = new GrupCaselles( tauler );
            nou_grup.estendre( casella );
            grups.add( nou_grup );        //creem un nou grup i l'afegim.
          }
        }
      }
    }
  }

  /**
   * Mira si la casella està en algun grup.
   *
   * @param casella
   * @return true si casella està en un grup, false si no.
   */
  private boolean estaEnUnGrup( Casella casella )
  {
    for ( int i = 0; i < grups.size(); i++ )
    {
      if ( grups.get( i ).pertanyAlGrup( casella ) )
      {
        return true;
      }
    }

    return false;
  }
}
TOP

Related Classes of prop.hex.domini.controladors.IA.auxiliars.ConnexionsVirtuals

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.