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); }
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; } }
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; } }
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); }
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); }
public static void Move(Tetromino tetromino, Brush[,] fieldMatrix, MoveContext context) { RemoveTetrominoFromFieldMatrix(tetromino, fieldMatrix); tetromino.Move(context); UpdateField(tetromino, fieldMatrix); }