# Blow Away

## {Introduction pt. 1 @unplugged}

👻 Oh, no! Your @boardname@ is being haunted by a ghost named Haven 👻

For this tutorial, we'll learn how to blow Haven away 🌬️

![Blow away banner message](/static/mb/projects/blow-away.png)

## {Haunted ghost setup}

A wild Haven has appeared!

■ From the ``||basic:Basic||`` category, find ``||basic:show icon [ ]||`` and add it to your ``||basic:on start||`` container.  
■ Click the heart icon and set it to show a ghost.  
💡 In the ``show icon`` dropdown menu options, you can hover to see what each design is called.

```blocks
// @highlight
basic.showIcon(IconNames.Ghost)
```

---

## {Loop setup}

■ From the ``||loops:Loops||`` category, find the ``||loops:repeat [4] times||`` loop and snap it into your empty ``||basic(noclick):forever||`` container.   
💡 Why do we need a [__*repeat loop*__](#repeatLoop "repeat code for a given number of times") when we already have a ``forever`` container? Because ``forever`` has an embedded delay that we want to avoid!

```blocks
basic.forever(function () {
    // @highlight
    for (let index = 0; index < 4; index++) {
            
    }
})
```

## {Conditional setup}

Haven hates noise and will blow away if things get too loud. Let's use an [__*if statement*__](#ifstatement "if this condition is met, do something") to check for sounds.

■ From ``||logic:Logic||``, grab an ``||logic:if <true> then||`` statement and snap it into your empty ``||loops(noclick):repeat [4] times do||`` loop.  
■ Go back to ``||logic:Logic||`` to get a ``||logic:<[0] [=] [0]>||`` comparison.  
■ Snap ``||logic:<[0] [=] [0]>||`` in to **replace** the ``||logic(noclick):<true>||`` condition for your ``||logic(noclick):if then||`` statement.

```blocks
basic.forever(function () {
    // @highlight
    for (let index = 0; index < 4; index++) {
        // @highlight
        if (0 == 0) {
            
        }   
    }
})
```

## {Blow sound}

We'll be using a [__*sound threshold*__](#soundThreshold "a number for how loud a sound needs to be to trigger an event. 0 = silence to 255 = maximum noise") to act as Haven's ears.

■ From the ``||input:Input||`` category, drag ``||input:sound level||`` in to **replace** the **_left_ ``0``** of your ``||logic(noclick):<[0] [=] [0]>||`` comparison.  
■ Using the dropdown in the **middle** of ``||logic(noclick):[sound level] [=] [0]||``, change the comparison to be **``>``** (greater than).  
■ Finally, have the **right side** of the comparison say ``128`` so your full comparison reads: **``sound level > 128``**.  
💡 This means Haven will hear any sound above ``128``.

```blocks
basic.forever(function () {
    for (let index = 0; index < 4; index++) {
        // @highlight
        if (input.soundLevel() > 128) {
            
        }   
    }
})
```

## {Making variables}

Let's create some [__*variables*__](#variable "a holder for information that may change") to keep track of Haven's movement.

■  In the ``||variables:Variables||`` category, click on ``Make a Variable...`` and make a variable named ``col``.  
💡 ``col`` is short for "column".  
■  Make **another** variable and name it ``row``.

## {Displacing LEDs part 1}

To show Haven is blowing away, we want to move a random set of lights sideways.

■ Your ``||variables:Variables||`` category should now have the option to ``||variables:set [row] to [0]||``. Drag that block into your empty ``||logic(noclick):if then||`` statement.  
■ From the ``||math:Math||`` category, find ``||math:pick random [0] to [10]||`` and snap that in to **replace** the ``[0]`` in your ``||variables(noclick):set [row] to [0]||`` block.  
■ Change the maximum number from ``10`` to **``4``**.  
💡 We are setting the maximum random value to 4 because the lights on the @boardname@ are numbered 0, 1, 2, 3, and 4 for columns and rows.

```blocks
let row = 0
basic.forever(function () {
    for (let index = 0; index < 4; index++) {
        if (input.soundLevel() > 128) {
            // @highlight
            row = randint(0, 4)    
        }   
    }
})
```

## {Displacing LEDs part 2}

■ Go back into ``||variables:Variables||`` and drag out another ``||variables:set [row] to [0]||``. Place this one below the last one (at **the end**) of your `if then` statement.  
■ Using the **dropdown menu**, set the new block to read ``||variables(noclick):set [col] to [0]||``.  
■ From the ``||math:Math||`` category, grab another ``||math:pick random [0] to [10]||`` and snap that in to **replace** the ``[0]`` in your ``||variables(noclick):set [col] to [0]||`` block.  
■ Change the maximum number from ``10`` to **``4``**.  

```blocks
let col = 0
let row = 0
basic.forever(function () {
    for (let index = 0; index < 4; index++) {
        if (input.soundLevel() > 128) {
            row = randint(0, 4)   
            // @highlight
            col = randint(0, 4)         
        }   
    }
})
```

## {Conditioning on one point}

Time to move some lights around!

■ From ``||logic:Logic||``, grab another ``||logic:if <true> then||`` and snap it at the **inside and at the bottom of** your ``||loops(noclick):repeat [4] times do||`` loop, right below your ``||logic(noclick):if [sound level] [>] [128]||`` statement.  
■ From the ``||led:Led||`` category, find ``||led:point x [0] y [0]||`` and drag it in to **replace** the ``||logic(noclick):<true>||`` condition in the **new** ``||logic(noclick):if then||`` statement.  
💡 This block will test if the light is on at the the given ``x`` and ``y`` coordinate points.

```blocks
let col = 0
let row = 0
basic.forever(function () {
    for (let index = 0; index < 4; index++) {
        if (input.soundLevel() > 128) {
            row = randint(0, 4)
            col = randint(0, 4)         
        }
        // @highlight
        if (led.point(0, 0)) { }
    }
})
```

## {Unplotting and replotting LEDs}

To create the animation effect of Haven blowing away, we will turn off (or ``unplot``) a light that is on and then turn it on again (``plot`` it) in a different spot.

■ From ``||led:Led||``, grab ``||led:unplot x [0] y [0]||`` and snap it inside the **empty** ``||logic(noclick):if <point x [0] y [0]> then||`` statement.  
■ Go back to ``||led:Led||`` and get ``||led:plot x [0] y [0]||``. Snap that in **beneath** the ``||led(noclick):unplot x [0] y [0]||`` block that you just added.

```blocks
let col = 0
let row = 0
basic.forever(function () {
    for (let index = 0; index < 4; index++) {
        if (input.soundLevel() > 128) {
            row = randint(0, 4)
            col = randint(0, 4)         
        }
        // @highlight
        if (led.point(0, 0)) {
            led.unplot(0, 0)
            led.plot(0, 0)
        }
    }
})
```

## Setting variables

Notice how you have **three** blocks from the ``||led:Led||`` category. All three have ``||led(noclick):x||`` ``[0]`` and ``||led(noclick):y||`` ``[0]`` coordinates. In these **two** steps, we will set it so that every ``||led(noclick):x||`` is followed by the ``||variables:col||`` variable and every ``||led(noclick):y||`` is followed by the ``||variables(noclick):row||`` variable.  
■ From ``||variables:Variables||``, get three copies of ``||variables:col||``, and use them to **replace the ``x`` values** in the following three blocks:  
**1.** ``||led(noclick):point x [0] y [0]||``  
**2.** ``||led(noclick):unplot x [0] y [0]||``  
**3.** ``||led(noclick):plot x [0] y [0]||``  
■ Go into ``||variables:Variables||``, get three copies of ``||variables:row||``, and use them to **replace the ``y`` values** in the same three blocks.

```blocks
let col = 0
let row = 0
basic.forever(function () {
    for (let index = 0; index < 4; index++) {
        if (input.soundLevel() > 128) {
            row = randint(0, 4)
            col = randint(0, 4)         
        }
        // @highlight
        if (led.point(col, row)) {
            led.unplot(col, row)
            led.plot(col, row)
        }
    }
})
```

## {Moving LEDs}

Right now, we are unplotting and replotting in the same spot. What we want to do  is move the lights we're turning back on just a smidge to the right every time until there's nothing left on the grid.

■ From ``||math:Math||``, find the ``||math:[0] [+] [0]||`` operation and use it to **replace** ``||variables(noclick):col||`` in your ``||led(noclick):plot x [col] y [row]||`` block.  
💡 If you move your entire ``||basic(noclick):forever||`` container, you should find a greyed out ``col`` variable in your workspace.  
■ Take the greyed out ``||variables(noclick):col||`` variable (or get a new one) and use it to **replace** the **_first_ ``[0]``** so the operation reads ``||math(noclick):[col] [+] [0]||``.  
■ Replace the **_second_ ``[0]``** with **``[1]``** so the operation reads ``||math(noclick):[col] [+] [1]||``.

```blocks
let col = 0
let row = 0
basic.forever(function () {
    for (let index = 0; index < 4; index++) {
        if (input.soundLevel() > 128) {
            row = randint(0, 4)
            col = randint(0, 4)         
        }
        // @highlight
        if (led.point(col, row)) {
            led.unplot(col, row)
            led.plot(col + 1, row)
        }
    }
})
```

## {Testing in the simulator}

Check out the simulator!

■ Click on the pink bar underneath the microphone icon. Drag it above the sound number you chose (we used ``128``!) to blow Haven away.  
■ If you have a new @boardname@ (the one with the **shiny gold** logo at the top), download this code and try it out!  
💡 Blow close to the @boardname@ and watch Haven swoosh away 💨  
💡 Use your @boardname@'s reset button (it's on the back!) to bring Haven back 👻

```blocks
let col = 0
let row = 0
basic.showIcon(IconNames.Ghost)
basic.forever(function () {
    for (let index = 0; index < 4; index++) {
        if (input.soundLevel() > 128) {
            row = randint(0, 4)
            col = randint(0, 4)         
        }
        if (led.point(col, row)) {
            led.unplot(col, row)
            led.plot(col + 1, row)
        }
    }
})
```

```validation.global
# BlocksExistValidator
```