Пример #1
0
    private void floodFill(GridElement startElement)
    {
        Debug.Log("floodfilling");
        Debug.DrawRay(startElement.transform.position, new Vector2(0, 1), Color.green);
        Debug.DrawRay(startElement.transform.position, new Vector2(1, 0), Color.green);
        Debug.DrawRay(startElement.transform.position, new Vector2(0, -1), Color.green);
        Debug.DrawRay(startElement.transform.position, new Vector2(-1, 0), Color.green);
        GridElement         wallElement = null;
        Queue <GridElement> queue       = new Queue <GridElement>();

        queue.Enqueue(startElement);

        // add additional fillpoints for special cases
        foreach (GridElement point in additionalFillPoints)
        {
            queue.Enqueue(point);
        }

        int count = 0;

        while (queue.Count != 0)
        {
            GridElement element = queue.Dequeue();
            if (element.capture(walls))
            {
                count++;
                foreach (GridElement neighbour in element.getNeighbours())
                {
                    queue.Enqueue(neighbour);
                }
            }
            else if (wallElement == null)
            {
                if (element.ContainsWall(walls) && !element.iscaptured())
                {
                    wallElement = element;
                }
            }
        }

        // floodfill the wall as well
        queue.Enqueue(wallElement);
        while (queue.Count != 0)
        {
            GridElement element = queue.Dequeue();
            if (element != null && element.captureWall(walls))
            {
                count++;
                foreach (GridElement neighbour in element.getNeighbours())
                {
                    queue.Enqueue(neighbour);
                }
            }
        }

        additionalFillPoints.Clear();
        gridElementsCaptured += count;


        // Set number of moves before checking level complete, don't check if number of moves exceeded yet
        nbMoves++;
        setup.movesText.text = nbMoves + "/" + GameSetup.getLevelManager().getCurrentLevel().nbOfMoves;

        // check for level complete
        float percentageCaptured = (gridElementsCaptured * 1.0f) / (setup.numberOfGridElements * 1.0f);

        if (percentageCaptured > 1)
        {
            percentageCaptured = 1;
        }
        setup.progress.text = (int)(percentageCaptured * 100) + "/" + (int)(GameSetup.getLevelManager().getCurrentLevel().percentage);
        if (percentageCaptured * 100 > GameSetup.getLevelManager().getCurrentLevel().percentage)
        {
            setup.levelComplete();
            return;
        }

        // check for almost all moves used
        if (nbMoves >= GameSetup.getLevelManager().getCurrentLevel().nbOfMoves - 2)
        {
            Color color;
            ColorUtility.TryParseHtmlString("#F1B858", out color);
            setup.movesText.color     = color;
            setup.movesText.fontStyle = FontStyle.Bold;
        }

        // check for maximum number of moves used
        if (nbMoves == GameSetup.getLevelManager().getCurrentLevel().nbOfMoves)
        {
            setup.movesText.color     = Color.red;
            setup.movesText.fontStyle = FontStyle.Bold;
            setup.gameOver(true);
            return;
        }


        if (GameSetup.debugMode)
        {
            Debug.Log("filling " + count + " grid elements");
        }
    }