Exemple #1
0
        private void ComputeCurrentPieceDifferences(TetrisState oldState, TetrisState newState, List <TetrisBrickWithPosition> diffList)
        {
            TetrisPieceWithPosition oldPieceWithPos = oldState?.CurrentPiece;
            TetrisPieceWithPosition newPieceWithPos = newState.CurrentPiece;

            AddNullsForOldPiece(diffList, oldPieceWithPos);

            if (newPieceWithPos == null)
            {
                return;
            }

            for (int row = 0; row < newPieceWithPos.Piece.MaxSize; row++)
            {
                for (int column = 0; column < newPieceWithPos.Piece.MaxSize; column++)
                {
                    int         rowRelativeToBoard    = row + newPieceWithPos.Position.Row;
                    int         columnRelativeToBoard = column + newPieceWithPos.Position.Column;
                    TetrisBrick newBrick = newPieceWithPos.Piece[row, column];

                    if (newBrick != null)
                    {
                        diffList.Add(new TetrisBrickWithPosition {
                            Brick    = (TetrisBrick)newBrick.Clone(),
                            Position = new Coordinates(rowRelativeToBoard, columnRelativeToBoard)
                        });
                    }
                }
            }
        }
Exemple #2
0
 private TetrisPieceWithPosition PreparePieceCopyForMove(TetrisPieceWithPosition piece, int rowDelta, int columnDelta)
 {
     PieceCopy.CopyFrom(piece);
     PieceCopy.Value.Position.Row    += rowDelta;
     PieceCopy.Value.Position.Column += columnDelta;
     return(PieceCopy.Value);
 }
        internal int StickPiece()
        {
            FixedBricksLogic.AddPiece(CurrentPiece);
            TetrisFixedBricksState fixedBricks = FixedBricksLogic.DeleteFullRows();

            CurrentPiece = null;
            return(fixedBricks.DeletedRows);
        }
Exemple #4
0
        internal bool CanRotatePiece(TetrisPieceWithPosition piece)
        {
            TetrisPieceWithPosition pieceCopy = PreparePieceCopyForRotate(piece);

            if (IsCollision(pieceCopy))
            {
                return(false);
            }

            return(true);
        }
Exemple #5
0
        internal bool CanMovePiece(TetrisPieceWithPosition piece, int rowDelta, int columnDelta)
        {
            TetrisPieceWithPosition pieceCopy = PreparePieceCopyForMove(piece, rowDelta, columnDelta);

            if (IsCollision(pieceCopy))
            {
                return(false);
            }

            return(true);
        }
 private void SetState(TetrisState state)
 {
     FixedBricksLogic.CopyFixedBricksFromState(state);
     if (state.CurrentPiece != null)
     {
         CurrentPiece = (TetrisPieceWithPosition)state.CurrentPiece.Clone();
     }
     else
     {
         CurrentPiece = null;
     }
 }
        int MovePieceAllTheWayDown(TetrisPieceWithPosition piece)
        {
            int rowDelta = 1;

            while (CollisionDetector.CanMovePiece(piece, rowDelta, 0))
            {
                rowDelta++;
            }

            rowDelta--;
            MovePiece(piece, rowDelta, 0);
            return(rowDelta);
        }
        private void MakeNewPiece()
        {
            TetrisPieceWithPosition pieceWithPos = MakePieceWithPosition();

            if (CollisionDetector.IsCollision(pieceWithPos))
            {
                CurrentPiece = null;
            }
            else
            {
                CurrentPiece = pieceWithPos;
            }
        }
        internal void CopyFrom(TetrisPieceWithPosition original)
        {
            int maxPieceSize = original.Piece.MaxSize;

            if (!Copies.TryGetValue(maxPieceSize, out TetrisPieceWithPosition existingCopy))
            {
                existingCopy = new TetrisPieceWithPosition {
                    Piece = new TetrisPiece(maxPieceSize)
                };
                Copies.Add(maxPieceSize, existingCopy);
            }

            existingCopy.CopyFrom(original);
            Value = existingCopy;
        }
