Пример #1
0
 /// <summary>Сдвигает фигуру.</summary>
 public void DoStep()
 {
     if (Current != GameShape.Zero)
     {
         IsFigureFalling = MoveDown(Current);                 // пытаемся сдвинуть вниз
         Current         = IsFigureFalling ? Current.MoveDown() : GameShape.Zero;
         // если фигура упала, то передвигаем указатель, иначе двигать больше некуда и фигура опустилась
     }
     else
     {
         IsFigureFalling = false;
     }
 }
Пример #2
0
        /// <summary>Помещает новую фигуру на верх поля.</summary>
        /// <param name="shape">Новая фигура.</param>
        /// <returns>true, если фигуру удалось полностью поместить на поле, иначе - false.</returns>
        public bool PlaceShape(GameShape shape)
        {
            shape = shape.MoveTo(0, BoardWidth / 2 - 1);
            int scs = SetFigure(shape, false);

            Current = shape;
            if (scs != 4)
            {
                return(false);                      // конец игры!
            }
            IsFigureFalling = true;
            return(true);
        }
Пример #3
0
 /// <summary>Смещает фигуру вниз.</summary>
 /// <returns>true в случае успеха и false - в случае неудачи.</returns>
 public bool MoveDown()
 {
     if (Current == GameShape.Zero)
     {
         return(false);
     }
     if (!MoveDown(Current))
     {
         return(false);
     }
     Current = Current.MoveDown();
     return(true);
 }
Пример #4
0
        /// <summary>Поворачивает текущую фигуру по часовой стрелке.</summary>
        /// <returns>true в случае успеха и false - в случае неудачи.</returns>
        public bool RotateFigure()
        {
            if (Current == GameShape.Zero)
            {
                return(false);
            }
            GameShape t = RotateFigure(Current);

            if (t == GameShape.Zero)
            {
                return(false);
            }
            Current = t;
            return(true);
        }
Пример #5
0
        /// <summary>Заменяет текущую фигуру на новую.</summary>
        /// <param name="newShape">Новая фигура.</param>
        /// <returns>Предыдущую фигуру или GameShape.Zero, если новую фигуру не удалось поместить.</returns>
        public GameShape ChangeFigure(GameShape newShape)
        {
            if (Current == GameShape.Zero)
            {
                return(Current);
            }
            GameShape old = Current;

            EraseFigure(old);
            if (!PlaceShape(newShape))
            {
                return(GameShape.Zero);
            }
            return(old);
        }
Пример #6
0
        /// <summary>Передвигает совокупность клеток вправо.</summary>
        /// <param name="shape">Фигура - совокупность клеток</param>
        /// <returns>Возвращается истина - если возможен дальнейший сдвиг вправо, ложь - если сдвиг не возможен</returns>
        protected bool MoveLeft(GameShape shape)
        {
            GameShape moved = shape.MoveLeft();

            shape.Type = CellType.Empty;
            SetFigure(shape, true);
            if (IsEmpty(moved))
            {
                SetFigure(moved, false);
                return(true);
            }
            shape.Type = moved.Type;
            SetFigure(shape, false);
            return(false);
        }
Пример #7
0
        /// <summary>Рисование подсказки(тени от фигуры)</summary>
        /// <param name="g"></param>
        public override void Paint(Graphics g)
        {
            base.Paint(g);

            if (!ShowTips ||
                !IsFigureFalling ||
                !Tetris.Properties.Settings.Default.ShadowShape)
            {
                return;
            }

            GameShape tip = Current;

            // временно удаляем текущую фигуру, потом всё вернём
            EraseFigure(Current);

            while (IsEmpty(tip))             // смещаем ниже, пока не натолкнёмся на препятствие
            {
                tip = tip.MoveDown();
            }

            tip = tip.MoveUp();             // натолкнулись, надо фигуру в последнее свободное место (оно выше)

            SetFigure(Current, false);      // возвращаем, как и обещалось

            Point[] cells =
            {
                new Point(tip.X0, tip.Y0), new Point(tip.X1, tip.Y1),
                new Point(tip.X2, tip.Y2), new Point(tip.X3, tip.Y3)
            };

            // подсказка прозрачным квадратом
            Brush colorShadowPen = new SolidBrush(Color.FromArgb(70, 255, 255, 255));

            foreach (Point cell in cells)
            {
                if (!IsEmpty(cell.Y, cell.X))
                {
                    continue;
                }
                // подсказка прозрачным квадратом
                g.FillRectangle(colorShadowPen, 8 + cell.X * CellSize, 8 + cell.Y * CellSize, CellSize, CellSize);
            }
        }
