예제 #1
0
        public static MoveContext GetRotationContext(Tetromino tetromino, bool isCounterClockwise = false)
        {
            var newMatrix        = GetRotatedMatrix(tetromino.BodyMatrix, isCounterClockwise);
            var rotatedPositions = Tetromino.GetPositions(tetromino.TopLeft, newMatrix);

            return(new MoveContext(tetromino.TopLeft, rotatedPositions, newMatrix));
        }
        public static Tetromino GenerateRandomTetromino(PositionInfo initialPosition)
        {
            TetrominoShapeType shapeType = shapeTypes[randomNumberGenerator.Next(0, shapeTypes.Length)];
            var tetromino = new Tetromino(initialPosition, shapeType);

            return(tetromino);
        }
예제 #3
0
 internal static void UpdateField(Tetromino tetromino, Brush[,] fieldMatrix)
 {
     for (int i = 0; i < tetromino.BodyPositions.Count; i++)
     {
         var position = tetromino.BodyPositions[i];
         fieldMatrix[position.Y, position.X] = tetromino.Brush;
     }
 }
예제 #4
0
 private static void RemoveTetrominoFromFieldMatrix(Tetromino tetromino, Brush[,] matrix)
 {
     for (int i = 0; i < tetromino.BodyPositions.Count; i++)
     {
         var position = tetromino.BodyPositions[i];
         matrix[position.Y, position.X] = null;
     }
 }
예제 #5
0
        private bool TryDropNewTetromino()
        {
            Tetromino tetromino = this.nextTetromino != null ? this.nextTetromino : TetrominoGenerator.GenerateRandomTetromino(new PositionInfo(3, 0));

            this.nextTetromino = TetrominoGenerator.GenerateRandomTetromino(new PositionInfo(3, 0));

            var movingContext = TetrominoMover.GetMoveContext(tetromino, MovementDirection.Down, movementSpeed);

            if (!CollisionDetector.CollisionDetected(tetromino, this.playfieldInfo.FieldMatrix, movingContext.Positions))
            {
                this.fallingTetromino = tetromino;
                return(true);
            }
            return(false);
        }
        internal static bool CollisionDetected(Tetromino tetromino, Brush[,] fieldMatrix, List <PositionInfo> updatedTetrominoPositions)
        {
            Brush[,] modifiedFieldMatrix = ExcludeFromFieldMatrix(fieldMatrix, tetromino.BodyPositions);
            int rows = modifiedFieldMatrix.GetLength(0);
            int cols = modifiedFieldMatrix.GetLength(1);

            foreach (PositionInfo position in updatedTetrominoPositions)
            {
                bool isOutsideMatrix = position.X < 0 || position.X >= cols || position.Y < 0 || position.Y >= rows;
                if (isOutsideMatrix || modifiedFieldMatrix[position.Y, position.X] != null)
                {
                    return(true);
                }
            }
            return(false);
        }
예제 #7
0
        public static MoveContext GetMoveContext(Tetromino tetromino, MovementDirection direction, int speed)
        {
            PositionInfo newTopLeft = tetromino.TopLeft;

            if (direction == MovementDirection.Down)
            {
                newTopLeft = new PositionInfo(tetromino.TopLeft.X, tetromino.TopLeft.Y + speed);
            }
            else if (direction == MovementDirection.Left)
            {
                newTopLeft = new PositionInfo(tetromino.TopLeft.X - speed, tetromino.TopLeft.Y);
            }
            else if (direction == MovementDirection.Right)
            {
                newTopLeft = new PositionInfo(tetromino.TopLeft.X + speed, tetromino.TopLeft.Y);
            }

            var context = new MoveContext(newTopLeft, Tetromino.GetPositions(newTopLeft, tetromino.BodyMatrix), tetromino.BodyMatrix);

            return(context);
        }
예제 #8
0
 public static void Move(Tetromino tetromino, Brush[,] fieldMatrix, MoveContext context)
 {
     RemoveTetrominoFromFieldMatrix(tetromino, fieldMatrix);
     tetromino.Move(context);
     UpdateField(tetromino, fieldMatrix);
 }