Exemple #1
0
        public IEnumerable <HexStep> GetSolutions_Double(HexHintList hintlist)
        {
            var varcells = GetCells().Where(p => p.Type == HexagonType.HIDDEN).ToList();

            if (varcells.Count > LIMIT_DOUBLE)
            {
                yield break;
            }

            List <HexHint> hints = varcells.SelectMany(p => hintlist.Get(p.Position)).Distinct().ToList();

            foreach (var add_cells in hints.OrderBy(p => p.GetCells().Count(q => q.Type == HexagonType.HIDDEN)).Where(p => p.GetCells().Where(q => q.Type == HexagonType.HIDDEN).Any(q => !varcells.Contains(q))))
            {
                var new_varcells = varcells.Concat(add_cells.GetCells().Where(p => p.Type == HexagonType.HIDDEN)).Distinct().ToList();

                if (new_varcells.Count > LIMIT_DOUBLE)
                {
                    break;
                }

                var new_hints = varcells.SelectMany(p => hintlist.Get(p.Position)).Distinct().ToList();

                foreach (var solution in GetSolutions(new_varcells, -1, new_hints))
                {
                    yield return(solution);
                }
            }
        }
Exemple #2
0
        public void Set(int x, int y, HexagonCell value)
        {
            MinX = Math.Min(MinX, x);
            MaxX = Math.Max(MaxX, x + 1);
            MinY = Math.Min(MinY, y);
            MaxY = Math.Max(MaxY, y + 1);

            _HintList = null;

            map[new Vec2i(x, y)] = value;
        }
Exemple #3
0
        public HexHintList GetHintList(bool raw = false)
        {
            HexHintList list = new HexHintList(this);

            foreach (var hex in this)
            {
                if (hex.Value.Hint.IsError)
                {
                    throw new Exception("OCR failed for some cells");
                }

                switch (hex.Value.Hint.Area)
                {
                case CellHintArea.NONE:
                    break;

                case CellHintArea.DIRECT:
                    list.Add(new HexNeighborHint(this, hex.Value));
                    break;

                case CellHintArea.CIRCLE:
                    list.Add(new HexAreaHint(this, hex.Value));
                    break;

                case CellHintArea.COLUMN_LEFT:
                case CellHintArea.COLUMN_DOWN:
                case CellHintArea.COLUMN_RIGHT:
                    list.Add(new HexRowHint(this, hex.Value));
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }
            }

            list.Add(new HexCellSumHint(this));

            if (!raw)
            {
                list.CleanUp();
                list.Optimize();
            }

            return(list);
        }
Exemple #4
0
        public List <HexStep> GetSolutions_Single(HexHintList hintlist)
        {
            var varcells = GetCells().Where(p => p.Type == HexagonType.HIDDEN).ToList();

            if (varcells.Count > LIMIT_SINGLE)
            {
                return(Enumerable.Empty <HexStep>().ToList());
            }

            List <HexHint> hints = varcells.SelectMany(p => hintlist.Get(p.Position)).Distinct().ToList();

            int myNumber = GetNumber() - GetCells().Count(p => p.Type == HexagonType.ACTIVE);

            if (myNumber < 0)
            {
                throw new Exception("Invalid Game state [Number < 0]");
            }

            return(GetSolutions(varcells, myNumber, hints));
        }
Exemple #5
0
        private HexHintList GetHintList()
        {
            HexHintList list = new HexHintList(this);

            foreach (var hex in this)
            {
                switch (hex.Value.Hint.Area)
                {
                case CellHintArea.NONE:
                    break;

                case CellHintArea.DIRECT:
                    list.Add(new HexNeighborHint(this, hex.Value));
                    break;

                case CellHintArea.CIRCLE:
                    list.Add(new HexAreaHint(this, hex.Value));
                    break;

                case CellHintArea.COLUMN_LEFT:
                case CellHintArea.COLUMN_DOWN:
                case CellHintArea.COLUMN_RIGHT:
                    list.Add(new HexRowHint(this, hex.Value));
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }
            }

            list.Add(new HexCellSumHint(this));

            list.CleanUp();
            list.Optimize();

            return(list);
        }