private void DiscoverRoutes(Path path) { Pillar lastPosition = path.Last(); _nearestPillars.SetPillars(lastPosition); if (_nearestPillars.HasAny) { Pillar[] nearestPositions = _nearestPillars.Pillars; Pillar[] steppablePositions = _rules.Steppable(nearestPositions, lastPosition); if (steppablePositions.Length == 1) { path.Increase(steppablePositions[0]); DiscoverRoutes(path); } else if (1 < steppablePositions.Length) { foreach (var newBranch in steppablePositions) { int cloneIndex = Clone(path); DiscoverRoutes(_results[cloneIndex]); } } } }
private bool StepOrBuild(Pillar lastPosition, Pillar beforeLastPosition) { _nearestPillars.SetPillars(lastPosition, beforeLastPosition); Pillar[] steppablePositions = _rules.Steppable(_nearestPillars.Pillars, lastPosition); if (0 < steppablePositions.Length) { lastPosition = _map.GetField(steppablePositions[PyramidGame.Random.Next(0, steppablePositions.Length)]); Step(lastPosition); return(true); } else { Pillar[] buildablePos = _rules.Buildable(_nearestPillars.Pillars, lastPosition); if (buildablePos.Length != 0) { lastPosition = _map.GetField(buildablePos[PyramidGame.Random.Next(0, buildablePos.Length)]); } Build(lastPosition); return(false); } }