Пример #8
0
        /// <summary>Передвигает совокупность клеток вниз.</summary>
        /// <param name="shape">Фигура - совокупность клеток</param>
        /// <returns>Возвращается истина - если возможен дальнейший сдвиг вниз, ложь - если сдвиг не возможен</returns>
        protected bool MoveDown(GameShape shape)
        {
            GameShape moved = shape.MoveDown();

            shape.Type = CellType.Empty;
            SetFigure(shape, true);

            if (IsEmpty(moved))
            {
                // Свободно, двигаем вниз
                SetFigure(moved, false);
                return(true);
            }

            // Занято, останавливаем
            shape.Type = moved.Type;
            SetFigure(shape, false);
            return(false);
        }
Пример #9
0
        /// <summary>Помещает фигуру shape на игровую доску.</summary>
        /// <param name="shape">Фигура.</param>
        /// <param name="rewrite">Параметр = true, если нужно при любом условии перезаписать клетку игровой доски.</param>
        /// <returns>Возвращается количество клеток фигуры, которое удалось поместить на поле.</returns>
        public int SetFigure(GameShape shape, bool rewrite)
        {
            int countCellsOfShape = 4;

            if (_cells[shape.Y0, shape.X0] == CellType.Empty || rewrite)
            {
                _cells[shape.Y0, shape.X0] = shape.Type;
            }
            else
            {
                --countCellsOfShape;
            }
            if (_cells[shape.Y1, shape.X1] == CellType.Empty || rewrite)
            {
                _cells[shape.Y1, shape.X1] = shape.Type;
            }
            else
            {
                --countCellsOfShape;
            }
            if (_cells[shape.Y2, shape.X2] == CellType.Empty || rewrite)
            {
                _cells[shape.Y2, shape.X2] = shape.Type;
            }
            else
            {
                --countCellsOfShape;
            }
            if (_cells[shape.Y3, shape.X3] == CellType.Empty || rewrite)
            {
                _cells[shape.Y3, shape.X3] = shape.Type;
            }
            else
            {
                --countCellsOfShape;
            }

            return(countCellsOfShape);
        }
Пример #10
0
        /// <summary>Поворот фигуры на 90 градусов по часовой стрелке.</summary>
        /// <param name="shape">Фигура, которую нужно повернуть.</param>
        /// <returns>Возвращается повернутая фигура.</returns>
        protected GameShape RotateFigure(GameShape shape)
        {
            GameShape rotated = shape.Rotate();

            shape.Type = CellType.Empty;
            SetFigure(shape, true);
            shape.Type = rotated.Type;

            if (IsEmpty(rotated))
            {
                SetFigure(rotated, false);
                return(rotated);
            }
            // Если неудача, фигура наткнулась на препятствие,то нужно сместить её вниз
            GameShape rotated2 = rotated.MoveDown();

            if (IsEmpty(rotated2))
            {
                SetFigure(rotated2, false);
                return(rotated2);
            }
            // Вправо
            rotated2 = rotated.MoveRight();
            if (IsEmpty(rotated2))
            {
                SetFigure(rotated2, false);
                return(rotated2);
            }
            // Влево
            rotated2 = rotated.MoveLeft();
            if (IsEmpty(rotated2))
            {
                SetFigure(rotated2, false);
                return(rotated2);
            }
            // Ничего не удалось сделать
            SetFigure(shape, false);
            return(GameShape.Zero);
        }
Пример #11
0
 /// <summary>Инициализирует игровое поле.</summary>
 public PlayField(int height, int width) : base(height, width)
 {
     IsFigureFalling = false;
     ShowTips        = true;
     Current         = GameShape.Zero;
 }
Пример #12
0
 /// <summary>Очищает игровое поле.</summary>
 public override void Clear()
 {
     base.Clear();
     Current         = GameShape.Zero;
     IsFigureFalling = false;
 }
Пример #13
0
 /// <summary>Стирает фигуру с игрового поля.</summary>
 /// <param name="shape">Фигура.</param>
 protected void EraseFigure(GameShape shape)
 {
     shape.Type = CellType.Empty;
     SetFigure(shape, true);
 }