Esempio n. 1
0
        /// <summary>
        /// Moves tetrimino
        /// </summary>
        /// <param name="moveDirection">Direction of movement</param>
        /// <param name="checkCollision">Collision checker</param>
        /// <returns>True if tetrimino has moved</returns>
        public bool Move(MoveDirection moveDirection, Func <Block, bool> checkCollision)
        {
            var position = Position;

            if (moveDirection == MoveDirection.Down)
            {
                var row = position.Row + 1;
                position = new Position(row, position.Column);
            }
            else
            {
                var delta  = (moveDirection == MoveDirection.Right) ? 1 : -1;
                var column = position.Column + delta;
                position = new Position(position.Row, column);
            }

            var blocks = TetriminoKind.CreateBlocks(position, Direction);

            if (blocks.Any(checkCollision))
            {
                return(false);
            }

            Position = position;
            Blocks   = blocks;
            return(true);
        }
Esempio n. 2
0
        /// <summary>
        /// Rotates tetrimino
        /// </summary>
        /// <param name="rotationDirection">Direction of rotation</param>
        /// <param name="checkCollision">Collision checker</param>
        /// <returns>True if tetrimino has rotated</returns>
        public bool Rotation(RotationDirection rotationDirection, Func <Block, bool> checkCollision)
        {
            var count     = Enum.GetValues(typeof(Direction)).Length;
            var delta     = (rotationDirection == RotationDirection.Right) ? 1 : -1;
            var direction = (int)Direction + delta;

            if (direction < 0)
            {
                direction += count;
            }
            if (direction >= count)
            {
                direction %= count;
            }

            var adjustPattern = TetriminoKind == TetriminoKind.I ? new[] { 0, 1, -1, 2, -2 } : new[] { 0, 1, -1 };

            foreach (var adjust in adjustPattern)
            {
                var position = new Position(Position.Row, Position.Column + adjust);
                var blocks   = TetriminoKind.CreateBlocks(position, (Direction)direction);

                if (blocks.Any(checkCollision))
                {
                    continue;
                }
                Direction = (Direction)direction;
                Position  = position;
                Blocks    = blocks;
                return(true);
            }

            return(false);
        }
Esempio n. 3
0
 private Tetrimino(TetriminoKind tetriminoKind)
 {
     TetriminoKind = tetriminoKind;
     Position      = tetriminoKind.InitialPosition();
     Blocks        = tetriminoKind.CreateBlocks(Position);
 }