Ejemplo n.º 1
0
        /// <summary>
        /// Показ следующей фигуры.
        /// </summary>
        /// <param name="f"></param>
        public void PreviewFigura(MainFigura figura)
        {
            int x1 = Dx + ColCount * CellWidth + 10;
            int y1 = Dy;

            g.FillRectangle(Brushes.White, x1, y1, 6 * CellWidth, 6 * CellWidth);

            int otstX = x1 + (6 - figura.M) * CellWidth / 2;
            int otstY = y1 + (6 - figura.N) * CellWidth / 2;

            for (int i = 0; i < figura.N; i++)
            {
                for (int j = 0; j < figura.M; j++)
                {
                    if (figura.CurrentFigurs[i, j] > 0)
                    {
                        g.DrawImage(ArrayBitmap[figura.CurrentFigurs[i, j]], otstX + j * CellWidth, otstY + i * CellWidth, CellWidth, CellWidth);
                    }
                }
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Таймер.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Timer_Tick(object sender, EventArgs e)
        {
            if (currenFigura == null)
            {
                currenFigura = Nextfigura;

                switch (rnd.Next(CountFigur))
                {
                case 0:
                {
                    Nextfigura = new Figura_0();
                    break;
                }

                case 1:
                {
                    Nextfigura = new Figura_1();
                    break;
                }

                case 2:
                {
                    Nextfigura = new Figura_2();
                    break;
                }

                case 3:
                {
                    Nextfigura = new Figura_3();
                    break;
                }

                case 4:
                {
                    Nextfigura = new Figura_4();
                    break;
                }

                case 5:
                {
                    Nextfigura = new Figura_5();
                    break;
                }

                case 6:
                {
                    Nextfigura = new Figura_6();
                    break;
                }

                case 7:
                {
                    Nextfigura = new Figura_7();
                    break;
                }
                }

                PreviewFigura(Nextfigura);

                currenFigura.ti = -currenFigura.N;
                currenFigura.tj = (ColCount - currenFigura.M) / 2;
            }
            else
            {
                bool f = true;

                int i, j;

                if (currenFigura.ti + currenFigura.N == RowCount)
                {
                    f = false;
                }
                else
                {
                    //перебираем двумерный массив фигуры
                    for (i = 0; i < currenFigura.N; i++)
                    {
                        for (j = 0; j < currenFigura.M; j++)
                        {
                            //если перебираемая строка массива фигуры уже показалась или сейчас покажется в игровом поле, то
                            if (i + currenFigura.ti + 1 >= 0)
                            {
                                //если в игровом поле внизу клетки с квадратиком фигуры есть другой квадратик, то
                                if (GameMap[i + currenFigura.ti + 1, j + currenFigura.tj] > 0 && currenFigura.CurrentFigurs[i, j] > 0)
                                {
                                    f = false;//дальше фигура двигаться не может
                                }
                            }
                        }
                    }
                }

                if (f)
                {
                    currenFigura.ti = currenFigura.ti + 1;
                    Show();
                }
                else
                {
                    for (i = 0; i < currenFigura.N; i++)
                    {
                        for (j = 0; j < currenFigura.M; j++)
                        {
                            if (currenFigura.CurrentFigurs[i, j] > 0 && currenFigura.ti + i >= 0)
                            {
                                GameMap[currenFigura.ti + i, currenFigura.tj + j] = currenFigura.CurrentFigurs[i, j];
                            }

                            currenFigura.CurrentFigurs[i, j] = 0;
                        }
                    }


                    i = RowCount - 1;
                    while (i >= 0)
                    {
                        int k = 0;

                        for (j = 0; j < ColCount; j++)
                        {
                            if (GameMap[i, j] == 0)
                            {
                                k++;                    //подсчитываем количество пустых клеток в строке
                            }
                        }
                        if (k == 0)
                        {
                            //заполняем нулями клетки удалямой строки
                            for (j = 0; j < ColCount; j++)
                            {
                                GameMap[i, j] = 0;
                            }
                            //посчитываем количество баллов и линий
                            Scope            += ColCount * Level;
                            CountDestroyLine += 1;
                            //если количество баллов превышает новый уровень, то
                            if (Scope >= NextLevel)
                            {
                                //если интервал таймера не меньше 100 мс, то уменьшаем скорость таймера на 50 мс
                                if (timer.Interval >= 100)
                                {
                                    timer.Interval -= 50;
                                }
                                Level     += 1;
                                NextLevel *= 2;
                            }


                            ShowLabel();

                            for (k = i; k > 0; k--)
                            {
                                for (j = 0; j < ColCount; j++)
                                {
                                    GameMap[k, j] = GameMap[k - 1, j];
                                }
                            }

                            Show();//перерисовываем игровое поле
                        }
                        else
                        {
                            i--;
                        }
                    }

                    if (currenFigura.ti <= 0)
                    {
                        timer.Enabled = false;
                        var rez = MessageBox.Show("Хотите начать новую игру?", "Игра закончена", MessageBoxButtons.YesNo,
                                                  MessageBoxIcon.Question);
                        if (rez == DialogResult.Yes)
                        {
                            //то очищаем игровое поле
                            for (i = 0; i < RowCount; i++)
                            {
                                for (j = 0; j < ColCount; j++)
                                {
                                    GameMap[i, j] = 0;
                                }
                            }
                            //восстанавливаем начальные параметры игры
                            currenFigura     = null;
                            timer.Enabled    = true;
                            timer.Interval   = 500;
                            Level            = 1;
                            Scope            = 0;
                            CountDestroyLine = 0;
                            ShowLabel();
                        }
                        else
                        {
                            Application.Exit(); //выход из игры
                        }
                        Show();                 //если не вышли, то началась новая игра, и вызваем функцию прорисовки игрового поля
                    }
                    currenFigura = null;        //уничтожаем упавшую фигуру
                }
            }
        }
Ejemplo n.º 3
0
        public Tetris(Graphics pov, int Row, int Col)
        {
            g        = pov;
            RowCount = Row;
            ColCount = Col;

            GameMap = new int[RowCount, ColCount];

            for (int i = 0; i < RowCount; i++)
            {
                for (int j = 0; j < ColCount; j++)
                {
                    GameMap[i, j] = 0;
                }
            }

            ArrayBitmap = new Bitmap[ArrayBrush.Length];

            for (int i = 0; i < ArrayBitmap.Length; i++)
            {
                ArrayBitmap[i] = new Bitmap(CellWidth, CellWidth);

                Graphics rectBitmap = Graphics.FromImage(ArrayBitmap[i]);
                //на поверности квадратика рисуем закрашенный прямоугольник соответсвующего цвета
                rectBitmap.FillRectangle(ArrayBrush[i], 0, 0, CellWidth, CellWidth);
                //вокру прямоугольника рисуем черную рамку
                rectBitmap.DrawRectangle(Pens.Black, 0, 0, CellWidth, CellWidth);
            }

            NextLevel = ColCount * Level * 10;
            //случайным образом создаем следующую фигуру
            switch (rnd.Next(CountFigur))
            {
            case 0:
            {
                Nextfigura = new Figura_0(); break;
            }

            case 1:
            {
                Nextfigura = new Figura_1(); break;
            }

            case 2:
            {
                Nextfigura = new Figura_2(); break;
            }

            case 3:
            {
                Nextfigura = new Figura_3(); break;
            }

            case 4:
            {
                Nextfigura = new Figura_4(); break;
            }

            case 5:
            {
                Nextfigura = new Figura_5(); break;
            }

            case 6:
            {
                Nextfigura = new Figura_6(); break;
            }

            case 7:
            {
                Nextfigura = new Figura_7();
                break;
            }
            }

            PreviewFigura(Nextfigura);
            //располаем созданную фигуру выше игрового поля
            Nextfigura.tj = -Nextfigura.N;
            Nextfigura.ti = (ColCount - Nextfigura.M) / 2;
            //создаем определяем параметры меток для вывода информации об уровне, количестве линий и баллов
            Font font = new Font("Arial", 14, FontStyle.Bold);
            int  h    = (RowCount * CellWidth - 6 * CellWidth) / 4;
            int  y    = Dy + 6 * CellWidth + h;

            lLevel          = new Label();
            lLevel.Font     = font;
            lLevel.AutoSize = true;
            lLevel.Left     = Dx + ColCount * CellWidth + 10;
            lLevel.Top      = y;
            lLines          = new Label();
            lLines.Font     = font;
            lLines.AutoSize = true;

            lLines.Left     = lLevel.Left;
            lLines.Top      = y + h;
            lScope          = new Label();
            lScope.Font     = font;
            lScope.AutoSize = true;
            lScope.Left     = lLevel.Left;
            lScope.Top      = y + 2 * h;
            //выводим в созданные метки стартовые значения
            ShowLabel();
            timer          = new Timer(); //создаем таймер
            timer.Enabled  = false;       //выключаем таймер
            timer.Interval = 500;         //устанавливаем начальный интервал срабатывания таймера
            timer.Tick    += Timer_Tick;  //подключаем обработчик таймера
            timer.Enabled  = true;
        }