public LineUpdatedEventArgs(Definition.Line line)
     : base(line.Index, line)
 {
     this.line = line;
 }
Exemple #2
0
        private bool fillOnlyTwoElement(Definition.Line line)
        {
            var twoEmptyElementsQuery = line.Elements.OnlyTwo(item => !item.HasValue);

            if (!twoEmptyElementsQuery.Any())
            {
                return(false);
            }

            Definition.Element emptyElement1, emptyElement2;
            using (var iterator = twoEmptyElementsQuery.GetEnumerator())
            {
                iterator.MoveNext();
                emptyElement1 = iterator.Current;
                iterator.MoveNext();
                emptyElement2 = iterator.Current;
            }

            var valuesRemainder = line.Elements
                                  .Values()
                                  .SudokuExcept()
                                  .ToArray();

            var sudoku = this.sudoku;

            int emptyElement1Index = emptyElement1.Index;
            int emptyElement2Index = emptyElement2.Index;

            int sourceGrid1Index = emptyElement1.GridIndex;
            int sourceGrid2Index = emptyElement2.GridIndex;

            bool inSameGrid = sourceGrid1Index == sourceGrid2Index;

            var sourceGrid1 = sudoku.Grids[sourceGrid1Index];
            var sourceGrid2 = inSameGrid ? sourceGrid1 : sudoku.Grids[sourceGrid2Index];

            var lineType = getOppositeLineType(line.LineType);

            Definition.Grid otherGrid1ForElement1, otherGrid2ForElement1;
            sourceGrid1.GetOtherGrids(lineType, out otherGrid1ForElement1, out otherGrid2ForElement1);

            Definition.Grid otherGrid1ForElement2, otherGrid2ForElement2;
            if (inSameGrid)
            {
                otherGrid1ForElement2 = otherGrid1ForElement1;
                otherGrid2ForElement2 = otherGrid2ForElement1;
            }
            else
            {
                sourceGrid2.GetOtherGrids(lineType, out otherGrid1ForElement2, out otherGrid2ForElement2);
            }

            int layer1, layer2;

            switch (lineType)
            {
            case Definition.LineType.Row:
                layer1 = emptyElement1Index / 3;
                layer2 = emptyElement2Index / 3;
                break;

            case Definition.LineType.Column:
                layer1 = emptyElement1Index % 3;
                layer2 = emptyElement2Index % 3;
                break;

            default: throw new NotImplementedException();
            }

            var valuesForEmptyElement1 =
                otherGrid1ForElement1.GetElementsInCurrentGridLine(layer1, lineType)
                .Concat(otherGrid2ForElement1.GetElementsInCurrentGridLine(layer1, lineType))
                .Values();

            var except1 = valuesRemainder.Except(valuesForEmptyElement1);
            int value1  = except1.SingleOrDefault(-1);

            if (value1 > 0)
            {
                var exceptedValue = valuesRemainder.Except(value1).First();

                filling(emptyElement1, value1);
                emptyElement1.SetValue(value1);

                if (!emptyElement2.HasValue)
                {
                    filling(emptyElement2, exceptedValue);
                    emptyElement2.SetValue(exceptedValue);
                }

                return(true);
            }

            var valuesForEmptyElement2 =
                otherGrid1ForElement2.GetElementsInCurrentGridLine(layer2, lineType)
                .Concat(otherGrid2ForElement2.GetElementsInCurrentGridLine(layer2, lineType))
                .Values();

            var except2 = valuesRemainder.Except(valuesForEmptyElement2);
            int value2  = except2.SingleOrDefault(-1);

            if (value2 > 0)
            {
                var exceptedValue = valuesRemainder.Except(value2).First();

                filling(emptyElement2, value2);
                emptyElement2.SetValue(value2);

                if (!emptyElement1.HasValue)
                {
                    filling(emptyElement1, exceptedValue);
                    emptyElement1.SetValue(exceptedValue);
                }

                return(true);
            }

            return(false);
        }
 public LineObserver(Definition.Line line, SeatMode seatMode)
     : base(line, seatMode)
 {
     this.line = line;
 }