Пример #1
0
        public Selector(cell parent)
        {
            //Inicializace proměnných
            sizeOffset   = 0.5f;
            transparency = 0;

            this.parent = parent;
            offers      = new List <numberOffer>();
        }
Пример #2
0
        public void refreshNumbers(cell[,] grid)
        {
            //Naplnění dočasného seznamu všemi čísly 1-9
            List <int> numbers = new List <int>();

            for (int i = 0; i < 9; i++)
            {
                numbers.Add(i + 1);
            }

            //Odebrání knofliktů v řádcích a sloupcích
            if (Form1.rowsColumns)
            {
                for (int i = 0; i < 9; i++)
                {
                    //Řádek
                    cell cell = grid[i, parent.index.Y];
                    if (cell.value != 0 && !cell.wrong)
                    {
                        numbers.Remove(cell.value);
                    }
                    //Sloupec
                    cell = grid[parent.index.X, i];
                    if (cell.value != 0 && !cell.wrong)
                    {
                        numbers.Remove(cell.value);
                    }
                }
            }

            //Odebrání konfliktů ve skupinách devíti buňek
            if (Form1.areas)
            {
                Point region = new Point((parent.index.X / 3) * 3, (parent.index.Y / 3) * 3);
                for (int i = 0; i < 9; i++)
                {
                    Point local = new Point(i % 3, i / 3);
                    cell  cell  = grid[region.X + local.X, region.Y + local.Y];
                    if (cell.value != 0 && !cell.wrong)
                    {
                        numbers.Remove(grid[region.X + local.X, region.Y + local.Y].value);
                    }
                }
            }

            //Vyčištění nabídky
            offers.Clear();

            //Plnění nabídky čísly z dočasného seznamu
            foreach (int number in numbers)
            {
                numberOffer offer = new numberOffer(this);
                offer.value = number;
                offers.Add(offer);
            }
        }
Пример #3
0
        //
        //Metody tlačítek a buněk
        //

        void cell_MouseDown(IPrvek p, MouseEventArgs e)
        {
            cell cell = p as cell;

            if (e.Button == MouseButtons.Left && cell.editable && !selecting)
            {
                selecting = true;                  //Proměnná říkající, že uživatel vybírá číslo z nabídky

                Selector sel = new Selector(cell); //Vytvoření nové nabídky čísel
                sel.refreshNumbers(grid);          //Načtení vhodných čísel k zobrazení
                selectors.Insert(0, sel);          //Vložení nabídky do seznamu nabídek
            }
            else if (e.Button == MouseButtons.Right && !selecting && cell.editable)
            {
                cell.value      = 0;     //Odebrání hodnoty z buňky
                cell.sizeOffset = 0.8f;  //Zvětšovací efekt při odebrání hodnoty buňky
                cell.wrong      = false; //Buňky již nenabývá žádné hodnoty, tudíž nemůže být špatně vyplněná
            }
        }
