Пример #1
0
    private void ComputeSolution()
    {
        Solutions = new List <HypotheticalSolution>();

        var firstSolution = new HypotheticalSolution(EditableLevel);

        firstSolution.Solve();

        var minimumMoves         = int.MaxValue;
        var minimumMovesWithFlag = int.MaxValue;

        for (var i = 0; i < Solutions.Count; i++)
        {
            if (Solutions[i].CollectedCollectables.Contains(EditableLevel.KFlag) && Solutions[i].Movements.Count < minimumMovesWithFlag)
            {
                var lingeringFlag = false;

                for (var j = 0; j < Solutions[i].Elements.Length; j++)
                {
                    var element = Solutions[i].Elements[j];

                    if (element != null && element.Contains(EditableLevel.KFlag))
                    {
                        lingeringFlag = true;
                    }
                }

                if (!lingeringFlag)
                {
                    minimumMovesWithFlag = Solutions[i].Movements.Count;
                }
            }
            if (Solutions[i].Movements.Count < minimumMoves)
            {
                minimumMoves = Solutions[i].Movements.Count;
            }
        }

        EditableLevel.NumberOfSolutions    = Solutions.Count;
        EditableLevel.MinimumMoves         = minimumMoves / 2;
        EditableLevel.MinimumMovesWithFlag = minimumMovesWithFlag / 2;
    }
Пример #2
0
    public HypotheticalSolution(HypotheticalSolution otherSolution)
    {
        Id = LevelEditor.Solutions.Count;
        LevelEditor.Solutions.Add(this);

        Elements = new string[otherSolution.Elements.Length];

        for (var i = 0; i < Elements.Length; i++)
        {
            Elements[i] = otherSolution.Elements[i];
        }

        StartNode = new Vector2(otherSolution.StartNode.x, otherSolution.StartNode.y);
        EndNode   = new Vector2(otherSolution.EndNode.x, otherSolution.EndNode.y);

        Movements = new List <TraversalManager.TraversalMove>();

        for (var i = 0; i < otherSolution.Movements.Count; i++)
        {
            Movements.Add(otherSolution.Movements[i]);
        }

        VisitedElements = new List <Vector2>();

        for (var i = 0; i < otherSolution.VisitedElements.Count; i++)
        {
            VisitedElements.Add(otherSolution.VisitedElements[i]);
        }

        CollectedCollectables = new List <string>();

        for (var i = 0; i < otherSolution.CollectedCollectables.Count; i++)
        {
            CollectedCollectables.Add(otherSolution.CollectedCollectables[i]);
        }

        EndNodeVisited  = otherSolution.EndNodeVisited;
        EndNodeBypasses = otherSolution.EndNodeBypasses;
    }
Пример #3
0
    public void Solve(Vector2 position)
    {
        if (Movements.Count > 100)
        {
            Debug.Log("Solution aborted");
            return;
        }

        var currentPosition = position;

        GrabCollectables(currentPosition);
        VisitedElements.Add(currentPosition);

        if (GetElement(currentPosition).Contains(EditableLevel.KLink))
        {
            var currentLinkColor = string.Empty;

            for (var i = 0; i < EditableLevel.Colors.Length; i++)
            {
                if (GetElement(currentPosition).Contains(EditableLevel.Colors[i]))
                {
                    currentLinkColor = EditableLevel.Colors[i];
                    break;
                }
            }

            for (var x = 0; x < EditableLevel.KWidth; x++)
            {
                for (var y = 0; y < EditableLevel.KHeight; y++)
                {
                    var newPosition = new Vector2(x, y);
                    var newElement  = GetElement(x, y);

                    if (newElement != null && newElement.Contains(EditableLevel.KLink) && currentPosition != newPosition)
                    {
                        var otherLinkColor = string.Empty;

                        for (var i = 0; i < EditableLevel.Colors.Length; i++)
                        {
                            if (newElement.Contains(EditableLevel.Colors[i]))
                            {
                                otherLinkColor = EditableLevel.Colors[i];
                                break;
                            }
                        }

                        if (currentLinkColor == otherLinkColor)
                        {
                            currentPosition = newPosition;
                            Movements.Add(TraversalManager.TraversalMove.NONE);
                            goto bla;
                        }
                    }
                }
            }
        }

bla:

        if (EndNode == currentPosition)
        {
            if (EndNodeVisited >= EndNodeBypasses)
            {
                return;
            }

            EndNodeVisited++;

            var newSolution = new HypotheticalSolution(this);
            newSolution.Solve(currentPosition);
        }

        var wall = GetElement(currentPosition).Contains(EditableLevel.KWall);

        TraversalManager.TraversalMove[] moves =
        {
            TraversalManager.TraversalMove.Up,
            TraversalManager.TraversalMove.Right,
            TraversalManager.TraversalMove.Down,
            TraversalManager.TraversalMove.Left
        };

        var possibleMoves = new List <TraversalManager.TraversalMove>();

        for (var i = 0; i < moves.Length; i++)
        {
            if (TryTraverse(currentPosition, moves[i]))
            {
                possibleMoves.Add(moves[i]);
            }
        }

        if (possibleMoves.Count == 0)
        {
            LevelEditor.Solutions.Remove(this);
            return;
        }

        var solutions = new HypotheticalSolution[possibleMoves.Count];

        for (var i = 0; i < solutions.Length; i++)
        {
            if (i > 0)
            {
                var newSolution = new HypotheticalSolution(this);
                solutions[i] = newSolution;
            }
            else
            {
                solutions[i] = this;
            }
        }

        for (var i = 0; i < possibleMoves.Count; i++)
        {
            var nextPosition = GetNextPosition(currentPosition, possibleMoves[i]);

            if (wall)
            {
                solutions[i].Movements.Add(possibleMoves[i]);
                solutions[i].Movements.Add(possibleMoves[i]);   // ewww
            }

            solutions[i].Movements.Add(possibleMoves[i]);
            solutions[i].Solve(nextPosition);
        }
    }