import java.util.LinkedList;
import java.util.List;


public class Sucesores 
{
    public int numNodo;
    public List<Sucesor> listaSucesores;
    public Tablero tab;
    public int numJug;
    public int jActual;
    public int profundidad;
    public ProfundidadYpeso padre;
    public int numHeu;  
    
    public int tipomesa;

    public Sucesores(int nN, Tablero mesa, int numjugador, int jAct, 
    		int prof, ProfundidadYpeso pyppadre, int numHeuristica, int tipotabl)
    {
        numNodo = nN;
        tab = mesa;
        numJug = numjugador;
        jActual = jAct;
        profundidad = prof;
        padre = new ProfundidadYpeso(pyppadre);
        numHeu = numHeuristica;
        
        tipomesa = tipotabl;
        
        listaSucesores = new LinkedList<Sucesor>();
    }
        

    public void crearLista(int numjugador, int numFichas, int tipotabl)
    {
    	tipomesa = tipotabl;
    	listaSucesores.clear();
    	
    	if (tipomesa == 1)
    	{
    		int cont = 0;
	        if (numjugador == 1)
	        {
	        	for (int i = 0; i < numFichas; i++)
	        	{
	        		// por cada ficha carga su lista de sucesores(indica 
	        		//las pos. validas desde la pos inicial de la ficha en un estado dado del Tablero
	        		
	        		if (tab.jugadores[numjugador - 1].fichas[i].activo){
	        			//System.out.println("listasucesores.addAll");
	        			listaSucesores.addAll(posicionesValidasOca(i, numjugador, numFichas, tipomesa));
	        			cont++;
	        			//System.out.println(i);
	        		}
	        	}
	        	//System.out.println("activossssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss" + cont);
	        }
	        if (numjugador > 1) {
	        	//for (int i = 0; i < 1; i++)
	        	//{
	        		// por cada ficha carga su lista de sucesores(indica 
	        		//las pos. validas desde la pos inicial de la ficha en un estado dado del Tablero
	        		//System.out.println("numFichas " + numFichas);
	        		listaSucesores.addAll(posicionesValidasZorra(12, numjugador, 1, tipomesa));
	        	//}
	        }
    	}
    	else if (tipomesa == 2)
    	{
    		int cont = 0;
    		if (numjugador == 1)
	        {
	        	for (int i = 0; i < numFichas; i++)
	        	{
	        		// por cada ficha carga su lista de sucesores(indica 
	        		//las pos. validas desde la pos inicial de la ficha en un estado dado del Tablero
	        		
	        		if (tab.jugadores[numjugador - 1].fichas[i].activo){
	        			//System.out.println("listasucesores.addAll");
	        			listaSucesores.addAll(posicionesValidasOca(i, numjugador, numFichas, tipomesa));
	        			cont++;
	        			//System.out.println(i);
	        		}
	        	}
	        }
	        if (numjugador > 1) {
	        	//quito el bucle porque siempre es la ficha 21
	        	//for (int i = 0; i < 1; i++)
	        	//{
	        		// por cada ficha carga su lista de sucesores(indica 
	        		//las pos. validas desde la pos inicial de la ficha en un estado dado del Tablero
	        		//System.out.println("numFichas " + numFichas);
	        		listaSucesores.addAll(posicionesValidasZorra(21, numjugador, 1, tipomesa));
	        		//listaSucesores.addAll(posicionesValidasZorra(i, numjugador, 1, tipomesa));
	        	//}
	        }
    	}
    	else if (tipomesa == 3)
    	{
    		int cont = 0;
    		if (numjugador == 1)
	        {
	        	for (int i = 0; i < numFichas; i++)
	        	{
	        		// por cada ficha carga su lista de sucesores(indica 
	        		//las pos. validas desde la pos inicial de la ficha en un estado dado del Tablero
	        		
	        		if (tab.jugadores[numjugador - 1].fichas[i].activo){
	        			//System.out.println("listasucesores.addAll");
	        			listaSucesores.addAll(posicionesValidasOca(i, numjugador, numFichas, tipomesa));
	        			cont++;
	        			//System.out.println(i);
	        		}
	        	}
	        }
	        if (numjugador > 1) {
	        	//for (int i = 0; i < 1; i++)
	        	//{
	        		// por cada ficha carga su lista de sucesores(indica 
	        		//las pos. validas desde la pos inicial de la ficha en un estado dado del Tablero
	        		//System.out.println("numFichas " + numFichas);
	        		listaSucesores.addAll(posicionesValidasZorra(13, numjugador, 1, tipomesa));
	        	//}
	        }
    	}
    	else if (tipomesa == 4)
    	{
    		int cont = 0;
	        if (numjugador == 1)
	        {
	        	for (int i = 0; i < numFichas; i++)
	        	{
	        		// por cada ficha carga su lista de sucesores(indica 
	        		//las pos. validas desde la pos inicial de la ficha en un estado dado del Tablero
	        		
	        		if (tab.jugadores[numjugador - 1].fichas[i].activo){
	        			//System.out.println("listasucesores.addAll");
	        			listaSucesores.addAll(posicionesValidasOca(i, numjugador, numFichas, tipomesa));
	        			cont++;
	        			//System.out.println(i);
	        		}
	        	}
	        	//System.out.println("activossssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss" + cont);
	        }
	        if (numjugador > 1) {
	        	//for (int i = 0; i < 1; i++)
	        	//{
	        		// por cada ficha carga su lista de sucesores(indica 
	        		//las pos. validas desde la pos inicial de la ficha en un estado dado del Tablero
	        		//System.out.println("numFichas " + numFichas);
	        		listaSucesores.addAll(posicionesValidasZorra(12, numjugador, 1, tipomesa));
	        	//}
	        }
    	}
    	else if (tipomesa == 5)
    	{
    		int cont = 0;
    		if (numjugador == 1)
	        {
	        	for (int i = 0; i < numFichas; i++)
	        	{
	        		// por cada ficha carga su lista de sucesores(indica 
	        		//las pos. validas desde la pos inicial de la ficha en un estado dado del Tablero
	        		
	        		if (tab.jugadores[numjugador - 1].fichas[i].activo){
	        			//System.out.println("listasucesores.addAll");
	        			listaSucesores.addAll(posicionesValidasOca(i, numjugador, numFichas, tipomesa));
	        			cont++;
	        			//System.out.println(i);
	        		}
	        	}
	        }
	        if (numjugador > 1) {
	        	//for (int i = 0; i < 1; i++)
	        	//{
	        		// por cada ficha carga su lista de sucesores(indica 
	        		//las pos. validas desde la pos inicial de la ficha en un estado dado del Tablero
	        		//System.out.println("numFichas " + numFichas);
	        		listaSucesores.addAll(posicionesValidasZorra(13, numjugador, 1, tipomesa));
	        	//}
	        }
    	}
    	else if (tipomesa == 6)
    	{
    		int cont = 0;
    		if (numjugador == 1)
	        {
	        	for (int i = 0; i < numFichas; i++)
	        	{
	        		// por cada ficha carga su lista de sucesores(indica 
	        		//las pos. validas desde la pos inicial de la ficha en un estado dado del Tablero
	        		
	        		if (tab.jugadores[numjugador - 1].fichas[i].activo){
	        			//System.out.println("listasucesores.addAll");
	        			listaSucesores.addAll(posicionesValidasOca(i, numjugador, numFichas, tipomesa));
	        			cont++;
	        			//System.out.println(i);
	        		}
	        	}
	        }
	        if (numjugador > 1) {
	        	//quito el bucle porque siempre es la ficha 21
	        	//for (int i = 0; i < 1; i++)
	        	//{
	        		// por cada ficha carga su lista de sucesores(indica 
	        		//las pos. validas desde la pos inicial de la ficha en un estado dado del Tablero
	        		//System.out.println("numFichas " + numFichas);
	        		listaSucesores.addAll(posicionesValidasZorra(21, numjugador, 1, tipomesa));
	        		//listaSucesores.addAll(posicionesValidasZorra(i, numjugador, 1, tipomesa));
	        	//}
	        }
    	}
    } 
    
