Пример #1
0
 public void clear()
 {
     pf_container[,] cont = new pf_container[razm, razm];
     for (int i = 0; i < razm; i++)
     {
         for (int j = 0; j < razm; j++)
         {
             cont[i, j] = new pf_container(mass[i, j], new indexv2(i, j));
         }
     }
     foreach (pf_container node in cont)
     {
         if (node.go.GetComponent <Square>().color != 1)
         {
             node.go.GetComponent <Square>().color = 0;
         }
     }
 }
Пример #2
0
    public void start_calc()
    {
        Debug.Log("start2");
        pf_container[,] cont = new pf_container[razm, razm];
        for (int i = 0; i < razm; i++)
        {
            for (int j = 0; j < razm; j++)
            {
                cont[i, j] = new pf_container(mass[i, j], new indexv2(i, j));
            }
        }
        pf        p    = new pf();
        ArrayList path = p.calc(cont, new indexv2(6, 6), new indexv2(34, 34));

        foreach (pf_container node in path)
        {
            node.go.GetComponent <Square>().color = 4;
        }
    }
Пример #3
0
    public ArrayList calc(pf_container[,] scont, indexv2 sstartpoint, indexv2 sendpoint)
    {
        ArrayList open   = new ArrayList();
        ArrayList closed = new ArrayList();
        ArrayList path   = new ArrayList();
        bool      win    = false;

        //задаем начальную точку
        open.Add(scont[sstartpoint.x, sstartpoint.y]);
        (open[0] as pf_container).mincost = 0f;
        (open[0] as pf_container).hcost   = dist2(sstartpoint, sendpoint);
        (open[0] as pf_container).fincost = (open[0] as pf_container).mincost +
                                            (open[0] as pf_container).hcost;

        while (open.Count != 0)
        {
            pf_container min_item = open[0] as pf_container;
            #region ищем минимальное значение
            float min = float.MaxValue;


            for (int i = 0; i < open.Count; i++)
            {
                if ((open[i] as pf_container).fincost < min)
                {
                    min_item = open[i] as pf_container;
                    min      = min_item.fincost;
                }
            }
            #endregion

            open.Remove(min_item);
            closed.Add(min_item);


            foreach (pf_container sosed in allnear(scont, min_item.ind))
            {
                if (!sosed.ini)                 //если не инициирован, то инициируем
                {
                    if (sosed.ind == sendpoint) //если таргет
                    {
                        win          = true;
                        sosed.parent = min_item;
                        break;
                    }
                    sosed.ini = true;
                    if (sosed.go.GetComponent <Square>().color == 1)
                    {
                        sosed.isbrick = true;
                    }
                    else
                    {
                        sosed.mincost = min_item.mincost + dist2(min_item.ind, sosed.ind);
                        sosed.hcost   = dist2(sosed.ind, sendpoint);
                        sosed.fincost = sosed.hcost + sosed.mincost;
                        sosed.parent  = min_item;
                    }
                }
                if (!sosed.isbrick) //если стенка, то пропускаем
                {
                    float d = min_item.mincost + dist2(min_item.ind, sosed.ind);
                    if (d < sosed.mincost)
                    {
                        sosed.parent  = min_item;
                        sosed.mincost = d;
                        sosed.fincost = sosed.hcost + sosed.mincost;
                    }
                    if (!closed.Contains(sosed))//если уже прошлись, то пропускаем
                    {
                        if (!open.Contains(sosed))
                        {
                            open.Add(sosed);
                        }
                    }
                }
            }
            if (win)
            {
                break;
            }
        }

        if (!win)
        {
            return(path);
        }

        pf_container cur = scont[sendpoint.x, sendpoint.y];
        while (cur.parent != scont[sstartpoint.x, sstartpoint.y])
        {
            path.Add(cur);
            cur = cur.parent;
        }

        path.Add(cur);
        cur = cur.parent;
        path.Add(cur);

        foreach (pf_container node in open)
        {
            node.go.GetComponent <Square>().color = 2;
        }

        foreach (pf_container node in closed)
        {
            node.go.GetComponent <Square>().color = 3;
        }

        return(path);
    }