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; }
/// 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"); //} }
public Estado(Estado original) { this.mapa = original.Mapa; this.matrizCajas = (MatrizCajas)original.MatrizCajas.Clone(); this.posTipito = new Point((Size)original.PosTipito); }
public Mapa(byte ancho, byte alto) { lugares = new Lugares(ancho, alto); estadoActual = new Estado(this); }