Ejemplo n.º 1
0
 /// <summary>Сдвигает фигуру.</summary>
 public void DoStep()
 {
     if (Current != GameShape.Zero)
     {
         IsFigureFalling = MoveDown(Current);                 // пытаемся сдвинуть вниз
         Current         = IsFigureFalling ? Current.MoveDown() : GameShape.Zero;
         // если фигура упала, то передвигаем указатель, иначе двигать больше некуда и фигура опустилась
     }
     else
     {
         IsFigureFalling = false;
     }
 }
Ejemplo n.º 2
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);
            }
        }
Ejemplo n.º 3
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);
        }
Ejemplo n.º 4
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);
        }