Пример #1
0
        public static void DrawGizmosGrid <T>(UnityGrid <T> grid)
        {
            Gizmos.color = grid.Color;

            Rect rect = new Rect(grid.Position - grid.WorldSize / 2, grid.WorldSize);

            Vector2 startLine = rect.min;
            Vector2 endLine   = new Vector2(rect.xMin, rect.yMax);
            Vector2 step      = new Vector2(grid.CaseSize, 0);

            for (int i = 0; i <= grid.width; i++)
            {
                Gizmos.DrawLine(startLine, endLine);

                startLine += step;
                endLine   += step;
            }

            startLine = rect.min;
            endLine   = new Vector2(rect.xMax, rect.yMin);
            step      = new Vector2(0, grid.CaseSize);

            for (int i = 0; i <= grid.height; i++)
            {
                Gizmos.DrawLine(startLine, endLine);

                startLine += step;
                endLine   += step;
            }
        }
 private void Start()
 {
     grid = FindObjectOfType <UnityGrid>();
 }
        /// <summary>
        /// Evaluate the grid's tiles and update for a new valid connection if possible.
        /// </summary>
        /// <param name="grid">The grid to be evaluated.</param>
        public void Evaluate(UnityGrid grid)
        {
            if (grid.State == UnityGrid.GridStates.Unsolved)
            {
                //Check for valid starting tile before checking the grid and connect it if necessary
                if (grid.CableTileGrid[0, 0].GetComponent <UnityCableTile>().cableTile.Cable.Nodes[0].IsValid)
                {
                    if (grid.CableTileGrid[0, 0].GetComponent <UnityCableTile>().CableState != CableTile.CableStates.Connected)
                    {
                        grid.CableTileGrid[0, 0].GetComponent <UnityCableTile>().CableState = CableTile.CableStates.Connected;
                        grid.LastConnectedTile = grid.CableTileGrid[0, 0];
                    }
                    else
                    {
                        UnityCableTile lastConnectedTile = grid.LastConnectedTile.GetComponent <UnityCableTile>();

                        //i - vertical, j - horizontal
                        for (int i = 0; i < grid.CableTileGrid.GetLength(0); i++)
                        {
                            for (int j = 0; j < grid.CableTileGrid.GetLength(1); j++)
                            {
                                if (grid.CableTileGrid[i, j].GetComponent <UnityCableTile>() == lastConnectedTile)
                                {
                                    //Check if this is the EndTile and mark Solved IF it has a valid Right
                                    if (grid.CableTileGrid[i, j] == grid.CableTileGrid[grid.CableTileGrid.GetLength(0) - 1, grid.CableTileGrid.GetLength(1) - 1] &&
                                        grid.CableTileGrid[i, j].GetComponent <UnityCableTile>().cableTile.Cable.Nodes[2].IsValid == true)
                                    {
                                        grid.State = UnityGrid.GridStates.Solved;
                                        Debug.Log("Solved!");
                                    }

                                    //Check Tile to Right
                                    else if (CanConnectRight(i, j))
                                    {
                                        grid.CableTileGrid[i, j + 1].GetComponent <UnityCableTile>().CableState = CableTile.CableStates.Connected;
                                        grid.LastConnectedTile = grid.CableTileGrid[i, j + 1];
                                    }
                                    //Check Tile to Bottom
                                    else if (CanConnectBottom(i, j))
                                    {
                                        grid.CableTileGrid[i + 1, j].GetComponent <UnityCableTile>().CableState = CableTile.CableStates.Connected;
                                        grid.LastConnectedTile = grid.CableTileGrid[i + 1, j];
                                    }
                                    //Check Tile to Top
                                    else if (CanConnectTop(i, j))
                                    {
                                        grid.CableTileGrid[i - 1, j].GetComponent <UnityCableTile>().CableState = CableTile.CableStates.Connected;
                                        grid.LastConnectedTile = grid.CableTileGrid[i - 1, j];
                                    }
                                    //Check Tile to Left
                                    else if (CanConnectLeft(i, j))
                                    {
                                        grid.CableTileGrid[i, j - 1].GetComponent <UnityCableTile>().CableState = CableTile.CableStates.Connected;
                                        grid.LastConnectedTile = grid.CableTileGrid[i, j - 1];
                                    }
                                }
                            }
                        }
                    }
                }
            }

            #region Surrounding-Tile Checkers
            bool CanConnectRight(int i, int j)
            {
                //Return false Immediately if it goes beyond grid bounds.
                if (j + 1 > grid.CableTileGrid.GetLength(1) - 1)
                {
                    return(false);
                }
                if (grid.CableTileGrid[i, j].GetComponent <UnityCableTile>().cableTile.Cable.Nodes[2].IsValid &&
                    grid.CableTileGrid[i, j + 1].GetComponent <UnityCableTile>().cableTile.Cable.Nodes[0].IsValid &&
                    grid.CableTileGrid[i, j + 1].GetComponent <UnityCableTile>().CableState == CableTile.CableStates.Revealed)
                {
                    return(true);
                }

                return(false);
            }

            bool CanConnectBottom(int i, int j)
            {
                //Return false Immediately if it goes beyond grid bounds.
                if (i + 1 > grid.CableTileGrid.GetLength(0) - 1)
                {
                    return(false);
                }

                if (grid.CableTileGrid[i, j].GetComponent <UnityCableTile>().cableTile.Cable.Nodes[3].IsValid &&
                    grid.CableTileGrid[i + 1, j].GetComponent <UnityCableTile>().cableTile.Cable.Nodes[1].IsValid &&
                    grid.CableTileGrid[i + 1, j].GetComponent <UnityCableTile>().CableState == CableTile.CableStates.Revealed)
                {
                    return(true);
                }

                return(false);
            }

            bool CanConnectTop(int i, int j)
            {
                if (i - 1 < 0)
                {
                    return(false);
                }

                if (grid.CableTileGrid[i, j].GetComponent <UnityCableTile>().cableTile.Cable.Nodes[1].IsValid &&
                    grid.CableTileGrid[i - 1, j].GetComponent <UnityCableTile>().cableTile.Cable.Nodes[3].IsValid &&
                    grid.CableTileGrid[i - 1, j].GetComponent <UnityCableTile>().CableState == CableTile.CableStates.Revealed)
                {
                    return(true);
                }

                return(false);
            }

            bool CanConnectLeft(int i, int j)
            {
                if (j - 1 < 0)
                {
                    return(false);
                }

                if (grid.CableTileGrid[i, j].GetComponent <UnityCableTile>().cableTile.Cable.Nodes[0].IsValid &&
                    grid.CableTileGrid[i, j - 1].GetComponent <UnityCableTile>().cableTile.Cable.Nodes[2].IsValid &&
                    grid.CableTileGrid[i, j - 1].GetComponent <UnityCableTile>().CableState == CableTile.CableStates.Revealed)
                {
                    return(true);
                }

                return(false);
            }

            #endregion
        }