/// <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); }
/// <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); }
private Tetrimino(TetriminoKind tetriminoKind) { TetriminoKind = tetriminoKind; Position = tetriminoKind.InitialPosition(); Blocks = tetriminoKind.CreateBlocks(Position); }