    public LinkedList<Sucesor> posicionesValidasOca(int nficha, int njugador, int numFichas, int tipotabl)
    {
    	int ady;
    	int numcasilla;
    	int casAnterior;
    	tipomesa = tipotabl;
    	LinkedList<Sucesor> listaAux = new LinkedList<Sucesor>();
    	
    	//numcasilla=tab.jugadores[(njugador - 1)%ZorraGansos.numjugadores].fichas[nficha%numFichas].numcasilla;
    	//numcasilla=tab.jugadores[(njugador - 1)].fichas[nficha%numFichas].numcasilla;
    	if (tipomesa == 1)
    	{
	    	//numcasilla=tab.jugadores[(njugador - 1)].fichas[nficha%tab.jugadores[njugador - 1].numFichaTotal].numcasilla;
	    	numcasilla=tab.jugadores[(njugador - 1)].fichas[nficha].numcasilla;
	    	//System.out.println("numcasilla" + numcasilla + "nficha" + nficha);
	    	//for (int i= 3; i < 8; i++) //solo para abajo
	    	for (int i= 0; i < 8; i++) //para todos los sitios
	    	{
	    		//System.out.println("NumCasilla="+ numcasilla + " JAVIERRRRRRRRR " + i + " " + Cinco.adyacentes[numcasilla][i] + " ");
	    		ady = Cinco.adyacentes[numcasilla][i];
	    		if (ady != -1)
	    		{
	    			if (!tab.casillas[ady].ocupado) //Si la posicion esta ocupada, no se aņade
	    			{
	    				casAnterior = tab.jugadores[njugador - 1].fichas[nficha].numcasilla;
	                	
	
	                    tab.casillas[casAnterior].quitarFichaEnSeleccionada();                        
	                    tab.jugadores[njugador-1].fichas[nficha].cambiarCasilla(ady);
	                    tab.casillas[ady].colocarFichaEnCandidata(nficha, njugador);                       
	
	                    listaAux.add(new Sucesor(numNodo, nficha, numcasilla, ady, -1, 0, -1));
	                   
	                    tab.casillas[ady].quitarFichaEnSeleccionada();
	                    tab.jugadores[njugador - 1].fichas[nficha].cambiarCasilla(casAnterior);
	                    tab.casillas[casAnterior].colocarFichaEnCandidata(nficha, njugador);
	    			}
	    		}
	    	}
    	}
    	else if (tipomesa == 2)
    	{
    		numcasilla=tab.jugadores[(njugador - 1)].fichas[nficha%tab.jugadores[njugador - 1].numFichaTotal].numcasilla;

      //  	for (int i= 3; i < 8; i++) //solo para abajo
        	for (int i= 0; i < 8; i++) // para todos los sitios
        	{
        		//System.out.println("NumCasilla="+ numcasilla + " JAVIERRRRRRRRR " + i + " " + Cinco.adyacentes[numcasilla][i] + " ");
        		ady = SieteX.adyacentes[numcasilla][i];
        		if (ady != -1)
        		{
        			if (!tab.casillas[ady].ocupado) //Si la posicion esta ocupada, no se aņade
        			{
        				casAnterior = tab.jugadores[njugador - 1].fichas[nficha].numcasilla;
                    	

                        tab.casillas[casAnterior].quitarFichaEnSeleccionada();                        
                        tab.jugadores[njugador-1].fichas[nficha].cambiarCasilla(ady);
                        tab.casillas[ady].colocarFichaEnCandidata(nficha, njugador);                       

                        listaAux.add(new Sucesor(numNodo, nficha, numcasilla, ady, -1, 0, -1));
                       
                        tab.casillas[ady].quitarFichaEnSeleccionada();
                        tab.jugadores[njugador - 1].fichas[nficha].cambiarCasilla(casAnterior);
                        tab.casillas[casAnterior].colocarFichaEnCandidata(nficha, njugador);
        			}
        		}
        	}
    	}
    	else if (tipomesa == 3)
    	{
    			numcasilla=tab.jugadores[(njugador - 1)].fichas[nficha%tab.jugadores[njugador - 1].numFichaTotal].numcasilla;

    	      //  	for (int i= 3; i < 8; i++) //solo para abajo
    	        	for (int i= 0; i < 8; i++) // para todos los sitios
    	        	{
    	        		//System.out.println("NumCasilla="+ numcasilla + " JAVIERRRRRRRRR " + i + " " + Cinco.adyacentes[numcasilla][i] + " ");
    	        		ady = Cruz.adyacentes[numcasilla][i];
    	        		if (ady != -1)
    	        		{
    	        			if (!tab.casillas[ady].ocupado) //Si la posicion esta ocupada, no se aņade
    	        			{
    	        				casAnterior = tab.jugadores[njugador - 1].fichas[nficha].numcasilla;
    	                    	

    	                        tab.casillas[casAnterior].quitarFichaEnSeleccionada();                        
    	                        tab.jugadores[njugador-1].fichas[nficha].cambiarCasilla(ady);
    	                        tab.casillas[ady].colocarFichaEnCandidata(nficha, njugador);                       

    	                        listaAux.add(new Sucesor(numNodo, nficha, numcasilla, ady, -1, 0, -1));
    	                       
    	                        tab.casillas[ady].quitarFichaEnSeleccionada();
    	                        tab.jugadores[njugador - 1].fichas[nficha].cambiarCasilla(casAnterior);
    	                        tab.casillas[casAnterior].colocarFichaEnCandidata(nficha, njugador);
    	        			}
    	        		}
    	        	}
    	}
    	else if (tipomesa == 4)
    	{
    		//numcasilla=tab.jugadores[(njugador - 1)].fichas[nficha%tab.jugadores[njugador - 1].numFichaTotal].numcasilla;
	    	numcasilla=tab.jugadores[(njugador - 1)].fichas[nficha].numcasilla;
	    	//System.out.println("numcasilla" + numcasilla + "nficha" + nficha);
	    	//for (int i= 3; i < 8; i++) //solo para abajo
	    	for (int i= 0; i < 8; i++) //para todos los sitios
	    	{
	    		//System.out.println("NumCasilla="+ numcasilla + " JAVIERRRRRRRRR " + i + " " + Cinco.adyacentes[numcasilla][i] + " ");
	    		ady = Cinco_restri.adyacentes[numcasilla][i];
	    		if (ady != -1)
	    		{
	    			if (!tab.casillas[ady].ocupado) //Si la posicion esta ocupada, no se aņade
	    			{
	    				casAnterior = tab.jugadores[njugador - 1].fichas[nficha].numcasilla;
	                	
	
	                    tab.casillas[casAnterior].quitarFichaEnSeleccionada();                        
	                    tab.jugadores[njugador-1].fichas[nficha].cambiarCasilla(ady);
	                    tab.casillas[ady].colocarFichaEnCandidata(nficha, njugador);                       
	
	                    listaAux.add(new Sucesor(numNodo, nficha, numcasilla, ady, -1, 0, -1));
	                   
	                    tab.casillas[ady].quitarFichaEnSeleccionada();
	                    tab.jugadores[njugador - 1].fichas[nficha].cambiarCasilla(casAnterior);
	                    tab.casillas[casAnterior].colocarFichaEnCandidata(nficha, njugador);
	    			}
	    		}
	    	}
    	}
    	else if (tipomesa == 5)
    	{
    		numcasilla=tab.jugadores[(njugador - 1)].fichas[nficha%tab.jugadores[njugador - 1].numFichaTotal].numcasilla;

  	      //  	for (int i= 3; i < 8; i++) //solo para abajo
  	        	for (int i= 0; i < 8; i++) // para todos los sitios
  	        	{
  	        		//System.out.println("NumCasilla="+ numcasilla + " JAVIERRRRRRRRR " + i + " " + Cinco.adyacentes[numcasilla][i] + " ");
  	        		ady = Cruz_restri.adyacentes[numcasilla][i];
  	        		if (ady != -1)
  	        		{
  	        			if (!tab.casillas[ady].ocupado) //Si la posicion esta ocupada, no se aņade
  	        			{
  	        				casAnterior = tab.jugadores[njugador - 1].fichas[nficha].numcasilla;
  	                    	

  	                        tab.casillas[casAnterior].quitarFichaEnSeleccionada();                        
  	                        tab.jugadores[njugador-1].fichas[nficha].cambiarCasilla(ady);
  	                        tab.casillas[ady].colocarFichaEnCandidata(nficha, njugador);                       

  	                        listaAux.add(new Sucesor(numNodo, nficha, numcasilla, ady, -1, 0, -1));
  	                       
  	                        tab.casillas[ady].quitarFichaEnSeleccionada();
  	                        tab.jugadores[njugador - 1].fichas[nficha].cambiarCasilla(casAnterior);
  	                        tab.casillas[casAnterior].colocarFichaEnCandidata(nficha, njugador);
  	        			}
  	        		}
  	        	}
    	}
    	else if (tipomesa == 6)
    	{
    		numcasilla=tab.jugadores[(njugador - 1)].fichas[nficha%tab.jugadores[njugador - 1].numFichaTotal].numcasilla;

      //  	for (int i= 3; i < 8; i++) //solo para abajo
        	for (int i= 0; i < 8; i++) // para todos los sitios
        	{
        		//System.out.println("NumCasilla="+ numcasilla + " JAVIERRRRRRRRR " + i + " " + Cinco.adyacentes[numcasilla][i] + " ");
        		ady = SieteX_restri.adyacentes[numcasilla][i];
        		if (ady != -1)
        		{
        			if (!tab.casillas[ady].ocupado) //Si la posicion esta ocupada, no se aņade
        			{
        				casAnterior = tab.jugadores[njugador - 1].fichas[nficha].numcasilla;
                    	

                        tab.casillas[casAnterior].quitarFichaEnSeleccionada();                        
                        tab.jugadores[njugador-1].fichas[nficha].cambiarCasilla(ady);
                        tab.casillas[ady].colocarFichaEnCandidata(nficha, njugador);                       

                        listaAux.add(new Sucesor(numNodo, nficha, numcasilla, ady, -1, 0, -1));
                       
                        tab.casillas[ady].quitarFichaEnSeleccionada();
                        tab.jugadores[njugador - 1].fichas[nficha].cambiarCasilla(casAnterior);
                        tab.casillas[casAnterior].colocarFichaEnCandidata(nficha, njugador);
        			}
        		}
        	}
    	}
    	return listaAux;
    }
    
