pxt-calliope/docs/projects/karel.md
David Fisher d28b3fad9f Karel the LED project (#405)
* Karel the LED project

* style improvements

* Updates based on feedback
2017-05-25 21:01:00 -07:00

4.8 KiB

Karel the LED

~avatar avatar

Help Karel make LED art!

~

Karel the LED can't turn right, but he can make some great LED art!

The goal of this activity is to download the JavaScript code given below onto a board, then USE the program to introduce new students to the @boardname@. Students will not do the coding this time. They will be users to get familiar with the board.

How to play

  • A button Turn Left
    Does not draw anything just changes the direction Karel (the flashing led) is facing
  • B button Move Forward
    Moves Karel forward one step and leaves the LED on behind him
  • shake Jump
    Moves Karel forward one step without leaving the LED on behind him
  • A+B button Hide Karel
    Shows or hides Karel (the flashing LED), to be used once your artwork is complete
  • Reset button Clear the board and restart
    Restart the program and clear the board

Note, that there is no way to erase, other than restarting.

~

See if you can make each pattern below using A, B, and shake. Once you have completed a challenge press A and B at the same time to hide Karel. For patterns that you design decide which LEDs you want to turn on and then make that design with Karel.

Spiral

Right turn

Eyes

Smile

Check

First letter of your name

Figure out how to make the first letter of your name with the LEDs.

Your design!

Make something fun!

Thanks for playing with Karel the LED!

~

/**
 * Karel the LED
 * 
 * Copy this code into the JavaScript editor and program the board.
 * Use the instructions above to complete the challenges.
 */
basic.forever(() => {
    if (board.isKarelActive) {
        led.toggle(board.karelX, board.karelY)
        basic.pause(500)
    }
})
input.onButtonPressed(Button.A, () => {
    board.pressedA();
    updateLeds();
})
input.onButtonPressed(Button.B, () => {
    board.pressedB();
    updateLeds();
})
input.onGesture(Gesture.Shake, () => {
    board.shake();
    updateLeds();
})
input.onButtonPressed(Button.AB, () => {
    board.pressedAB();
    updateLeds();
})
function updateLeds() {
    for (let j = 0; j < 5; j++) {
        for (let k = 0; k < 5; k++) {
            if (board.ledState[j][k]) {
                led.plot(k, j);
            } else {
                led.unplot(k, j);
            }
        }
    }
}
const board = new Board();
enum Direction {
    UP = 0,
    LEFT,
    DOWN,
    RIGHT
}
class Board {
    public isKarelActive: boolean;
    public karelX: number;
    public karelY: number;

    public ledState: Array < Array < boolean >>;
    private karelDirection: Direction;

    constructor() {
        this.isKarelActive = true;
        this.karelX = 2;
        this.karelY = 2;
        this.karelDirection = Direction.UP;
        this.ledState =[];
        for (let i = 0; i < 5; i++) {
            this.ledState.push([false, false, false, false, false]);
        }
    }

    pressedA() {
        if (!this.isKarelActive) {
            return;
        }
        this.karelDirection = (this.karelDirection + 1) % 4;
    }

    pressedB() {
        if (!this.isKarelActive) {
            return;
        }
        this.ledState[this.karelY][this.karelX] = true;
        this.moveKarel()
    }

    shake() {
        if (!this.isKarelActive) {
            return;
        }
        this.moveKarel()
    }

    private moveKarel() {
        if (!this.isKarelActive) {
            return;
        }
        switch (this.karelDirection) {
            case Direction.UP:
            if (this.karelY > 0) {
            this.karelY -= 1;
        }
            break;
            case Direction.LEFT:
            if (this.karelX > 0) {
            this.karelX -= 1;
        }
            break;
            case Direction.DOWN:
            if (this.karelY < 4) {
            this.karelY += 1;
        }
            break;
            case Direction.RIGHT:
            if (this.karelX < 4) {
            this.karelX += 1;
        }
            break;
        }
    }

    pressedAB() {
        this.isKarelActive = !this.isKarelActive;
    }

}

about the authors

This project was contributed by Dr. David Fisher a professor at Rose-Hulman Institute of Technology. Dr. Fisher loves educational robotics and runs various outreach programming activities, including a summar camp, called Connecting with Code, which gives a @boardname@ to each participant.