Exemple #10
0
        internal bool IsCollision(TetrisPieceWithPosition piece)
        {
            foreach (Coordinates brickCoord in GetBrickCoordinatesRelativeToBoard(piece))
            {
                bool isLeftWallCollision   = brickCoord.Column < 0;
                bool isRightWallCollision  = brickCoord.Column >= BoardColumnCount;
                bool isBottomWallCollision = brickCoord.Row >= BoardRowCount;
                bool isFixedBrickCollision = FixedBricks.IsBrick(brickCoord.Row, brickCoord.Column);

                if (isLeftWallCollision || isRightWallCollision || isBottomWallCollision || isFixedBrickCollision)
                {
                    return(true);
                }
            }

            return(false);
        }
        private TetrisPieceWithPosition MakePieceWithPosition()
        {
            TetrisPieceWithPosition result = new TetrisPieceWithPosition();

            if (NextPiece != null)
            {
                result.Piece = NextPiece;
            }
            else
            {
                result.Piece = PieceFactory.MakePiece();
            }

            NextPiece        = PieceFactory.MakePiece();
            result.NextPiece = NextPiece;
            result.Position  = new Coordinates(0, Columns / 2);

            return(result);
        }
Exemple #12
0
        public void AddPiece(TetrisPieceWithPosition pieceWithPos)
        {
            TetrisPiece piece = pieceWithPos.Piece;

            for (int row = 0; row < piece.MaxSize; row++)
            {
                for (int column = 0; column < piece.MaxSize; column++)
                {
                    TetrisBrick brick = piece[row, column];

                    if (brick != null)
                    {
                        int rowRelativeToBoard    = row + pieceWithPos.Position.Row;
                        int columnRelativeToBoard = column + pieceWithPos.Position.Column;
                        Bricks[rowRelativeToBoard][columnRelativeToBoard] = (TetrisBrick)brick.Clone();
                    }
                }
            }
        }
Exemple #13
0
        IEnumerable <Coordinates> GetBrickCoordinatesRelativeToBoard(TetrisPieceWithPosition piece)
        {
            Coordinates coord = new Coordinates(0, 0);

            for (int column = 0; column < piece.Piece.MaxSize; column++)
            {
                for (int row = piece.Piece.MaxSize - 1; row >= 0; row--)
                {
                    bool isPieceBrick = piece.Piece[row, column] != null;

                    if (isPieceBrick)
                    {
                        coord.Row    = row + piece.Position.Row;
                        coord.Column = column + piece.Position.Column;

                        yield return(coord);
                    }
                }
            }
        }
Exemple #14
0
 private TetrisPieceWithPosition PreparePieceCopyForRotate(TetrisPieceWithPosition piece)
 {
     PieceCopy.CopyFrom(piece);
     PieceCopy.Value.Piece.Rotate90DegreesClockwise();
     return(PieceCopy.Value);
 }
 internal void MovePiece(TetrisPieceWithPosition piece, int rowDelta, int columnDelta)
 {
     piece.Position.Row    += rowDelta;
     piece.Position.Column += columnDelta;
 }
Exemple #16
0
        private static void AddNullsForOldPiece(List <TetrisBrickWithPosition> diffList, TetrisPieceWithPosition oldPieceWithPos)
        {
            if (oldPieceWithPos == null)
            {
                return;
            }

            for (int row = 0; row < oldPieceWithPos.Piece.MaxSize; row++)
            {
                for (int column = 0; column < oldPieceWithPos.Piece.MaxSize; column++)
                {
                    TetrisBrick oldBrick = oldPieceWithPos.Piece[row, column];

                    if (oldBrick != null)
                    {
                        int rowRelativeToBoard    = row + oldPieceWithPos.Position.Row;
                        int columnRelativeToBoard = column + oldPieceWithPos.Position.Column;

                        diffList.Add(new TetrisBrickWithPosition {
                            Brick    = null,
                            Position = new Coordinates(rowRelativeToBoard, columnRelativeToBoard)
                        });
                    }
                }
            }
        }