/// <summary>Сдвигает фигуру.</summary> public void DoStep() { if (Current != GameShape.Zero) { IsFigureFalling = MoveDown(Current); // пытаемся сдвинуть вниз Current = IsFigureFalling ? Current.MoveDown() : GameShape.Zero; // если фигура упала, то передвигаем указатель, иначе двигать больше некуда и фигура опустилась } else { IsFigureFalling = false; } }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); } }
/// <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); }
/// <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); }
/// <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); }
/// <summary>Инициализирует игровое поле.</summary> public PlayField(int height, int width) : base(height, width) { IsFigureFalling = false; ShowTips = true; Current = GameShape.Zero; }
/// <summary>Очищает игровое поле.</summary> public override void Clear() { base.Clear(); Current = GameShape.Zero; IsFigureFalling = false; }
/// <summary>Стирает фигуру с игрового поля.</summary> /// <param name="shape">Фигура.</param> protected void EraseFigure(GameShape shape) { shape.Type = CellType.Empty; SetFigure(shape, true); }