    public LinkedList<Sucesor> posicionesValidasZorra(int nficha, int njugador, int numFichas, int tipotabl)
    {
    	
    	int ady,ady2;
    	int numcasilla;
    	int casAnterior;
    	tipomesa = tipotabl;
    	LinkedList<Sucesor> listaAux = new LinkedList<Sucesor>();
    	
    	//numcasilla=tab.jugadores[(njugador - 1)%ZorraGansos.numjugadores].fichas[nficha%numFichas].numcasilla;
    	//System.out.println(njugador + " " + nficha + " lde " + numFichas + " " + (njugador - 1)%2);
    	
    	if (tipomesa == 1)
    	{
	    	//numcasilla= tab.jugadores[(njugador - 1)].fichas[nficha%numFichas].numcasilla;
	    	numcasilla= tab.jugadores[(njugador - 1)].fichas[nficha].numcasilla;

	    	for (int i= 0; i < 8; i++)
	    	{
	    		ady = Cinco.adyacentes[numcasilla][i];
	    		if (ady != -1)
	    		{
	    			if (!tab.casillas[ady].ocupado) //Si la posicion esta ocupada, no se aņade
	    			{
	    				casAnterior = tab.jugadores[njugador - 1].fichas[nficha].numcasilla;
	                	
	
	                    tab.casillas[casAnterior].quitarFichaEnSeleccionada();                        
	                    tab.jugadores[njugador-1].fichas[nficha].cambiarCasilla(ady);
	                    tab.casillas[ady].colocarFichaEnCandidata(nficha, njugador);                       
	
	                    listaAux.add(new Sucesor(numNodo, nficha, numcasilla, ady, -1, 0, -1));
	                   
	                    tab.casillas[ady].quitarFichaEnSeleccionada();
	                    tab.jugadores[njugador - 1].fichas[nficha].cambiarCasilla(casAnterior);
	                    tab.casillas[casAnterior].colocarFichaEnCandidata(nficha, njugador);
	    			}
	    		}
	    	}
	    	for (int i = 0; i < 8; i++)
	        {                
	            ady = Cinco.adyacentes[numcasilla][i];
	            if (ady != -1)
	            {
	                if (tab.casillas[ady].ocupado)
	                {
	                    ady2 = Cinco.adyacentes[ady][i];
	                    if ((ady2 != -1) && (!tab.casillas[ady2].ocupado))
	                    {
	                        casAnterior = tab.jugadores[(njugador - 1)%ZorraGansos.numjugadores].fichas[nficha].numcasilla;
	
	                        tab.casillas[casAnterior].quitarFichaEnSeleccionada();
	                        tab.jugadores[njugador - 1].fichas[nficha].cambiarCasilla(ady2);
	                        tab.casillas[ady2].colocarFichaEnCandidata(nficha, njugador);                            
	                        
	                        listaAux.add(new Sucesor(numNodo, nficha, numcasilla, ady2, -1, 1, -1, ady));
	                        
	                        tab.casillas[ady2].quitarFichaEnSeleccionada();
	                        tab.jugadores[njugador - 1].fichas[nficha].cambiarCasilla(casAnterior);
	                        tab.casillas[casAnterior].colocarFichaEnCandidata(nficha, njugador);
	                    }
	                }
	            }
	        }
	    	
    	}
    	else if (tipomesa == 2)
    	{
    		//aņadido nuevo 13/7/2011
    		numcasilla = 0;
    		System.out.println(nficha);
    		
    			//numcasilla= tab.jugadores[(njugador - 1)].fichas[nficha%numFichas].numcasilla;
        	
    			numcasilla= tab.jugadores[(njugador - 1)].fichas[nficha].numcasilla;

        	for (int i= 0; i < 8; i++)
        	{
        		ady = SieteX.adyacentes[numcasilla][i];
        		if (ady != -1)
        		{
        			if (!tab.casillas[ady].ocupado) //Si la posicion esta ocupada, no se aņade
        			{
        				casAnterior = tab.jugadores[njugador - 1].fichas[nficha].numcasilla;
                    	

                        tab.casillas[casAnterior].quitarFichaEnSeleccionada();                        
                        tab.jugadores[njugador-1].fichas[nficha].cambiarCasilla(ady);
                        tab.casillas[ady].colocarFichaEnCandidata(nficha, njugador);                       

                        listaAux.add(new Sucesor(numNodo, nficha, numcasilla, ady, -1, 0, -1));
                       
                        tab.casillas[ady].quitarFichaEnSeleccionada();
                        tab.jugadores[njugador - 1].fichas[nficha].cambiarCasilla(casAnterior);
                        tab.casillas[casAnterior].colocarFichaEnCandidata(nficha, njugador);
        			}
        		}
        	}
        	for (int i = 0; i < 8; i++)
            {                
                ady = SieteX.adyacentes[numcasilla][i];
                if (ady != -1)
                {
                    if (tab.casillas[ady].ocupado)
                    {
                        ady2 = SieteX.adyacentes[ady][i];
                        if ((ady2 != -1) && (!tab.casillas[ady2].ocupado))
                        {
                            casAnterior = tab.jugadores[(njugador - 1)%ZorraGansos.numjugadores].fichas[nficha].numcasilla;

                            tab.casillas[casAnterior].quitarFichaEnSeleccionada();
                            tab.jugadores[njugador - 1].fichas[nficha].cambiarCasilla(ady2);
                            tab.casillas[ady2].colocarFichaEnCandidata(nficha, njugador);                            
                            
                            //listaAux.add(new Sucesor(numNodo, nficha, numcasilla, ady2, -1, 1, -1));
                            listaAux.add(new Sucesor(numNodo, nficha, numcasilla, ady2, -1, 1, -1, ady));

                            tab.casillas[ady2].quitarFichaEnSeleccionada();
                            tab.jugadores[njugador - 1].fichas[nficha].cambiarCasilla(casAnterior);
                            tab.casillas[casAnterior].colocarFichaEnCandidata(nficha, njugador);
                        }
                    }
                }
            }
        	
    	}
    	else if (tipomesa == 3)
    	{
    		//numcasilla= tab.jugadores[(njugador - 1)].fichas[nficha%numFichas].numcasilla;
    		numcasilla= tab.jugadores[(njugador - 1)].fichas[nficha].numcasilla;

        	for (int i= 0; i < 8; i++)
        	{
        		ady = Cruz.adyacentes[numcasilla][i];
        		if (ady != -1)
        		{
        			if (!tab.casillas[ady].ocupado) //Si la posicion esta ocupada, no se aņade
        			{
        				casAnterior = tab.jugadores[njugador - 1].fichas[nficha].numcasilla;
                    	

                        tab.casillas[casAnterior].quitarFichaEnSeleccionada();                        
                        tab.jugadores[njugador-1].fichas[nficha].cambiarCasilla(ady);
                        tab.casillas[ady].colocarFichaEnCandidata(nficha, njugador);                       

                        listaAux.add(new Sucesor(numNodo, nficha, numcasilla, ady, -1, 0, -1));
                       
                        tab.casillas[ady].quitarFichaEnSeleccionada();
                        tab.jugadores[njugador - 1].fichas[nficha].cambiarCasilla(casAnterior);
                        tab.casillas[casAnterior].colocarFichaEnCandidata(nficha, njugador);
        			}
        		}
        	}
        	for (int i = 0; i < 8; i++)
            {                
                ady = Cruz.adyacentes[numcasilla][i];
                if (ady != -1)
                {
                    if (tab.casillas[ady].ocupado)
                    {
                        ady2 = Cruz.adyacentes[ady][i];
                        if ((ady2 != -1) && (!tab.casillas[ady2].ocupado))
                        {
                            casAnterior = tab.jugadores[(njugador - 1)%ZorraGansos.numjugadores].fichas[nficha].numcasilla;

                            tab.casillas[casAnterior].quitarFichaEnSeleccionada();
                            tab.jugadores[njugador - 1].fichas[nficha].cambiarCasilla(ady2);
                            tab.casillas[ady2].colocarFichaEnCandidata(nficha, njugador);                            
                            
                            listaAux.add(new Sucesor(numNodo, nficha, numcasilla, ady2, -1, 1, -1, ady));
                            
                            tab.casillas[ady2].quitarFichaEnSeleccionada();
                            tab.jugadores[njugador - 1].fichas[nficha].cambiarCasilla(casAnterior);
                            tab.casillas[casAnterior].colocarFichaEnCandidata(nficha, njugador);
                        }
                    }
                }
            }
        	
    	}
    	else if (tipomesa == 4)
    	{
    		//numcasilla= tab.jugadores[(njugador - 1)].fichas[nficha%numFichas].numcasilla;
	    	numcasilla= tab.jugadores[(njugador - 1)].fichas[nficha].numcasilla;

	    	for (int i= 0; i < 8; i++)
	    	{
	    		ady = Cinco_restri.adyacentes[numcasilla][i];
	    		if (ady != -1)
	    		{
	    			if (!tab.casillas[ady].ocupado) //Si la posicion esta ocupada, no se aņade
	    			{
	    				casAnterior = tab.jugadores[njugador - 1].fichas[nficha].numcasilla;
	                	
	
	                    tab.casillas[casAnterior].quitarFichaEnSeleccionada();                        
	                    tab.jugadores[njugador-1].fichas[nficha].cambiarCasilla(ady);
	                    tab.casillas[ady].colocarFichaEnCandidata(nficha, njugador);                       
	
	                    listaAux.add(new Sucesor(numNodo, nficha, numcasilla, ady, -1, 0, -1));
	                   
	                    tab.casillas[ady].quitarFichaEnSeleccionada();
	                    tab.jugadores[njugador - 1].fichas[nficha].cambiarCasilla(casAnterior);
	                    tab.casillas[casAnterior].colocarFichaEnCandidata(nficha, njugador);
	    			}
	    		}
	    	}
	    	for (int i = 0; i < 8; i++)
	        {                
	            ady = Cinco_restri.adyacentes[numcasilla][i];
	            if (ady != -1)
	            {
	                if (tab.casillas[ady].ocupado)
	                {
	                    ady2 = Cinco_restri.adyacentes[ady][i];
	                    if ((ady2 != -1) && (!tab.casillas[ady2].ocupado))
	                    {
	                        casAnterior = tab.jugadores[(njugador - 1)%ZorraGansos.numjugadores].fichas[nficha].numcasilla;
	
	                        tab.casillas[casAnterior].quitarFichaEnSeleccionada();
	                        tab.jugadores[njugador - 1].fichas[nficha].cambiarCasilla(ady2);
	                        tab.casillas[ady2].colocarFichaEnCandidata(nficha, njugador);                            
	                        
	                        listaAux.add(new Sucesor(numNodo, nficha, numcasilla, ady2, -1, 1, -1, ady));
	                        
	                        tab.casillas[ady2].quitarFichaEnSeleccionada();
	                        tab.jugadores[njugador - 1].fichas[nficha].cambiarCasilla(casAnterior);
	                        tab.casillas[casAnterior].colocarFichaEnCandidata(nficha, njugador);
	                    }
	                }
	            }
	        }
	    	
    	}
    	else if (tipomesa == 5)
    	{
    		//numcasilla= tab.jugadores[(njugador - 1)].fichas[nficha%numFichas].numcasilla;
    		numcasilla= tab.jugadores[(njugador - 1)].fichas[nficha].numcasilla;

        	for (int i= 0; i < 8; i++)
        	{
        		ady = Cruz_restri.adyacentes[numcasilla][i];
        		if (ady != -1)
        		{
        			if (!tab.casillas[ady].ocupado) //Si la posicion esta ocupada, no se aņade
        			{
        				casAnterior = tab.jugadores[njugador - 1].fichas[nficha].numcasilla;
                    	

                        tab.casillas[casAnterior].quitarFichaEnSeleccionada();                        
                        tab.jugadores[njugador-1].fichas[nficha].cambiarCasilla(ady);
                        tab.casillas[ady].colocarFichaEnCandidata(nficha, njugador);                       

                        listaAux.add(new Sucesor(numNodo, nficha, numcasilla, ady, -1, 0, -1));
                       
                        tab.casillas[ady].quitarFichaEnSeleccionada();
                        tab.jugadores[njugador - 1].fichas[nficha].cambiarCasilla(casAnterior);
                        tab.casillas[casAnterior].colocarFichaEnCandidata(nficha, njugador);
        			}
        		}
        	}
        	for (int i = 0; i < 8; i++)
            {                
                ady = Cruz_restri.adyacentes[numcasilla][i];
                if (ady != -1)
                {
                    if (tab.casillas[ady].ocupado)
                    {
                        ady2 = Cruz_restri.adyacentes[ady][i];
                        if ((ady2 != -1) && (!tab.casillas[ady2].ocupado))
                        {
                            casAnterior = tab.jugadores[(njugador - 1)%ZorraGansos.numjugadores].fichas[nficha].numcasilla;

                            tab.casillas[casAnterior].quitarFichaEnSeleccionada();
                            tab.jugadores[njugador - 1].fichas[nficha].cambiarCasilla(ady2);
                            tab.casillas[ady2].colocarFichaEnCandidata(nficha, njugador);                            
                            
                            listaAux.add(new Sucesor(numNodo, nficha, numcasilla, ady2, -1, 1, -1, ady));
                            
                            tab.casillas[ady2].quitarFichaEnSeleccionada();
                            tab.jugadores[njugador - 1].fichas[nficha].cambiarCasilla(casAnterior);
                            tab.casillas[casAnterior].colocarFichaEnCandidata(nficha, njugador);
                        }
                    }
                }
            }
        	
    	}
    	else if (tipomesa == 6)
    	{
    		//aņadido nuevo 13/7/2011
    		numcasilla = 0;
    		System.out.println(nficha);
    		
    			//numcasilla= tab.jugadores[(njugador - 1)].fichas[nficha%numFichas].numcasilla;
        	
    			numcasilla= tab.jugadores[(njugador - 1)].fichas[nficha].numcasilla;

        	for (int i= 0; i < 8; i++)
        	{
        		ady = SieteX_restri.adyacentes[numcasilla][i];
        		if (ady != -1)
        		{
        			if (!tab.casillas[ady].ocupado) //Si la posicion esta ocupada, no se aņade
        			{
        				casAnterior = tab.jugadores[njugador - 1].fichas[nficha].numcasilla;
                    	

                        tab.casillas[casAnterior].quitarFichaEnSeleccionada();                        
                        tab.jugadores[njugador-1].fichas[nficha].cambiarCasilla(ady);
                        tab.casillas[ady].colocarFichaEnCandidata(nficha, njugador);                       

                        listaAux.add(new Sucesor(numNodo, nficha, numcasilla, ady, -1, 0, -1));
                       
                        tab.casillas[ady].quitarFichaEnSeleccionada();
                        tab.jugadores[njugador - 1].fichas[nficha].cambiarCasilla(casAnterior);
                        tab.casillas[casAnterior].colocarFichaEnCandidata(nficha, njugador);
        			}
        		}
        	}
        	for (int i = 0; i < 8; i++)
            {                
                ady = SieteX_restri.adyacentes[numcasilla][i];
                if (ady != -1)
                {
                    if (tab.casillas[ady].ocupado)
                    {
                        ady2 = SieteX_restri.adyacentes[ady][i];
                        if ((ady2 != -1) && (!tab.casillas[ady2].ocupado))
                        {
                            casAnterior = tab.jugadores[(njugador - 1)%ZorraGansos.numjugadores].fichas[nficha].numcasilla;

                            tab.casillas[casAnterior].quitarFichaEnSeleccionada();
                            tab.jugadores[njugador - 1].fichas[nficha].cambiarCasilla(ady2);
                            tab.casillas[ady2].colocarFichaEnCandidata(nficha, njugador);                            
                            
                            //listaAux.add(new Sucesor(numNodo, nficha, numcasilla, ady2, -1, 1, -1));
                            listaAux.add(new Sucesor(numNodo, nficha, numcasilla, ady2, -1, 1, -1, ady));

                            tab.casillas[ady2].quitarFichaEnSeleccionada();
                            tab.jugadores[njugador - 1].fichas[nficha].cambiarCasilla(casAnterior);
                            tab.casillas[casAnterior].colocarFichaEnCandidata(nficha, njugador);
                        }
                    }
                }
            }
        	
    	}
    	
    	return listaAux;
    }
   
}
  
    

