Пример #1
0
        static void Main()
        {
            Console.CursorVisible = false;

            Console.WriteLine("HovyTetris READ THIS INSTRUCTION!" +
                              "\n\nControls : " +
                              "\n\t[ P / enter ]\t\t - set/unset pause" +
                              "\n\t[ R ]\t\t\t - restart game" +
                              "\n\t[ E / up arrow ]\t - rotate (clockwise)" +
                              "\n\t[ A / left arrow ]\t - move left" +
                              "\n\t[ D / right arrow ]\t - move right" +
                              "\n\t[ S / down arrow ]\t - move down (falling)" +
                              "\nBurn 2 lines + 1 speed (max speed - 15)" +
                              "\n\n\tTap [enter] for start!");
            Console.ReadLine();

            // текущий тик
            int currentTick = 0;
            // частота отрисовки карты
            int renderTick = 10;
            // частота обработки управления
            int controlTick = renderTick / 5;

            DrawNext();

            do
            {
                Thread.Sleep(20 - _speed);
                currentTick++;

                if (currentTick % renderTick == 0)
                {
                    currentTick = 0; // сброс таймера

                    if (_pause)
                    {
                        continue;
                    }

                    // попытка сжечь линию
                    int fillId = _field.FindFullLine();
                    if (fillId != -1)              // есть такая
                    {
                        _field.DeleteLine(fillId); // сжигаем
                        _lines++;                  // записываем в очки

                        // тут же изменяем скорость игры
                        if (_lines % 2 == 0 && _speed < 15)
                        {
                            _speed++;
                        }
                    }

                    // проверка на провал
                    if (_field.CheckContainsLine(0, '#'))
                    {
                        Console.SetCursorPosition(0, 0);
                        Console.WriteLine("YOU LOSE! Press any key for restart!");

                        Console.ReadKey(); // просим нажать любую кнопку
                        Restart();         // рестарт игры
                    }

                    // падение фигуры
                    FaillingFigure();

                    // отрисовка статистики и т.д
                    DrawStats();
                }

                if (currentTick % controlTick == 0)
                {
                    // отрисовка всего экрана
                    _field.DrawScreen();

                    // нужно повернуть фигуру
                    if (_figure.RotateLength > 0)
                    {
                        // обрабатываем поворот
                        var tempR = _field.HandleRotate(_figure);

                        // ничему не будет мешать
                        if (_field.CheckLimits(tempR, _figure.Position) &&
                            _field.CheckCollision(tempR, _figure.Position))
                        {
                            _figure.Data = tempR; // применяем поворот
                        }
                    }

                    // отрисовка падающей фигуры (отдельно)
                    _field.DrawFigure(_figure);

                    // никакую кнопку не обрабатываем
                    if (!Console.KeyAvailable)
                    {
                        continue; // выходим
                    }

                    //чтобы не писать символом на поле
                    Console.SetCursorPosition(0, 0);

                    // в зависимости от того, какую кнопку зажали
                    ConsoleKey key = Console.ReadKey().Key;

                    if (key == ConsoleKey.P || key == ConsoleKey.Enter)
                    {
                        _pause = !_pause;
                    }

                    if (_pause)
                    {
                        continue;
                    }

                    if (key == ConsoleKey.A || key == ConsoleKey.LeftArrow)
                    {
                        var pos = new Point(_figure.Position.X, _figure.Position.Y);
                        pos.X--; // смещение фигуры влево

                        if (_field.CheckLimits(_figure, pos) && _field.CheckCollision(_figure, pos))
                        {
                            _figure.Position = pos; // применяем новую позицию
                        }
                    }
                    else if (key == ConsoleKey.D || key == ConsoleKey.RightArrow)
                    {
                        var pos = new Point(_figure.Position.X, _figure.Position.Y);
                        pos.X++; // смещение фигуры вправо

                        if (_field.CheckLimits(_figure, pos) && _field.CheckCollision(_figure, pos))
                        {
                            _figure.Position = pos; // применяем новую позицию
                        }
                    }
                    else if (key == ConsoleKey.E || key == ConsoleKey.UpArrow)
                    {
                        // добавляем повороты
                        // нужное количество поворотов применится при отрисовке фигруы
                        _figure.RotateLength++;
                    }
                    else if (key == ConsoleKey.S || key == ConsoleKey.DownArrow)
                    {
                        // падение фигуры
                        FaillingFigure();
                    }
                    else if (key == ConsoleKey.R)
                    {
                        // рестартуем
                        Restart();
                    }
                }
            } while (true);
        }