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;
        }
Пример #4
0
 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);
        }
Пример #10
0
        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();
        }
Пример #11
0
        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;
        }
Пример #12
0
        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));
        }