Beispiel #1
0
 public static bool crear(out Movida movida, Estado estado, Direccion direccion)
 {
     movida = null;
     Point posDest;
     if (!estado.Mapa.vecino(out posDest, estado.PosTipito, direccion))
         return false;
     movida = new Movida(TipoObjeto.Tipito, direccion, estado.PosTipito, posDest);
     if (!estado.pasable(posDest))
     {
         if (!estado.MatrizCajas[posDest])
             return false;
         Point posFinal;
         if (!estado.Mapa.vecino(out posFinal, posDest, direccion))
             return false;
         movida.SubMovida = new Movida(TipoObjeto.Caja, direccion, posDest, posFinal);
         if (!estado.pasable(movida.SubMovida.PosFinal))
             return false;
     }
     return true;
 }
Beispiel #2
0
 /// Devuelve:
 /// * La lista de movidas usadas para llegar a la solucion.
 public static Queue resolver(Analizador analizador, Estado estadoInicial)
 {
     //using (IALogger logger = new IALogger())
     //{
     //    logger.WriteLine("---COMIENZO---");
     int initCapacity = analizador.Mapa.Lugares.Count * 3;
     Queue estadosPorVisitar = new Queue(initCapacity, 3.0f);
     Hashtable tablaMovidas = new Hashtable(initCapacity, 0.5f);
     tablaMovidas.Add(estadoInicial, new Queue());
     estadosPorVisitar.Enqueue(estadoInicial);
     while (estadosPorVisitar.Count > 0)
     {
         Estado estadoActual = (Estado)estadosPorVisitar.Dequeue();
         if (estadoActual.MapaTerminado())
         {
             return (Queue)tablaMovidas[estadoActual];
         }
         for (int nDir = 0; nDir < 4; nDir++)
         {
             Direccion direccion = Direccion.todas[nDir];
             Movida movida;
             if (!Movida.crear(out movida, estadoActual, direccion))
                 continue;
             Estado estadoProximo = (Estado)estadoActual.Clone();
             estadoProximo.realizarMovida(movida);
             if (!tablaMovidas.ContainsKey(estadoProximo))
             {
                 if (!esEstupida(movida, analizador))
                 {
                     estadosPorVisitar.Enqueue(estadoProximo);
                     Queue listaMovidas = (Queue)((Queue)tablaMovidas[estadoActual]).Clone();
                     listaMovidas.Enqueue(movida);
                     tablaMovidas.Add(estadoProximo, listaMovidas);
                 }
             }
         }
     }
     //    logger.WriteLine("El mapa no tiene solucion");
     throw new ErrorSokoVen("El mapa no tiene solucion");
     //}
 }
Beispiel #3
0
 public Estado(Estado original)
 {
     this.mapa = original.Mapa;
     this.matrizCajas = (MatrizCajas)original.MatrizCajas.Clone();
     this.posTipito = new Point((Size)original.PosTipito);
 }
Beispiel #4
0
 public Mapa(byte ancho, byte alto)
 {
     lugares = new Lugares(ancho, alto);
     estadoActual = new Estado(this);
 }