private double Heuristica(Terreno terreno) { var heuristica = Math.Abs(_inicio.x - terreno.x) + Math.Abs(_inicio.y - terreno.y); if (terreno.tipo == TipoTerreno.BaseInimiga) { var baseInimiga = (BaseInimiga)terreno; return(heuristica + baseInimiga.dificuldade / 1.3); } return(heuristica); }
void DesenhaCaminho(PaintEventArgs e) { Func <int, int> f = d => d * _tamanhoDoQuadrado; if (_caminho != null && _caminho.Count > 1) { for (int i = 0; i < _caminho.Count; i++) { Terreno o = _caminho[i]; e.Graphics.FillRectangle ( new SolidBrush(Color.FromArgb(128, Color.BlueViolet)), f(o.x), f(o.y), _tamanhoDoQuadrado, _tamanhoDoQuadrado ); } } }
private void RodaPrograma() { var grafo = CriaGrafoDoMapa(); _inicio = grafo.PegarVertices().Single(node => node.tipo == TipoTerreno.Inicial); var fim = grafo.PegarVertices().Single(node => node.tipo == TipoTerreno.Final); CheckForIllegalCrossThreadCalls = false; Task.Run(() => { _stopWatch = new Stopwatch(); _stopWatch.Start(); grafo.AEstrela(_inicio, fim, Heuristica, (caminho, pontuacao) => { _caminho = caminho; _pontuacaoAEstrela = pontuacao; Refresh(); Thread.Sleep(8); }); //Refresh(); RodaGa(); }); }