Пример #4
0
        void design()
        {
            #region Hrací pole

            //Velikost hracího pole, původně proměnná, algoritmy pro Sudoku však vyžadují
            //velikost 9x9
            gridSize = new Size(9, 9);

            //Pole buněk (třída cell)
            grid = new cell[gridSize.Width, gridSize.Height];

            //Plnění pole buněk
            for (int i = 0; i < 9; i++)
            {
                for (int j = 0; j < 9; j++)
                {
                    cell cell = new cell();       //Vytvoření nové instance třídy buňky
                    cell.index = new Point(i, j); //Přiřazení indexu buňky
                    cell.pos   = new Point(       //Nastavení vykreslovací pozice buňky
                        (i * cellSize) + (cellSize / 2) + ((i / 3) * 2) + borders.X,
                        (j * cellSize) + (cellSize / 2) + ((j / 3) * 2) + borders.Y + menuSize);
                    cell.targetPos  = cell.pos;                                           //Nastavení pozice ke které se buňka snaží přiblížit
                    cell.size       = new SizeF(cellSize, cellSize);                      //Velikost buňky
                    cell.MouseDown += new Prvek_Zaklad.MouseEventHandler(cell_MouseDown); //Přiřazení nového event handleru
                    grid[i, j]      = cell;                                               //Přidání buňky do pole buněk
                    cell.draw_layer = 0;

                    prvky.Add(cell);    //Přidání do seznamu prvků
                }
            }

            uroven = 2;        //Obtížnost Sudoku
            explode(10000);    //Efekt rozlétnutí buněk
            generateNumbers(); //Vygenerování nových platných čísel

            #endregion

            #region Tlačítka

            //Tlačítka úrovní

            U1            = new menuButton();
            U1.pos        = new PointF(menuSize, 0);
            U1.size       = new SizeF(menuSize, menuSize);
            U1.hint       = "Lehké";
            U1.draw_layer = 1;
            U1.MouseDown += new Prvek_Zaklad.MouseEventHandler(U1_MouseDown);

            U2            = new menuButton();
            U2.pos        = new PointF((2 * menuSize), 0);
            U2.size       = new SizeF(menuSize, menuSize);
            U2.hint       = "Střední";
            U2.draw_layer = 1;
            U2.MouseDown += new Prvek_Zaklad.MouseEventHandler(U2_MouseDown);

            U3            = new menuButton();
            U3.pos        = new PointF((3 * menuSize), 0);
            U3.size       = new SizeF(menuSize, menuSize);
            U3.hint       = "Těžké";
            U3.draw_layer = 1;
            U3.MouseDown += new Prvek_Zaklad.MouseEventHandler(U3_MouseDown);

            U4            = new menuButton();
            U4.pos        = new PointF((4 * menuSize), 0);
            U4.size       = new SizeF(menuSize, menuSize);
            U4.hint       = "Velmi těžké";
            U4.draw_layer = 1;
            U4.MouseDown += new Prvek_Zaklad.MouseEventHandler(U4_MouseDown);

            //Kontrola
            check      = new menuButton();
            check.pos  = new PointF(0, 0);
            check.size = new SizeF(menuSize, menuSize);
            //check.text = "✓";
            check.hint       = "Zkontrolovat";
            check.draw_layer = 1;
            check.MouseDown += new Prvek_Zaklad.MouseEventHandler(check_MouseDown);

            //Nápověda
            set            = new menuButton();
            set.pos        = new PointF(this.Size.Width - (menuSize * 3), 0);
            set.size       = new SizeF(menuSize, menuSize);
            set.text       = "­?";
            set.hint       = "Nápověda";
            set.draw_layer = 1;
            set.MouseDown += new Prvek_Zaklad.MouseEventHandler(set_MouseDown);

            //Minimalizace
            mini            = new menuButton();
            mini.pos        = new PointF(this.Size.Width - (menuSize * 2), 0);
            mini.size       = new SizeF(menuSize, menuSize);
            mini.text       = "_";
            mini.hint       = "Minimalizovat";
            mini.draw_layer = 1;
            mini.MouseDown += new Prvek_Zaklad.MouseEventHandler(mini_MouseDown);

            //Konec
            exit            = new menuButton();
            exit.pos        = new PointF(this.Size.Width - menuSize, 0);
            exit.size       = new SizeF(menuSize, menuSize);
            exit.text       = "x";
            exit.hint       = "Ukončit";
            exit.draw_layer = 1;
            exit.MouseDown += new Prvek_Zaklad.MouseEventHandler(exit_MouseDown);

            //Přidání do seznamu prvků
            prvky.Add(U1);
            prvky.Add(U2);
            prvky.Add(U3);
            prvky.Add(U4);
            prvky.Add(check);
            prvky.Add(set);
            prvky.Add(mini);
            prvky.Add(exit);

            #endregion

            #region Grafické tvary

            //Znak kontroly - checkmark
            checkMark = new GraphicsPath();
            checkMark.AddLine(1, 3, 4, 6);
            checkMark.AddLine(4, 6, 8, 0);
            checkMark.AddLine(8, 0, 10, 1);
            checkMark.AddLine(10, 1, 4, 9);
            checkMark.AddLine(4, 9, 0, 5);
            checkMark.AddLine(0, 5, 1, 3);
            checkMark.CloseFigure();

            //Určení zvětšovací transformace
            Matrix scale = new Matrix();
            scale.Scale(1.8f, 1.8f);

            checkMark.Transform(scale);

            //Znak úrovně Lehké
            indicatorLeft = new GraphicsPath();
            indicatorLeft.AddArc(0, 0, 12, 16, 90, 180);
            indicatorLeft.AddLine(12, 0, 24, 0);
            indicatorLeft.AddLine(24, 0, 24, 16);
            indicatorLeft.AddLine(24, 16, 10, 16);
            indicatorLeft.CloseFigure();

            //Určení překlápěcí transformace
            Matrix mirror = new Matrix();
            mirror.Scale(-1, 1);
            mirror.Translate(-24, 0);

            //Znak úrovně Velmi těžké
            indicatorRight = (GraphicsPath)indicatorLeft.Clone();
            indicatorRight.Transform(mirror);

            #endregion
        }