static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); var shapeFactory = new TetrisShapeFactory(new Random()); var colorFactory = new ColorFactory(new Random()); var gameGrid = new GameGrid(8, 20); var previewGameGrid = new GameGrid(5, 5); var gameGridMgr = new GameGridShapeDecorator(gameGrid); var gameController = new GameController(gameGridMgr); var scoreManager = new ScoreManager(); Action updatePreviewPane = () => { previewGameGrid.Clear(); var nextShape = shapeFactory.PeekNext(); var nextColour = colorFactory.PeekNext(); previewGameGrid.TryAdd( Array.ConvertAll(nextShape.Points, p => new ColouredPoint(nextColour, p.Move(new Point((previewGameGrid.Width - 1) / 2, 3))))); }; var form = new TetrisForm(); form.PreviewGrid = previewGameGrid; form.GameGrid = gameGridMgr; form.GameController = gameController; form.ScoreManager = scoreManager; gameGridMgr.SetShape(shapeFactory.GetNext(), colorFactory.GetNext()); updatePreviewPane(); Timer ticky = new Timer() { Interval = 500, }; ticky.Tick += (a, b) => { if (!gameGridMgr.MoveDown()) { if (!gameGridMgr.CommitShape()) { ticky.Stop(); return; } gameGridMgr.SetShape(shapeFactory.GetNext(), colorFactory.GetNext()); updatePreviewPane(); scoreManager.ProcessShapeLanded(); } var rows = gameGridMgr.ClearFullRows(); if (rows > 0) { scoreManager.ProcessRowsRemoved(rows); } form.Refresh(); }; ticky.Start(); Application.Run(form); }