Exemplo n.º 1
0
 public void ResetGame()
 {
     Tetromino.ResetStats();
     Board = new Board(new Vector2(180, 32));
     Score = 0;
     LinesCleared = 0;
     Level = 0;
     GameSpeed = CalculateGameSpeed(Level);
     StatPieces = Tetromino.PieceList();
     Piece = Tetromino.NextPiece();
     GhostPiece = Piece.Tracer();
     PreviewPiece = Tetromino.NextPiece();
     HeldPiece = null;
     TempPiece = null;
     CanSwapHeldPiece = true;
     State = GameState.Paused;
 }
Exemplo n.º 2
0
        /* Create a tracer tetromino that only has the current rotation state copied into it */
        public Tetromino Tracer()
        {
            List<List<GridPosition>> BlockList = new List<List<GridPosition>>();
            List<GridPosition> Blocks = new List<GridPosition>();

            // Clone
            foreach(GridPosition Block in this.BlockPositions[this.RotationState]) {
                Blocks.Add(new GridPosition(Block.X, Block.Y, Color.White * 0.25f));
            }

            BlockList.Add(Blocks);

            Tetromino Ghost = new Tetromino(BlockList);

            Ghost.Position(this.BoardPosition);

            return Ghost;
        }
Exemplo n.º 3
0
        private void SwapHeldPiece()
        {
            TempPiece = Piece;

            if (HeldPiece != null)
            {
                Piece = HeldPiece;
            }
            else
            {
                Piece = PreviewPiece;
                PreviewPiece = Tetromino.NextPiece();
            }

            HeldPiece = TempPiece;
            HeldPiece.ResetPiece();
        }
Exemplo n.º 4
0
        private void StepGameLogic()
        {
            bool FastFall = Piece.FastFalling();
            Ticks++;

            // Gravity only happens some of the time
            if (Ticks % GameSpeed == 0 || FastFall)
            {
                Piece.March();
                Ticks = 0;

                // Reward dropping based on position
                if (FastFall)
                {
                    Score++;
                }
            }

            // If piece collides with the board
            if (Board.Collides(Piece.Blocks()))
            {
                Piece.Retreat();
                Board.Consume(Piece.Blocks());
                BlockLock.Play();
                Piece = PreviewPiece;
                PreviewPiece = Tetromino.NextPiece();
                CanSwapHeldPiece = true;
                switch (Board.RemoveCompletedLines())
                {
                    case 4:
                        Score += 1200 * (Level + 1);
                        LinesCleared += 4;
                        LineRemoval.Play();
                        break;
                    case 3:
                        Score += 300 * (Level + 1);
                        LinesCleared += 3;
                        LineRemoval.Play();
                        break;
                    case 2:
                        Score += 100 * (Level + 1);
                        LinesCleared += 2;
                        LineRemoval.Play();
                        break;
                    case 1:
                        Score += 40 * (Level + 1);
                        LinesCleared += 1;
                        LineRemoval.Play();
                        break;
                    default:
                    case 0:
                        break;
                }
            }

            // Look for change in level
            if (Math.Floor((decimal)(LinesCleared / 10)) != Level)
            {
                Level++;
                GameSpeed = CalculateGameSpeed(Level);
            }

            // Update the ghost piece
            GhostPiece = Piece.Tracer();
            while(!Board.Collides(GhostPiece.Blocks())) {
                GhostPiece.March();
            }
            GhostPiece.Retreat();
        }