private static bool GenerateNumber(GameFieldModel model, Random rand, IndexPair pair) { var availableNumbers = GetHeuristicsAvailableNumbers(model, pair); sbyte number = rand.Choose(availableNumbers); model.SetItemNumber(pair, number); return !model.IsItemEmpty(pair); }
private static IndexPair GetAvailableToHidePair(GameFieldModel model, List<IndexPair> pairs, CancellationToken token, int rank) { foreach (var pair in pairs.ToList()) { token.ThrowIfCancellationRequested(); model.SetItemVisible(pair, false); if (GetHeuristicsAvailableNumbers(model, pair, rank).Count() <= 1) return pair; model.SetItemVisible(pair, true); pairs.Remove(pair); } return null; }
private static Dictionary<IndexPair, IEnumerable<sbyte>> GetAvailableDictByPairs(GameFieldModel model, IEnumerable<IndexPair> pairs, IndexPair checkedPair, int rank) { var dict = new Dictionary<IndexPair, IEnumerable<sbyte>>(); foreach (var pair in pairs) { if (rank > 1 && model.IsItemNotAvailable(pair, checkedPair)) { model.SelectedPair = pair; dict.Add(pair, GetHeuristicsAvailableNumbers(model, pair, rank - 1)); model.SelectedPair = null; } else { dict.Add(pair, model.GetAvailableNumbers(pair, checkedPair)); } } return dict; }
public void InitModel() { Model = new GameFieldModel(); Mode = EMode.Normal; }
private static Dictionary<IndexPair, IEnumerable<sbyte>> GetBlockAvailableDict(GameFieldModel model, IndexPair pair, int rank) { var blockPairs = model.GetBlockPairs(pair); return GetAvailableDictByPairs(model, blockPairs, pair, rank); }
private static bool SetNumbers(GameFieldModel model, Random rand, CancellationToken token) { foreach (var pair in model.GetBlockOrderedPairs()) { token.ThrowIfCancellationRequested(); if (!GenerateNumber(model, rand, pair)) return false; } return true; }
private static bool InitVisible(GameFieldModel model, Random rand, CancellationToken token) { model.ClearVisible(); return HideItems(model, rand, token); }
public static void Init(GameFieldModel model, CancellationToken token) { Task.Factory.StartNew(() => InitModel(model, token), token); }
private static bool InitNumbers(GameFieldModel model, Random rand, CancellationToken token) { model.ClearNumbers(); model.ClearVisible(); return SetNumbers(model, rand, token); }
private static void InitModel(GameFieldModel model, CancellationToken token) { model.BeginInitializing(); var rand = new Random(); while (!InitNumbers(model, rand, token)) { } token.ThrowIfCancellationRequested(); for (int k = 0; k < maxTryVisibleCount && !InitVisible(model, rand, token); k++) { } model.EndInitializing(); }
private static bool HideItems(GameFieldModel model, Random rand, CancellationToken token) { var orderedPairs = model.GetAllPairs(); var pairs = rand.Shake(orderedPairs); var rank = 1; const int maxRank = 2; do { var pair = GetAvailableToHidePair(model, pairs, token, rank); if (pair == null) { if (rank == maxRank) break; rank++; orderedPairs = model.GetAllPairs().Where(model.GetItemVisible); pairs = rand.Shake(orderedPairs); } else { pairs.Remove(pair); } } while(true); return model.VisibleCount <= maxVisibleNumbers; }
private static IEnumerable<sbyte> GetHeuristicsAvailableNumbers(GameFieldModel model, IndexPair pair, int rank = 1) { var blockDict = GetBlockAvailableDict(model, pair, rank); var available = GetAvailableByDict(blockDict, pair).ToList(); if (available.Count < 2) return available; var rowDict = GetRowAvailableDict(model, pair, rank); available = available.Intersect(GetAvailableByDict(rowDict, pair)).ToList(); if (available.Count < 2) return available; var columnDict = GetColumnAvailableDict(model, pair, rank); return available.Intersect(GetAvailableByDict(columnDict, pair)); }