/// <summary> /// Gets the needed picks to win all prize levels of a given division /// </summary> /// <param name="division">The division is the division containing the winning prize levels</param> /// <param name="prizeLevels">All prize levels in the game used to get the index of the prize level</param> /// <returns>Returns a list of ints containing the needed picks to win a division</returns> private List<int> getNeededPicksForDivision( bool useInstantWin, Divisions.DivisionModel division, PrizeLevels.PrizeLevels prizeLevels) { List<int> neededPicks = new List<int>(); List<PrizeLevels.PrizeLevel> pls = division.getPrizeLevelsAtDivision(); foreach (PrizeLevels.PrizeLevel pl in pls) { int numberToCollect = pl.numCollections; int indexInPrizeLevels = prizeLevels.getLevelOfPrize(pl) + 1; if ((pl.isInstantWin || pl.numCollections == 0) && useInstantWin) { numberToCollect = 1; neededPicks.Add(-indexInPrizeLevels); } else { numberToCollect = pl.numCollections; for (int i = 0; i < numberToCollect; i++) { neededPicks.Add(indexInPrizeLevels); } } } return neededPicks; }
/// <summary> /// Creates all the winning permutations of a divisions /// </summary> /// <param name="divisionIndicator">Selected Division</param> /// <param name="totalNumberOfPicks">Number of picks for a division</param> /// <param name="numberOfPermutations">number of permutations to genreate for a division</param> /// <param name="division">Division informaiton</param> /// <param name="prizeLevels">Prize level informaiton</param> /// <returns>Returns the list of winning permutaitons for a division</returns> private List<int[]> getDivisionWinningPermutations( int divisionIndicator, short totalNumberOfPicks, int numberOfPermutations, Divisions.DivisionModel division, PrizeLevels.PrizeLevels prizeLevels) { List<int[]> divisionIncompleteWinPermutations = new List<int[]>(); List<PrizeLevels.PrizeLevel> divisionPrizeLevels = division.getPrizeLevelsAtDivision(); int maxNumberOfNeededPicksForDivision = 0; bool isInstantWinPresent = false; foreach (PrizeLevels.PrizeLevel p in divisionPrizeLevels) { maxNumberOfNeededPicksForDivision += p.numCollections; if (p.isInstantWin) { isInstantWinPresent = true; } } int[] picks = getNeededPicksForDivision(true, division, prizeLevels).ToArray(); divisionIncompleteWinPermutations.AddRange(getAllBasePermutations(totalNumberOfPicks, numberOfPermutations, getBaseCombinaiton(totalNumberOfPicks, picks).ToArray())); int[] nonWinningPicks = getExtraPicks(divisionIncompleteWinPermutations[0], prizeLevels); if (nonWinningPicks.Length + picks.Length < totalNumberOfPicks && isInstantWinPresent) { divisionIncompleteWinPermutations.Clear(); } if (maxNumberOfNeededPicksForDivision <= totalNumberOfPicks && isInstantWinPresent) { divisionIncompleteWinPermutations.AddRange(getAllBasePermutations(totalNumberOfPicks, numberOfPermutations, getBaseCombinaiton(totalNumberOfPicks, getNeededPicksForDivision(false, division, prizeLevels).ToArray()).ToArray())); } List<int[]> maximumPermutations = fillBlankDivisionPermutationsWithNonWinningData( divisionIncompleteWinPermutations, nonWinningPicks, division, prizeLevels, (numberOfPermutations + extraPermutationBuffer)).OrderBy(a => Guid.NewGuid()).ToList(); List<int[]> finalPermutations = maximumPermutations.Take(numberOfPermutations).ToList(); return finalPermutations; }