예제 #1
0
        internal TryMovePieceResult TryMovePiece(TetrisState state, int rowDelta, int columnDelta)
        {
            lock (PieceMoveLock) {
                SetState(state);

                TryMovePieceResult result = new TryMovePieceResult();
                bool canMove = CanMovePiece(rowDelta, columnDelta);

                if (canMove)
                {
                    MovePiece(CurrentPiece, rowDelta, columnDelta);
                    result.Moved = true;
                }
                else
                {
                    bool tryingToMoveDown = rowDelta > 0;
                    if (tryingToMoveDown)
                    {
                        result.DeletedRows = StickPiece();
                        MakeNewPiece();
                        if (CurrentPiece == null)
                        {
                            result.IsGameEnd = true;
                        }
                    }
                }

                return(result);
            }
        }
예제 #2
0
        public TetrisState MovePieceAllTheWayDown(TetrisState state)
        {
            if (State != GameState.Running)
            {
                return(state);
            }

            TryMovePieceResult result = BoardLogic.MovePieceAllTheWayDownAndStick(state);

            AfterStickPiece(result.DeletedRows, result.IsGameEnd);
            TetrisState newState = GetState();

            return(newState);
        }
예제 #3
0
        internal TryMovePieceResult MovePieceAllTheWayDownAndStick(TetrisState state)
        {
            lock (PieceMoveLock) {
                SetState(state);

                int rowDeltaMoved = MovePieceAllTheWayDown(CurrentPiece);
                int deletedRows   = StickPiece();
                MakeNewPiece();

                TryMovePieceResult result = new TryMovePieceResult {
                    Moved       = rowDeltaMoved > 0,
                    DeletedRows = deletedRows,
                    IsGameEnd   = CurrentPiece == null
                };

                return(result);
            }
        }
예제 #4
0
        private TetrisState TryMovePiece(TetrisState state, int rowDelta, int columnDelta, bool fireEvent)
        {
            if (State != GameState.Running)
            {
                return(state);
            }

            TryMovePieceResult result = BoardLogic.TryMovePiece(state, rowDelta, columnDelta);

            AfterStickPiece(result.DeletedRows, result.IsGameEnd);
            TetrisState newState = GetState();

            if (fireEvent && (result.Moved || result.DeletedRows > 0))
            {
                StateChanged?.Invoke(newState);
            }

            return(newState);
        }