public Game()
        {
            Screen         = new Defs.Blocks[32, 32];
            PreviousScreen = new Defs.Blocks[32, 32];
            Field          = new Field(10, 26);

            RandomBlocksList = new List <Defs.Blocks[, ]>();
            NextBlocks       = GetRandomBlocks();
            MergeToScreen(NextBlocks, 1, 1);
            HoldBlocks = null;
            MergeToScreen(Blocks.ReplaceBlock(Blocks.GetEmptyBlocks(), Defs.Blocks.EmptyBlock, Defs.Blocks.EmptyField), 1, 6);
            MergeToScreen(Field.FieldBlocks, 6, 1, FieldScreenOffsetY);
        }
        public void Update()
        {
            var inputKey = new ConsoleKeyInfo();

            var stopwatch = new System.Diagnostics.Stopwatch();

            stopwatch.Start();
            double prevElapsed = 0;

            do
            {
                Input.Instance.Update();

                //Drawer.Clear();
                var currentElapsed = stopwatch.Elapsed.TotalMilliseconds;
                var delta          = currentElapsed - prevElapsed;
                prevElapsed = currentElapsed;

                Field.RotateBlocks        = Input.Instance.IsKeyTrigger(Input.KeyCode.Z);
                Field.ReverseRotateBlocks = Input.Instance.IsKeyTrigger(Input.KeyCode.X);
                Field.MoveLeftBlocks      = Input.Instance.IsKeyPress(Input.KeyCode.Left);
                Field.MoveRightBlocks     = Input.Instance.IsKeyPress(Input.KeyCode.Right);
                Field.MoveDownBlocks      = Input.Instance.IsKeyPress(Input.KeyCode.Down);
                Field.FallenBlocks        = Input.Instance.IsKeyTrigger(Input.KeyCode.Up);

                if (Input.Instance.IsKeyTrigger(Input.KeyCode.A))
                {
                    var swappedBlocks = Field.SwapActiveBlocks(HoldBlocks);

                    if (swappedBlocks != null)
                    {
                        HoldBlocks = swappedBlocks;
                        MergeToScreen(HoldBlocks, 1, 6);
                    }
                }

                int clearLine = Field.Step(delta);
                Score += clearLine * 100;

                MergeToScreen(Field.FieldBlocks, 6, 1, FieldScreenOffsetY);
                if (!Field.HasActiveBlock)
                {
                    var blocks = Blocks.ReplaceBlock(NextBlocks, Defs.Blocks.EmptyBlock, Defs.Blocks.EmptyField);
                    if (Field.SpawnBlock(blocks))
                    {
                        NextBlocks = GetRandomBlocks();
                        MergeToScreen(NextBlocks, 1, 1);
                    }
                    else
                    {
                        break;
                    }
                }
                Drawer.DrawDifference(Screen, PreviousScreen);
                PreviousScreen = (Defs.Blocks[, ])Screen.Clone();

                int x = Screen.GetLength(1), y = 2;
                Drawer.DrawText(x + 1, y++, "SCORE: {0}", Score);

                System.Threading.Thread.Sleep(1000 / 10);
            }while (inputKey.Key != ConsoleKey.Q);

            stopwatch.Stop();

            Drawer.Clear();

            Console.WriteLine("Your Score: {0}", Score);
            Console.ReadLine();
        }