Пример #1
0
        // ノードを展開する
        private void OpenNode(Vector2Int bestCoordinates, List <Vector2Int> lockList)
        {
            Vector2Int[] crossCoordinates =
            {
                bestCoordinates.AddX(1),
                bestCoordinates.AddX(-1),
                bestCoordinates.AddY(1),
                bestCoordinates.AddY(-1)
            };

            foreach (var v in crossCoordinates)
            {
                if (!(v.x >= 0 && v.x < fieldSize.x & v.y >= 0 && v.y < fieldSize.y))
                {
                    continue;
                }
                if (lockList.Contains(v))
                {
                    continue;
                }

                var previousScore    = nodes[v.x, v.y].GetScore();
                var previousMoveCost = nodes[v.x, v.y].MoveCost;
                nodes[v.x, v.y].SetMoveCost(nodes[bestCoordinates.x, bestCoordinates.y].MoveCost + 1);

                if (openCoordinates.Contains(v))
                {
                    if (nodes[v.x, v.y].GetScore() < previousScore)
                    {
                        nodes[v.x, v.y].SetFromCoordinates(bestCoordinates);
                    }
                    else
                    {
                        nodes[v.x, v.y].SetMoveCost(previousMoveCost);
                    }
                }
                else if (closeCoordinates.Contains(v))
                {
                    if (nodes[v.x, v.y].GetScore() < previousScore)
                    {
                        closeCoordinates.Remove(v);
                        openCoordinates.Add(v);
                        nodes[v.x, v.y].SetFromCoordinates(bestCoordinates);
                    }
                    else
                    {
                        nodes[v.x, v.y].SetMoveCost(previousMoveCost);
                    }
                }
                else
                {
                    nodes[v.x, v.y].SetFromCoordinates(bestCoordinates);
                    openCoordinates.Add(v);
                }
            }

            openCoordinates.Remove(bestCoordinates);
            closeCoordinates.Add(bestCoordinates);
        }