public static int GetDiretion(AStarLocation current, AStarLocation dest) { bool ehEmX = true; int diretion = dest.X - current.X; if (diretion == 0) { diretion = dest.Y - current.Y; ehEmX = false; } switch (diretion) { case -1: if (ehEmX) { diretion = 4; } else { diretion = 1; } break; case 1: if (ehEmX) { diretion = 2; } else { diretion = 3; } break; } return(diretion); }
public static AStarLocation NextFromAStar(AStarLocation origem, AStarLocation destino) { /* * TEM UMA INEFICIÊNCIA, POIS NÃO BUSCA DE FATO O MELHOR NEXT GERAL * FALHEI NA TEORIA DO A* AQUI */ var listaAberta = new List <AStarLocation>(); var listaFechada = new List <AStarLocation>(); int g = 0; //inicio colocando a origem na lista aberta listaAberta.Add(origem); origem.Parent = null; AStarLocation menor = null; while (g < 2) { menor = listaAberta.OrderBy(x => x.F).ToList()[0]; listaFechada.Add(menor); listaAberta.Remove(menor); var adjs = GetWalkableAdjacentSquares(menor.X, menor.Y); g++; if (adjs.Count == 0) { break; } if (menor.X == destino.X && menor.Y == destino.Y) { return(menor); } foreach (var adj in adjs) { bool jaTemLstFechada = false; foreach (var item in listaFechada) { if (item.X == adj.X && item.Y == adj.Y) { jaTemLstFechada = true; break; } } if (jaTemLstFechada) { continue; } bool jaTemLstAberta = false; foreach (var item in listaAberta) { if (item.X == adj.X && item.Y == adj.Y) { jaTemLstAberta = true; break; } } if (jaTemLstAberta) { if (g + adj.H < adj.F) { adj.G = g; adj.F = adj.G + adj.H; adj.Parent = menor; } } else { adj.Parent = menor; adj.G = g; adj.H = ManhatthanDistance(adj.X, adj.Y, destino.X, destino.Y); adj.F = adj.G + adj.H; listaAberta.Add(adj); } } } return(menor); }
public static List <AStarLocation> AStarAlg(AStarLocation origem, AStarLocation destino) { var listaAberta = new List <AStarLocation>(); var listaFechada = new List <AStarLocation>(); int g = 0; //inicio colocando a origem na lista aberta listaAberta.Add(origem); origem.Parent = null; AStarLocation menor = null; while (listaAberta.Count != 0) { menor = listaAberta.OrderBy(x => x.F).ToList()[0]; listaFechada.Add(menor); listaAberta.Remove(menor); var adjs = GetWalkableAdjacentSquares(menor.X, menor.Y); g++; if (menor.X == destino.X && menor.Y == destino.Y) { var caminho = new List <AStarLocation>(); while (menor.Parent != null) { caminho.Add(menor); menor = menor.Parent; } caminho.Add(menor); caminho.Reverse(); return(caminho); } foreach (var adj in adjs) { bool jaTemLstFechada = false; foreach (var item in listaFechada) { if (item.X == adj.X && item.Y == adj.Y) { jaTemLstFechada = true; break; } } if (jaTemLstFechada) { continue; } bool jaTemLstAberta = false; foreach (var item in listaAberta) { if (item.X == adj.X && item.Y == adj.Y) { jaTemLstAberta = true; break; } } if (jaTemLstAberta) { if (g + adj.H < adj.F) { adj.G = g; adj.F = adj.G + adj.H; adj.Parent = menor; } } else { adj.Parent = menor; adj.G = g; adj.H = ManhatthanDistance(adj.X, adj.Y, destino.X, destino.Y); adj.F = adj.G + adj.H; listaAberta.Add(adj); } } } return(null); }