private void GerarNosFilhos() { Nodo gerado; //Adjacente Norte if (Atual.Y - 1 >= 0) { gerado = new Nodo(Atual.X, Atual.Y - 1); if (!Expandidos.Contains(gerado) && !Bloqueados.Contains(gerado) && !Gerados.Contains(gerado)) { gerado.Peso = VerificarCusto(gerado, false); Gerados.Add(gerado); if (VerificarEstadoFinal()) { return; } } } //Adjacente Nordeste if (Atual.X < Grid.GetUpperBound(0)) { if (Atual.Y - 1 >= 0) { gerado = new Nodo(Atual.X + 1, Atual.Y - 1); if (!Expandidos.Contains(gerado) && !Bloqueados.Contains(gerado) && !Gerados.Contains(gerado)) { gerado.Peso = VerificarCusto(gerado, true); Gerados.Add(gerado); if (VerificarEstadoFinal()) { return; } } } } //Adjacente Leste if (Atual.X < Grid.GetUpperBound(0)) { gerado = new Nodo(Atual.X + 1, Atual.Y); if (!Expandidos.Contains(gerado) && !Bloqueados.Contains(gerado) && !Gerados.Contains(gerado)) { gerado.Peso = VerificarCusto(gerado, false); Gerados.Add(gerado); if (VerificarEstadoFinal()) { return; } } } //Adjacente Sudeste if (Atual.X < Grid.GetUpperBound(0)) { if (Atual.Y < Grid.GetUpperBound(1)) { gerado = new Nodo(Atual.X + 1, Atual.Y + 1); if (!Expandidos.Contains(gerado) && !Bloqueados.Contains(gerado) && !Gerados.Contains(gerado)) { gerado.Peso = VerificarCusto(gerado, true); Gerados.Add(gerado); if (VerificarEstadoFinal()) { return; } } } } //Adjacente Sul if (Atual.Y < Grid.GetUpperBound(1)) { gerado = new Nodo(Atual.X, Atual.Y + 1); if (!Expandidos.Contains(gerado) && !Bloqueados.Contains(gerado) && !Gerados.Contains(gerado)) { gerado.Peso = VerificarCusto(gerado, false); Gerados.Add(gerado); if (VerificarEstadoFinal()) { return; } } } //Adjacente Sudoeste if (Atual.X - 1 >= 0) { if (Atual.Y < Grid.GetUpperBound(1)) { gerado = new Nodo(Atual.X - 1, Atual.Y + 1); if (!Expandidos.Contains(gerado) && !Bloqueados.Contains(gerado) && !Gerados.Contains(gerado)) { gerado.Peso = VerificarCusto(gerado, true); Gerados.Add(gerado); if (VerificarEstadoFinal()) { return; } } } } //Adjancente Oeste if (Atual.X - 1 >= 0) { gerado = new Nodo(Atual.X - 1, Atual.Y); if (!Expandidos.Contains(gerado) && !Bloqueados.Contains(gerado) && !Gerados.Contains(gerado)) { gerado.Peso = VerificarCusto(gerado, false); Gerados.Add(gerado); if (VerificarEstadoFinal()) { return; } } } //Adjacente Noroeste if (Atual.X - 1 >= 0) { if (Atual.Y - 1 >= 0) { gerado = new Nodo(Atual.X - 1, Atual.Y - 1); if (!Expandidos.Contains(gerado) && !Bloqueados.Contains(gerado) && !Gerados.Contains(gerado)) { gerado.Peso = VerificarCusto(gerado, true); Gerados.Add(gerado); if (VerificarEstadoFinal()) { return; } } } } }
public AEstrelaPathfind(int alturaGrid, int larguraGrid, IList <Nodo> bloqueados, Nodo inicial, Nodo destino, decimal custoDiagonal, decimal custoVerticalHorizontal) { AlturaGrid = alturaGrid; LarguraGrid = larguraGrid; Grid = new decimal[LarguraGrid, AlturaGrid]; Bloqueados = bloqueados; Inicial = inicial; Destino = destino; Atual = inicial; CustoDiagonal = custoDiagonal; CustoVerticalHorizontal = custoVerticalHorizontal; Gerados = new List <Nodo> { Atual }; Expandidos = new List <Nodo>(); }