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; }
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); } }